power BI学习-1、工作总结(持续更新,更新日期2024.5.24)

前言

        本人是一个不善于学习的人,但是如果有一个课题或者问题,我还是可以静下心来进行研究的,往往是在实用中进行学习,本文主要是记录一下自己的学习内容。

1、关于powerBI的理解。

       powerBI 是一个可视化平台,可以根据领导的喜好设计可视化任务,如果你的审美不是很好,那我们就只能练就一个坦克走过都不留痕迹的face,同时你还要能接受别人PUA的强大的精神。它可以不断的提升你的技能,在小公司的时候你可能只能接触到powerBI和excel(在小小的花园里你挖不出大的萝卜),但是在大公司的时候你可能就接触不到powerBI和excel了,你可能会需要知道什么是网关,什么是数据库,如何将多个软件进行关联。

2、最开始的时候接触的是power quary

        我这个人很老实的,我什么都会写在这里的,最开始接触的就是power quary,到现在我在excel中都不记得如何打开,可能是度娘给我了自信,每次都会问她。好多人告诉我超级表,刚开始的时候也不了解什么是超级表,现在也不知道超级表等不等于power quary(度娘告诉我说:“没有超级表的概念,那我知道之后再有人说超级表,我心里就该反应一下,其实就是通过power quary生成的表”)。我还是将度娘交的方法告诉大家吧!也方便下次我忘记了,方便查看。(点击“插入”-“表格”。 3/5 填入表格的范围,点击确定。 4/5 点击“数据”选项卡——来自表格/区域。 5/5 此时excel中的power query数据整理工具就被打开了)

3、如何判断你的powerBI的能力。

        答案:不知道。

        我是一个不能直接当面进行面试的人,性格有点内向,你当场让我给你做一个东西,放心我做不出来,我记忆力贼差,那怎么面试呢!很简单,你要看你面试的是哪中公司那个部门。根据这些信息你要去做一些准备(做什么准备呢!当然是看一些模型,看看他需要做那些类型的视图啦!)好啦就分享到这,因为我也没有这样准备过。

        正文

一、了解powerBI

power BI 官网

最详细的是了解powerBI的官网,

01.  powerBi 的功能

  • 使用AI发现见解(Copilot)
  • 汇集所有数据(power quary)
  • 将见解转换成影响(office应用)
  • 为每个数据团队提供支持(Fabric)

其中Copilot类似openAI的功能,收费的,powerBI中可以引用多种类型的数据(数据库,excel,txt,网页数据),同时powerBI也可以在office生态中使用,包括 Teams、PowerPoint、Excel 和 Power Platform)中嵌入和共享报表。Fabric中组织可以访问管理和处理数据。

Fabric功能包含很多,我自己理解的应该是包含了ETL、数据仓库等功能

二、DAX函数

01.运算符

基础运算符含义比较运算符含义逻辑运算符含义
+=等于&&
->大于||
*<小于not
/>=大于等于&字符串连接
^<=小于等于in包含
  <>不等于not in不包含

02 信息函数~lookupvalue

语法:LOOKUPVALUE( <result_columnName>, <search_columnName>, <search_value>[, <search_columnName>, <search_value>]…)

返回:一列

参数:

<result_columnName> :你想获得数据所在的表的列

<search_columnName>:你想获得数据所在的表的mapping列

<search_value>:返回值所在表中的mapping列

03.筛选函数~ related和relatedtable

语法:

        RELATED(<column>)

        RELATEDTABLE(<tableName>)

返回:

RELATED: 从另一个表返回一个相关值。

RELATEDTABLE:在由给定过滤器修改的上下文中计算表表达式。

RELATED函数是跟着关联关系使用的,我认为其是一个特殊一些的lookupvalue函数,将lookupvalue函数中的search_value参数设置为该表格的主键,

RELATEDTABLE函数目前我知道的用法就是计算多端表中含有一端表格中关联关系中值出现的次数或者行数()

04.统计函数~ ADDCOLUMNS

  • 语法:ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]…)
  • 参数:

        <table>:是要添加列的现有表格,

        <name1>:是要添加的新列的名称,

        <expression1>:是计算该列值的表达式。可以添加多个新列,每个新列都需要指定名称和表达式。

以下是一个简单的ADDCOLUMNS函数的例子:

EVALUATE
ADDCOLUMNS(
    Sales,
    "Profit Margin", DIVIDE(Sales[Profit], Sales[Revenue])
)

这个例子将Sales表格中的"Profit Margin"列添加到现有表格中,该列的值是Sales表格中每个行的Profit列值除以Revenue列值的结果。

ADDCOLUMNS函数还可以用于在现有表格的基础上创建一个新表格。以下是一个示例,该示例使用ADDCOLUMNS函数将Sales表格中的“Profit Margin”列添加到现有表格中,并将结果存储在名为“NewTable”的新表格中:

NewTable = ADDCOLUMNS(
    Sales,
    "Profit Margin", DIVIDE(Sales[Profit], Sales[Revenue])
)

这个例子将Sales表格中的“Profit Margin”列添加到NewTable中,并将新表格存储在变量NewTable中供后续使用。

通常会跟CALENDAR一起使用建立日期辅助表

05.日期和时间函数 ~CALENDAR

返回一个表,其中包含一个名为“Date”的列,其中包含一组连续的日期。日期范围是从指定的开始日期到指定的结束日期,包括这两个日期

  • 语法:CALENDAR(<start_date>, <end_date>)

ADDCOLUMNS与CALENDAR一起建立日期辅助表

日期辅助表 = 
    GENERATE(CALENDAR(date(2022,1,1),date(2025,9,30)),
    VAR currentday = [Date]
    VAR year = YEAR([Date])
    VAR quarter= "Q"& FORMAT([Date],"Q")
    VAR month = FORMAT([Date],"MM")
    VAR day  = FORMAT([Date],"DD")
    VAR weekid = WEEKDAY(currentday,2)
    RETURN ROW("年度",year,
               "季度",quarter,
               "月份",month,
               "日",day,
               "年度季度",year&quarter,
               "年度月份",year&month,
               "星期几",weekid
               )
    )

06.日期和时间函数~WEEKDAY

  • 语法:WEEKDAY(<date>, <return_type>)  

返回1到7之间的数字,用于标识日期的星期几。默认情况下,日期范围从1(星期日)到7(星期六)。

  • 参数:

        <date>日期时间格式的日期。
        应使用DATE函数,使用导致日期的表达式或其他公式的结果输入日期。
        <return_type>    确定返回值的数字:
                return_type=1,周从星期日(1)开始,到星期六(7)结束。编号为1到7. 
                return_type=2,星期一(1)开始,星期日(7)结束。
                return_type=3,周从星期一(0)开始,到星期日(6)结束。编号为1到7。

07.格式函数~ FORMAT

  • 语法:FORMAT(<value>, <format_string>[, <locale_name>])
  • 返回:计算结果为单个值的值或表达式。
  • 参数
    format_string具有格式设置模板的字符串。
    locale_name(可选)函数要使用的区域设置的名称。 可能的值为 Windows API 函数 LocaleNameToLCID() 接受的字符串。
  • 格式:
格式字符串

官方文档

= FORMAT( 12345.67, "General Number")  
= FORMAT( 12345.67, "Currency")  
= FORMAT( 12345.67, "Fixed")  
= FORMAT( 12345.67, "Standard")  
= FORMAT( 12345.67, "Percent")  
= FORMAT( 12345.67, "Scientific")

返回:

12345.67 “General Number”显示不带格式的数字 。

$12,345.67 “Currency”显示带货币区域设置格式的数字 。 此处的示例显示默认的美国货币格式。

12345.67 “Fixed”显示小数点分隔符左侧至少一位,小数点分隔符右侧两位 。

12,345.67 “Standard”显示小数点分隔符左侧至少一位,小数点分隔符右侧两位,并包括千位分隔符。 此处的示例显示默认的美国数字格式。

1,234,567.00 % “Percent”将数字显示为带格式的百分比(乘以 100),百分比符号在数字的右侧并用一个空格分隔 。

1\.23E+04 “Scientific”以科学计数法显示数字,并带有两位十进制数字 。

具有可选 locale_name 的日期/时间
= FORMAT( dt"2020-12-15T12:30:59", BLANK(), "en-US" ) 
= FORMAT( dt"2020-12-15T12:30:59", BLANK(), "en-GB" ) 
= FORMAT( dt"2020-12-15T12:30:59", "mm/dd/yyyy", "en-GB" )

返回:

12/15/2020 12:30:59 PM,其中月份在日期之前,时间为 12 小时格式。

15/12/2020 12:30:59,其中日期在月份之前,时间为 24 小时格式。

12/15/2020 12:30:59,其中月份在日期之前,时间为 24 小时格式。 由于指定了非区域设置依赖格式字符串,因此不会应用区域设置并返回非区域设置格式。

预定义的数字格式

可在 format_string 参数中指定以下预定义的数字格式:

格式说明
"General Number"显示不带千位分隔符的数字。
"Currency"显示带有千位分隔符的数字(如果适用);显示小数点分隔符右侧两位数。 输出基于系统区域设置。
"Fixed"小数点分隔符左侧至少显示一个数字,右侧至少显示两个数字。
"Standard"显示带有千位分隔符的数字,小数点分隔符左侧至少一位数,小数点分隔符右侧两位数。
"Percent"显示乘以 100 的数字,并在右侧立即附加百分号 (%);始终显示小数点分隔符右侧两位数。
"Scientific"使用标准科学表示法,提供两位有效数。
"Yes/No"如果数字是 0,则显示 No;否则,显示 Yes。
"True/False"如果数字是 0,则显示 False;否则,显示 True。
"On/Off"如果数字是 0,则显示 Off;否则,显示 On。
自定义数字格式

数字的自定义格式表达式可包含用分号分隔的一至三个部分。 如果格式字符串参数包含一个命名数字格式,则只允许有一部分。

如果使用结果为
仅一个部分格式表达式应用于所有值。
两部分第一部分应用于正值和零,第二部分应用于负值。
三部分第一部分应用于正值,第二部分应用于负值,第三部分应用于零。
"$#,##0;($#,##0)"

如果包含分号,而分号之间没有内容,则使用正值格式定义缺失部分。 例如,下面的格式用第一部分的格式显示正值和负值,如果值为零,则显示“Zero”。

"$#,##0"

如果使用分号且分号之间没有内容,则采用正值格式显示缺失的部分。

自定义数字格式字符

可在 format_string 参数中指定以下自定义数字格式字符:

字符说明
显示不带格式的数字。
(0)数字占位符。 显示一个数字或零。 如果表达式在格式字符串中出现 0 的位置有一个数字,则显示它;否则,将在该位置显示 0。如果数字的位数少于格式表达式中 0 的个数(在小数两侧),则显示前导零或尾随零。 如果小数点分隔符右侧的数字位数多于格式表达式中小数点分隔符右侧的零个数,则将该数字舍入为与零个数相同的小数位数。 如果小数点分隔符左侧的数字位数多于格式表达式中小数点分隔符左侧的零个数,则不加修改地显示额外的数字。
(#)数字占位符。 显示一个数字或不显示任何内容。 如果在格式字符串中出现 # 的位置处,表达式具有一个数字,则显示该数字;否则,在该位置处不显示任何内容。 此符号的工作原理与 0 数字占位符类似,不同之处在于,如果数字位数等于或少于格式表达式中小数点分隔符任意一侧的 # 字符数,则不会显示前导零或尾随零。
(.)小数点占位符。 在某些区域设置中,逗号用作小数点分隔符。 小数点占位符用于确定小数点分隔符左侧和右侧显示的位数。 如果格式表达式只包含此符号左侧的数字符号,则小于 1 的数字以小数点分隔符开头。 若要显示带有小数数字的前导零,请将 0 用作小数点分隔符左侧的第一个数字占位符。 在格式化的输出中用作小数点占位符的实际字符取决于系统所识别的数字格式。
(%)百分比占位符。 将表达式乘以 100, 百分比字符 (%) 插入在格式字符串中出现的位置。
(,)千位分隔符。 在某些区域设置中,句点用作千位分隔符。 千位分隔符用于在小数点分隔符左侧具有四位或更多位数的数字中分隔千位与百位。 如果格式包含由数字占位符(0 或 #)包围的千位分隔符,则指定千位分隔符的标准用法。 两个相邻千位分隔符或紧接在小数点分隔符左侧的千位分隔符(无论是否指定小数)表示“通过将数字除以 1000 来缩小数字,并根据需要进行舍入”。例如,可以使用格式字符串“##0,,”将 100,000,000 表示为 100。 小于 1,000,000 的数字显示为 0。 除紧接在小数点分隔符左侧以外的任何位置中的两个相邻千位分隔符仅被视为指定千位分隔符的使用。 在格式化的输出中用作千位分隔符的实际字符取决于系统所识别的数字格式。
(:)时间分隔符。 在某些区域设置中,其他字符可用于表示时间分隔符。 设置时间值格式时,时间分隔符用于分隔小时、分钟和秒。 在格式化的输出中用作时间分隔符的实际字符由你的系统设置来决定。
(/)日期分隔符。 在某些区域设置中,其他字符可用于表示日期分隔符。 设置日期值格式时,日期分隔符用于分隔日期、月份和年份。 在格式化的输出中用作日期分隔符的实际字符由你的系统设置来决定。
(E- E+ e- e+ )科学记数格式。 如果格式表达式在 E-、E+、e- 或 e+ 右侧至少包含一个数字占位符(0 或 #),则以科学记数法格式显示数字,并在数字及其指数之间插入 E 或 e。 右侧的数字占位符的个数决定了指数中的数字个数。 使用 E- 或 e- 在负指数旁边放置减号。 使用 E+ 或 e+ 在负指数旁边放置减号,在正指数旁边放置加号。
- + $ ( )显示文本字符。 若要显示未列出的字符,请在开头加上一个反斜杠 (\) 或用双引号 (" ") 将它括起来。
(\)显示格式字符串中的下一个字符。 若要将具有特殊含义的字符显示为文本字符,请在开头加上一个反斜杠 (\)。 不会显示反斜杠本身。 使用反斜杠与将下一个字符放在双引号中的作用是相同的。 若要显示反斜杠,请使用两个反斜杠 (\\)。 不能显示为文本字符的字符示例包括日期格式和时间格式字符(a、c、d、h、m、n、p、q、s、t、w、y、/ 和 :)、数字格式字符(#、0、%、E、e、英文逗号和句点)以及字符串格式字符(@、&、<、> 和 !)。
("ABC")显示双引号 (" ") 中的字符串。
预定义的日期/时间格式

可在 format_string 参数中指定以下预定义的日期/时间格式。 使用上述格式之外的格式时,它们会被解释为自定义日期/时间格式:

格式说明
"General Date"显示日期和/或时间。 例如,2008/3/12 上午 11:07:31。 日期显示取决于应用程序的当前区域性值。
"Long Date" 或 "Medium Date"根据你当前区域性的长日期格式显示日期。 例如,2008 年 3 月 12 日,星期三。
"Short Date"使用你当前区域性的短日期格式显示日期。 例如,2008/3/12。
"Long Time" 或使用你当前区域性的长时间格式显示时间;通常包括小时、分钟、秒。 例如,上午 11:07:31。
"Medium Time"以 12 小时格式显示时间。 例如,上午 11:07。
"Short Time"以 24 小时格式显示时间。 例如,11:07。
自定义日期/时间格式

可在 format_string 中指定以下格式字符来创建自定义日期/时间格式:

字符说明
(:)时间分隔符。 在某些区域设置中,其他字符可用于表示时间分隔符。 设置时间值格式时,时间分隔符用于分隔小时、分钟和秒。 在格式化的输出中用作时间分隔符的实际字符由你的系统设置来决定。
(/)日期分隔符。 在某些区域设置中,其他字符可用于表示日期分隔符。 设置日期值格式时,日期分隔符用于分隔日期、月份和年份。 在格式化的输出中用作日期分隔符的实际字符由你的系统设置来决定。
(\)反斜杠。 将下一个字符显示为文字字符。 因此,它不会被解释为格式字符。
(")双引号。 将显示括在双引号中的文本。 因此,它不会被解释为格式字符。
c将日期显示为 ddddd,并按此顺序将时间显示为 ttttt。 如果日期序列号没有小数部分,则只显示日期信息;如果没有整数部分,则只显示时间信息。
d将日期显示为不带前导零的数字 (1-31)。
dd将日期显示为带有前导零的数字 (01-31)。
ddd以缩写形式 (Sun–Sat) 显示日期。 已本地化。
dddd以全称形式 (Sunday–Saturday) 显示日期。 已本地化。
ddddd将日期显示为完整日期(包括日、月和年),根据用户系统的短日期格式设置进行格式化。 默认短日期格式为 mm/dd/yyyy
dddddd将日期序列号显示为完整日期(包括日、月和年),根据系统所识别的长日期设置进行格式化。 默认的长日期格式为 dddd, mmmm d, yyyy
w将一周中的天显示为数字(1 代表星期天,依次排列到 7,7 代表星期六)。
ww将一年中的周显示为数字 (1-54)。
m将月份显示为不带前导零的数字 (1-12)。 如果 m 紧接在 h 或 hh 之后,则显示分钟而不是月份。
MM将月份显示为带有前导零的数字 (01-12)。 如果 mm 紧接在 h 或 hh 之后,则显示分钟而不是月份。
mmm以缩写形式 (Jan–Dec) 显示月份。 已本地化。
mmmm以全称形式 (January–December) 显示月份。 已本地化。
q将一年中的季度显示为数字 (1-4)。
y将每年的某一日显示为数字 (1-366)。
yy将年份显示为 2 位数字 (00-99)。
yyyy将年份显示为 4 位数字 (100-9999)。
h将小时显示为不带前导零的数字 (0-23)。
hh将小时显示为带有前导零的数字(00-23)。
n将分显示为不带前导零的数字 (0-59)。
nn将分显示为带有前导零的数字(00-59)。
s将秒显示为不带前导零的数字 (0-59)。
ss将秒显示为带有前导零的数字 (00-59)。
ttttt将时间显示为完整的时间(包括小时、分钟和秒),使用系统所识别的时间格式定义的时间分隔符进行格式化。 如果选择了前导零选项,并且时间早于上午(或下午)10:00,则显示前导零。默认时间格式为 h:mm:ss
AM/PM使用 12 小时制时钟并显示大写的 AM 以及中午之前的任意小时;显示大写的 PM 以及中午到晚上 11:59 之间的任意小时。
AM/PM使用 12 小时制并为中午之前的任何小时显示小写的 AM;为中午到晚上 11:59 之间的任何小时显示小写的 PM。
A/P使用 12 小时制并为中午之前的任何小时显示大写的 A;为中午和晚上 11:59 之间的任何小时显示大写的 P。
A/P使用 12 小时制并为中午之前的任何小时显示小写的 A;为中午到晚上 11:59 之间的任何小时显示小写的 P。
AMPM使用 12 小时制,并为中午之前的任何小时显示系统定义的 AM 字符串文本;为中午和晚上 11:59 之间的任何小时显示系统定义的 PM 字符串文本。AMPM 可以为大写或小写,但显示的字符串的大小写与系统设置定义的字符串匹配。 默认格式为 AM/PM。 如果系统设置为 24 小时制,则字符串通常设置为空字符串。

日期/时间格式使用当前用户区域设置来设置字符串的格式。 例如,假设日期为 2020 年 6 月 25 日。 当使用格式字符串“m/d/yyyy”设置格式时,它将为:

  • 用户区域设置为美国 (en-US):“6/25/2020”
  • 用户区域设置为德国 (de-DE):“6.25.2020”
自定义日期/时间格式示例

以下示例使用日期/时间:2020 年 6 月 25 日星期四下午 1:23:45。 德语 (de-DE) 采用 24 小时制系统。 不存在 AM/PM 的等效项。

格式结果 (en-US)结果 (de-DE)
"c"06/25/2020 13:23:4525.06.2020 13:23:45
"d"2525
"dd"2525
"ddd"Thu应做事项
"dddd"星期四Donnerstag
"ddddd"06/25/202025.06.2020
"dddddd"Thursday, June 25, 2020Donnerstag, 25. Juni 2020
"w"55
"ww"2626
"m"66
"mm"0606
"mmm"JunJun
"mmmm"JuneJuni
"q"22
"y"177177
"yy"2020
"yyyy"20202020
"""Year"" yyyy"Year 2020Year 2020
"yyyy \Qq"2020 Q22020 Q2
"dd/mm/yyyy"2020/06/2525.06.2020
"mm/dd/yyyy"06/25/202006.25.2020
"h:nn:ss"13:23:4513:23:45
"h:nn:ss AMPM"1:23:45 PM1:23:45
"hh:nn:ss"13:23:4513:23:45
"hh:nn:ss AMPM"01:23:45 PM01:23:45
"ttttt"13:23:4513:23:45
"ttttt AMPM"13:23:45 PM13:23:45
"mm/dd/yyyy hh:nn:ss AMPM"06/25/2020 01:23:45 PM6.25.2020 01:23:45

08.统计函数~ROW

  • 语法:ROW(<name>, <expression>[[,<name>, <expression>]…])
  • 参数:
术语定义
name为列指定的名称,用双引号引起来。
表达式返回要填充的单个标量值的任何 DAX 表达式。 名称。

09.其他函数~ DATATABLE

语法:DATATABLE (ColumnName1, DataType1, ColumnName2, DataType2..., {{Value1, Value2...}, {ValueN, ValueN+1...}...})

参数:ColumnName    任何返回表的DAX表达式。
DataType    枚举包括:INTEGER,DOUBLE,STRING,BOOLEAN,CURRENCY,DATETIME
值    使用Excel语法为一维数组常量的单个参数,嵌套以提供数组数组。此参数表示将在表中的数据值集合。

datatable = DATATABLE("学号",INTEGER,
                      "姓名",STRING,
                      "英语成绩",INTEGER,
                      "数学成绩",INTEGER,
                     {
                        {01,"1",95,45},
                        {02,"2",95,45},
                        {03,"3",95,45}
                      }
                       )

       

10.统计函数 ~SELECTCOLUMNS     

  • 语法

SELECTCOLUMNS(<Table>, [<Name>], <Expression>, <Name>], …) 
  • 参数
术语定义
任何返回表的 DAX 表达式。
名称为列指定的名称,用双引号引起来。
表达式返回标量值(例如,列引用、整数或字符串值)的任何表达式。
  • 返回值

一个表,其行数与指定为第一个参数的表的行数相同。 对于每对 <Name>, <Expression> 参数,返回的表都有一列,并且每个表达式在指定的 <Table> 参数的某一行上下文中进行计算。

  • 备注

SELECTCOLUMNS 具有与 ADDCOLUMNS 相同的签名和行为,但差别在于,SELECTCOLUMNS 不从指定的 <Table> 开始,而是从空表开始,然后添加列。

在已计算的列或行级安全性 (RLS) 规则中使用时,不支持在 DirectQuery 模式下使用此函数。

selectcolumns = SELECTCOLUMNS({(1,2,3,4),(1,2,3,4),(1,2,3,4),(1,2,3,4)},"A",[value1],"B",[value2],"C",[value3],"D",[value4])

三、视图

01.py视图

在实际的应用中过程中powerBI中的视图并不能满足设计页面的需求,如果开通的pro是可以安装一些其他视图,对于会python的也可以使用python进行画图。

案例分享:

本次分享的是一个堆积柱状图和簇状图结合在一起的组合图。

使用 matplotlib和pandas

import matplotlib.pyplot as plt
import pandas as pd 

在设计页面选择py视图

就会看到上图所示的页面,将需要使用到的值放到‘添加数据“中。

加入数据之后底层的的代码如下:

# Prolog - Auto Generated #
import os, uuid, matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
import pandas

import sys
sys.tracebacklimit = 0

os.chdir(u'C:/Users/te565752/PythonEditorWrapper_bcd2ed89-be1e-43d2-b944-08302a78843c')
dataset = pandas.read_csv('input_df_855a1508-f2a3-4dfa-baed-798a9c28ae2d.csv')

matplotlib.pyplot.figure(figsize=(5.55555555555556,4.16666666666667), dpi=72)
matplotlib.pyplot.show = lambda args=None,kw=None: matplotlib.pyplot.savefig(str(uuid.uuid1()))

会使用matplotlib建立一个画布,同时也会将添加的数据整合成一个DataFrame(可以理解成一个excel中的一个sheet,已经去重的数据)此时就可以开始画图了

因为数据保密的关系还有就是比较懒,我这也假设添加数据之后形成一个DataFrame 名称为df,字段分别是A、B、C、D四列,其中A列将作为x轴,其他为y轴。

首先是数据处理

df['B'].fillna(0,inplace=True)# 如果B列中由空的值,使用0填充(inplace=True,在pandas中意思是将会在df中进行修改,如果是False则运行之后df不会进行修改)
df['C'].fillna(0,inplace=True)# 如果A列中由空的值,使用0填充
df['D'].fillna(0,inplace=True)# 如果A列中由空的值,使用0填充
df= df.dropna(subset=['A']) # 如果A列中有空值将会被剔除
df= df[(df['B'] != 0) & (df['C'] != 0) &  (df['D'] != 0)]# 删除B+C+D=0的数据
df.sort_values(by = 'D',inplace=True,ascending=False)# 按照B列中的值倒序排序,ascending=False代表是降序,True代表升序
df.reset_index(drop=True,inplace=True)#重置索引(pandas中排序是不会改变行号的,所以需要重新排一下行号,drop=True表示删除之前的行号,如果是False将会将之前的行号作为一列新增在表中)
# 绘制柱状图
fig, ax = plt.subplots(figsize=(20, 15))  # 设置画布大小,20是宽,15是高
bar_width = 0.3#这个可以设置成1以内的数值
plt.bar(df.index, df['B'], label='B', width=bar_width)#根据行号和B列画图
plt.bar(df.index, df['C'], bottom=df['B'], label='C', width=bar_width)# #根据行号和C列画图,初始位置在df['B']的值的上面
plt.bar(df.index + bar_width, df['D'], label='D', width=bar_width)#根据行号+0.3和C列画图,这里为什么增加一个常数呢!主要是为了将两个柱状图显示在两个位置,防止重叠在一起

#在柱状图内显示详细信息
# 去除边框
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)

# 设置x轴刻度和标签
xticks_num = df.index.tolist()# 获取index并将值存放在一个list中
xticks = df['A].tolist() # 获取A列的所有值并将值存放在一个list中
plt.xticks(xticks_num, xticks,size = 45)# 将x轴的刻度值由行号替换成A列的值,值的大小设置为45
plt.yticks(size = 45)# 设置y轴的刻度值的值的设置为45
# 开始设置详细信息
for i in xticks_num:
    r = f"{int(df['B'].values[i]+df['C'].values[i])}\n ({int(df['B'].values[i])}+{int(df['C'].values[i])})" # 获得一个值
    plt.text(i, df['B'].values[i]+df['C'].values[i]+3, r, ha='center', wrap=True,size=40)

    plt.text(i+0.3, df['D'].values[i]+3, int(df['D'].values[i]), ha='center', wrap=True,size=40,color='Red') # 颜色设置为红色
plt.legend(fontsize = 1,loc='upper right')# 我研究了很久对图例的大小没有影响

上述过程就是整个的设计过程,

  1. 设置详细信息的地方没有备注,主要思想,根据坐标轴中x,y的位置设置值。值可以自由编写。
  2. 对于图例不管如何设置都不能修改。.
  3. 是否可以联动,答案是是可以联动的,可以根据筛选的值画图。这里我的理解是,当你使用筛选器的时候,你添加的值其实已经跟着筛选器进行筛选了。所以可以联动。需要注意:联动其实是需要python程序重新运行的,所以由延迟。另外对于图表在设计的时候没有应用筛选器,此时的页面是根据所有数据进行绘图的,图此时是最好状态,当筛选器工作的时候,会根据筛选的内容改变,此时柱状图会变宽。
  4. 如果你运行了程序,没有显示绘制的图表,而是显示有错误(不能展示图标),大部分愿意是因为代码有问题,运行不成功。如何查看那一部分出错了呢!可以点击运行旁边的箭头符号,此时会跳转(我之前因为研究powerBI中使用py所以将powerBI与vscode进行了链接)会跳转到vscode中,然后再vscode中运行代码,查看具体出错的原因。

关于python画图,有多个包可以使用。

# Epilog - Auto Generated #
os.chdir(u'路径')

在vscode中你会看到在代码最后有# Epilog - Auto Generated #
os.chdir(u'路径'),此时就可以在路径下看到这个.py文件和运行成功后的图片。

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值