PowerBI 实现超多系列对比分析 - 下篇 - 方案实现
共 1040字,需浏览 3分钟
·
2021-01-29 12:44
前情回顾,在上一篇我们说明了:(动画)
该图表反应了多个系列,且满足特性:
多达 60 个系列的同时显示
端点处的数字显示
颜色的对齐
本文讨论其实现。
业务逻辑
该模型可以反应随着时间的发展,多品牌,多SKU,多地区等表示任何多系列的元素的发展。
表征发展情况的指标称为:发展索引值。
这些内容是先于数据模型而存在的一种打分,可以预先准备,也可以由数据模型计算得到。
我们准备再写一篇文章,来研究索引值的计算。
本文先假设这些索引值已经存在,其结构大致如下:
期初,这些索引值都是100,随着时间的推移,业务的发展,索引值将按照某种业务逻辑变化扩张,这个内容我们后续在下篇文章来讨论。
图表结构设计
由于一开始考虑到的对图表的要求:
多达 60 个系列的同时显示
端点处的数字显示
颜色的对齐
要考虑如何设计图表的显示更加专业。
很多 Power BI 和 DAX 的初学者常犯一个错误,那就是:
企图用一个图的简单默认设置或一个度量值的简单编写就实现在其大脑中模糊的需求。
这是 Power BI 和 DAX 初学者很严重的问题,不但无法实现诉求,还会陷入错误的习惯。
为实现该诉求,图列系列和度量值都要单独设计,更加方便做复杂的控制。
图例的实现
图例的实现如下:
Legend =
VAR _table_base =
ADDCOLUMNS(
ADDCOLUMNS(
SELECTCOLUMNS(
VALUES( Data[行业名称] ) , "图例" , [行业名称]
) ,
"排序索引" ,
- [KPI.Index.ByItem.Base]
),
"ToIndex" , [排序索引]
)
VAR _table_index = SELECTCOLUMNS( _table_base , "ToIndex" , [ToIndex] )
RETURN
ADDCOLUMNS(
SUBSTITUTEWITHINDEX( _table_base , "Index" , _table_index , [ToIndex] , ASC ) ,
"TOP10" , IF( [Index] <= 9 , "Yes" , "No" )
)
这里的 _table_base
已经可以了,后面的 _table_index
和返回的表对此做了增强处理,加入了编号。
普通实现仅仅用
_table_base
即可,不需要考虑后续部分,后续部分可以参考《DAX实战》中的通用加索引详解。
得到:
先放在这里,先来实现指标的计算,再做整合。
指数的计算
对于索引指标的计算,其逻辑是:
KPI.Index.ByItem.Base =
LASTNONBLANKVALUE( VALUES( 'Calendar'[Date] ) , CALCULATE( SELECTEDVALUE( Data[指数] ) ) )
这里的计算考虑到:
指数,只有对单个 Item 才有意义。
而多个日期的指数,应该以最后一个指数不为空的日期的指数为准。
所以,这个基础计算已经不是求和的简单聚合模式,而是要考虑元素和日期两个维度来进行计算保护得到正确结果。
进一步增强,考虑到默认显示 TOP 10,可以建立度量值如下:
KPI.Index.ByItem =
IF( CALCULATE( ISFILTERED( Legend[图例] ) , ALLSELECTED( ) ) ,
[KPI.Index.ByItem.Base] ,
IF( SELECTEDVALUE( Legend[TOP10] ) = "Yes" , [KPI.Index.ByItem.Base] )
)
接下来处理图例的元素排序。
图例的排序
图例的元素排序,希望根据最后一个日期的指数进行,在已经制作的图例表中,只要设置按序排列即可,如下:
默认显示
这样,就有了默认显示,如下:
由于用户未作任何选择,根据默认度量值的计算,只会默认显示前 10 名的图例的系列。
60个系列的显示
由于可以点击图例的元素,就可以通过点击图例来控制显示,如下:
用户此时可以选择更多,如下:
此时出现问题:用户选择超过了15个,但系列并未增多,这就是一个 BUG。
解决的方法是:设置系列为显示无数据的项目。结果如下:
该 BUG 就解决了。实际我们也不知道是为什么,这是这个规律。
端点的显示
对于端点的显示,则需要一个叠图的技巧,如下:
其度量值如下:
KPI.Index.ByItem.Point =
IF( CALCULATE( ISFILTERED( Legend[图例] ) , ALLSELECTED( ) ) ,
VAR _x = MAXX( ALL( Data[日期] ) , [日期] ) RETURN IF( MAX( 'Calendar'[Date] ) = _x , [KPI.Index.ByItem.Base] ) ,
IF( SELECTEDVALUE( Legend[TOP10] ) = "Yes" ,
VAR _x = MAXX( ALL( Data[日期] ) , [日期] ) RETURN IF( MAX( 'Calendar'[Date] ) = _x , [KPI.Index.ByItem.Base] )
)
)
将两个图合并,就可以得到最终的效果了。
总结
本文给出了实现超多系列折线图对比分析的具体方法,得到:
多达 60 个系列的同时显示
端点处的数字显示
颜色的对齐
这里基于了一个假设就是指数表是提前准备好的。那么如何对一套原始的业务数据给出指数呢?大家可以自己思考尝试。我们会在补充篇,给出通用方法的尝试,并进一步揭示指数表的业务意义。
在订阅了BI佐罗讲授的《BI真经》之《BI进行时》课程区,除了可以下载本文案例,还可以观看视频讲解。
让数据真正成为你的力量
Create value through simple and easy with fun by PowerBI
Excel BI | DAX Pro | DAX 权威指南 | 线下VIP学习
扫码与PBI精英一起学习,验证码:data2021