瀑布图,在分析中是非常重要的图。在 Power BI 中的原生瀑布图使用起来有些问题,本文来探讨如果基于原生瀑布图的高级使用方法和限制。
在 Power BI 中的瀑布图的默认表现是这样的,如果设置:
则表现为:
这个表现可以理解。
再尝试另一种设置:
这里的更改是:加入了细目。什么意思呢?不要紧,看看表现再说,如下:
可以看出来:
这三条规律一定要记住,这是原生瀑布图不改变的内部逻辑,我们要改进瀑布图的表现时,也必须满足这个逻辑,不然无法与之适应。
再考虑一下不加入细目的情况,再看一次:
可以看出来:
可以再做一些实验,就能得到以下重要规律:
这两类规律非常重要。
现在我们提出业务上的表现诉求,再来想办法看看上述规律是否可以来满足,要求如下:
如果用 Zebra BI 的瀑布图来实现这个诉求,其效果大致如下:
Zebra BI 是可以直接在界面设置柱子的正负以及是否立地的,而且非常简单,这有利于我们理解瀑布图最轻松的设置方式。而 Power BI 原生的瀑布图是做不到的。
通过与规律对比,我们发现有一条是一定做不到的,那就是:
差异项可以自定义顺序
这点是原生瀑布图做不到的。
那么,我们就得到了一个结论:
如果不考虑差异项可以自定义顺序的场景,是可以用原生 Power BI 瀑布图做出的。
下面给出终极方案,该方案是全网首发滴。
通过上述研究,按照规律我们可以做出设计了。先来看一个效果:
没有错,这正是我们需要的。这里的业务场景是:
注意:差异项是无法自定义排序的。
差异项无法自定义排序而是默认排序,是原生瀑布图的最大限制。
假设我们接受这个限制,那么设计这样的瀑布图的通用方法是什么呢。如下给出。
用 DAX 自定义首末类别柱如下:
// 定义计算表如下
Waterfall-Begin-End-ACPY =
SELECTCOLUMNS(
{
( 1 , "Start" , "去年" ) ,
( 2 , "End" , "今年" )
} ,
"OrderBy" , [Value1] , "PointCode" , [Value2] , "PointName" , [Value3] )
这个用来作为首末端点。
用 DAX 自定义差异细项如下:
Waterfall-Body-ByIndustry =
DISTINCT( Customer[Industry] )
这个用来作为首末端点之间的内容。
这是最精妙的一步,这里存在一个非常非常重要的技巧,我们先来看 DAX 实现,如下:
Waterfall.Value.ByIndustry =
VAR vPoint = SELECTEDVALUE( 'Waterfall-Begin-End-ACPY'[PointCode] )
VAR vItem = SELECTEDVALUE( 'Waterfall-Body-ByIndustry'[Industry] )
RETURN
SWITCH( TRUE() ,
vPoint = "Start" && vItem <> BLANK() , CALCULATE( [KPI.PY] , TREATAS( { vItem } , 'Customer'[Industry] ) ) ,
vPoint = "End" && vItem <> BLANK() , CALCULATE( [KPI] , TREATAS( { vItem } , 'Customer'[Industry] ) ) ,
vPoint = "Start" , [KPI.PY],
vPoint = "End" , [KPI]
)
这里蕴含了一个技巧非常重要,我们不细细拆解这个技巧的原理,我们将其规律描述如下:
这套规律非常重要,这恰好是 Power BI 瀑布图内部在对比计算时依照的规律。
有了上述三步,我们就可以作图如下:
则可以得到效果:
非常好。
我们刚说明了限制:差异项无法自定义排序而是默认排序,是原生瀑布图的最大限制。
这在做以时间维度做差异项的时候就有些不完美,如下:
它的差异项并非是按照月份来排序的,而是按照贡献度来排序的。
也就是说:
Power BI 的原生瀑布图在设计的时候就是考虑到它对贡献度的分析。
本文彻底给出了 Power BI 中原生瀑布图的行图规律以及如何利用这些规律制作高级瀑布图以及其适用范围。
结论是:
对于此规律和结构的了解非常重要,它将回答什么图可以做,什么图不可以做,那对于不完美怎么办呢?答案是推荐使用 Zebra BI 来解决即可。
你可以复制粘贴本文 DAX 直接使用或者系统化学习《BI真经》。