使用 DAX 改进 Power BI 中的时序折线图
本文翻译自Marco Russo的文章——《Improving temporal line charts in Power BI with DAX 》,本文介绍了在Power BI中如何使用DAX改进X轴基于日期的折线图,以及如何正确进行数据建模和可视化展现。
Power BI中的折线图是一种用于展示实时事件的实用可视化工具,但是,折线图会在应用于日粒度时呈现最佳效果。为了达到其他粒度级别的最佳可视化,我们必须更改数据模型并编写DAX表达式。下文中所涉及的操作有:
- 控制分类折线图的属性
- 使用月粒度和季度粒度连续折线图
- 实现周粒度
- 在选择月份、季度和年份时,隐藏不完整的周数
使用时态数据管理分类折线图
在分析解决方案之前,我们需要将问题仔细阐述清楚。在演示模型中,日期表的层级包含年份、季度、月份,如果你在构建销售额(Sales Amount)的折线图时将其层级放于轴上,则会获得如下结果:
在示例模型中,我们使用的是自定义的日期表。然而,如果我们在Power BI中使用Auto Date/Time选项,结果几乎是一样的。折线图中轴上的层次结构使得PowerBI显示出第一个层级,即年份。可以看见,图中只包含三个点,但用户往往需要更多点才能得出有用信息。
当你使用自定义的日期表时,属性如下图所示:
在下面的截图中,点击下钻按钮,它可以导航到轴属性层级中的下一级。
通过下钻可显示季度级别的数据,该模型通过使用包含季度和年份的字符串来定义数据,从而使季度列在不同年份具有唯一性。然而显示的结果似乎过于冗余,每个数据点上的年份都重复出现了两次。
通过重复下钻操作,我们可导航到日期表层次结构的月份级别。
上图中的结果令人不解,因为X轴上每个数据点标签的年份都重复了三次。然而,没有年份属性的季度或月份列并不能彻底解决问题。图表中的每个点上依然会有重复的年份。
有一个不完全的解决方案是在下图所示的可视化折线图的X轴上的“连接标签”选项,将其禁用。
下图中显示的结果只是稍作改动,便从季度和月份级别上移除了年份从而改善了阅读体验,但很难想象如何在同一图表中显示超过三年的内容。实际上,当存在过多标签时。Power BI为每个点创建了一个只展示部分报告的滚动条(即使下一份图表中的季度和月份级别上仍然出现年份数字)。
最后一个可视化显示了36个点,若增加年份将使其在单个可视化中无法读取。此外,若将图表扩展到以周为单位显示,则需要为每年设置52个点,同样的问题再次产生:过多的点,过多的标签。
到现在为止,因为数据需用字符串显示,所以我们使用的都是分类折线图。折线图还提供了一种名为连续型的可视化类型,它需要轴属性为数字列或日期列。连续折线图的轴显示的标签数量较少,这是因为缺少的标签可根据与现有标签的距离来推断。连续折线图也对日期列起到特殊的管理作用,即显示简化的Year-Month标签。举个例子,在下图中,度量值与之前一样,但这次使用的是连续折线图。标签之间的距离可通过网格线来判断,这个方法也适用于判断可见轴标签之间的距离。
因为该轴现在有来自日期表中的的日期列,则可将折线图属性中的X轴区域的类型属性设置为连续型,只有日期和数字可以与连续折线图一起使用。此外,网格线属性也已启用,它也是同一X轴区域的一部分。
虽然连续折线图改善了标签的处理,但我们只能被迫使用日粒度。这将导致折线图中包含1000个点,然而更重要的是,这很可能不是用户想要展示的粒度。使用月粒度或周粒度可以获得更好的信息。我们将在下一节中展示如何通过使用DAX代码修改数据模型来克服该问题的限制性。
使用月粒度和季度粒度连续折线图
正如上一节所示,连续折线图仅适用于数字列。日期列在内部作为数字进行管理,并且折线图会以智能方式来显示日期。如果X轴上的点太多,则需要压缩同一可视化中的所有数据点,连续折线图不再需要水平滚动条。当以不同的粒度(如月粒度和季度粒度)来呈现数据时,这一方法同样很实用。
换句话说,为了使用连续折线图,你需要在轴上使用日期列。然而,如果使用像月份和季度这样较低的粒度时,用于切片的列通常是代表月份或季度的字符串。这种情况下,似乎只能放弃连续折线图从而被迫使用分类折线图(及其所有约束),但事实并非如此。
解锁不同时间段的连续类需使用日期列显示所需的粒度,该日期列将整个周期聚合为单个日期。更简便的方法是在周期本身的最后一个日期聚合整个周期。举个例子,我们可在日期表中建立如下两个计算列。
我们在此采用两种不同的技术,Year-Month计算列使用DAX函数EOMONTH计算月末,这适用于任何标准日历表。
并且,此处用于计算Year-Quarter计算列的技术对于自定义日历或月份以外的粒度同样有效:只需在筛选上下文中使用ALLEXCEPT保留一列或多列所需标识的周期,使用单列表示所需粒度始终可行。然而,如果该季度并非每年都是独一无二的,那我们就不用建立 Year Quarter Number 列, 我们需要建立的是
ALLEXCEPT ( 'Date', 'Date'[Year],'Date'[Quarter Number] )
下图显示了连续折线图在轴属性中使用Year-Month列的结果,我们专门为该图表启用了数据标签和X轴 / 标题属性。
将轴属性中的日期列替换为Year-Quarter列后,图表的粒度以季度划分,唯一需要注意的是,在默认情况下,工具提示会显示使用日期(季度末)作为其本身的一个标签。解决方法是用如MMMM yyyy这样的格式表示季末列和月末列。但是,周期末不会明确呈现粒度是按月还是按季度划分,因此展示在X轴中启用标题可视化的粒度极其重要,我们也使用了月粒度去启用之前的折线图计算(下图不适用于下载的示例文件中的MMMM yyyy格式)。
如图所见,使用日期来表示月份和季度是解锁连续可视化类型的有用技能,下一节所述的是如何以周粒度呈现数据。
使用周粒度连续折线图
由于周数不同于月份、季度及年份,我们需要根据同一周的所有日期对一周的粒度进行分组,在日期表中我们创建了两个计算列:
- YearWeekNumber计算出一个序列号来表示自参考日期以来的周数。而DAX表达式中的FirstDayOfWeek变量用来定义一周中的第一天,YearWeekNumber 计算列可以隐藏起来。
- Week使用先前展示过的技术计算季度的最后一天(包含一周中的最后一天)——按上一步计算的YearWeekNumber列对日期进行分组。
下图显示了在轴上使用Week列的结果:
当以周级别显示数据时,每年会有52个数据点。上一个图表有156个数据点,这对限制该图表的日期范围可能很奏效。但是,如果不是标准的ISO周历,那么所选周期的第一周和最后一周的数据很可能会缺损。下一节将介绍如何在标准日历中管理该条件。
在可视化中隐藏不完整的周数
当日期选择折线图中不完整的时间段时,常常导致可视化效果不佳。如下图所示,我们选择了2008年2月到6月之间的销售情况。该范围内,第一周和最后一周是不完整的,相对于折线图的其他部分来说只是一个小数字——似乎已经低于Y轴上设置的最小值(1,000,000)。
该可视化模型呈现数据时可提供更多正在进行的操作的相关详细信息。
第一行截至于2月2日的那一周,因此销售额仅包括了两天(2月1日和2日),而不考虑当周(1月27日至31日)其他五天的销售情况。与上周相同,该周包括了6月29日和30日的销售数据,但不包括当周(7月1日至5日)剩余五天的销售额。 这也解释了为什么尽管月份切片器仅包括截至2008年6月的日期,但该报告却包括截至2008年7月的一周。
我们还可以创建一个度量值来从计算中删除不完整的周数,类似的技巧还可适用于不完整的月份和季度,如以下代码所示。
现在,折线图可视化可使用新的度量值来删除第一个和最后一个数据点,呈现更多可靠的数据。
在将模型可视化中的Sales Amount度量值与Sales Amount complete weeks度量值进行比较时,后者的操作会更加清晰。
新的度量值会为两个不完整的周返回一个空白值,此外,Sales Amountcomplete weeks度量值中使用的筛选技术同样适用于所有层级;它仅包括完整的周数而不需要数周的昂贵迭代来获得正确的结果。该结果对于按周计算平均值很有用,否则如果使用常规的Sales Amount度量值时,将会因为不完整周数的存在而导致数据不可靠。
总结
本文介绍了几种在折线图的X轴上用不同粒度的Date表来改进度量可视化的技术,这些技术可以适用于任何非标准日历。更重要的一点是,通过使用DAX对数据模型稍作改动,我们可以解决现有可视化的某些条件限制。
原文链接:
(https://www.sqlbi.com/articles/improving-temporal-line-charts-in-power-bi-with-dax/)
-
PowerPivot工坊原创文章,转载请注明出处!
如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。
长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~
Power Pivot工坊
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)