SQLBI前几天出了一篇长文,对子弹图进行了深入的讲解。文章中有一个配图,体现了目前主流(不是全部)的自定义图表方式。借由这篇文章,我们可以对比下不同方式的优劣势。
文章链接:https://www.sqlbi.com/articles/building-bullet-charts-in-power-bi-reports/
我赞同作者的大部分观点,但不是全部。这六种自定义图表方式,从使用难度上来说,我认为
第三方视觉对象<内置视觉对象<DAX+SVG<Deneb=Python/R=JS
有人可能会问,内置视觉对象使用难度比第三方高?如果你仅仅用最基础的功能(比如只用条形图绘制条形图),当然内置视觉对象最容易。但是要把条形图改造成子弹图(或者别的图表),需要一系列技巧,而第三方的子弹图只需要拖拽。
从使用偏好上来说,我倾向于:
内置视觉对象>DAX+SVG>第三方视觉对象>JS>Deneb(Python和R不会,Deneb只略微尝试)
还是子弹图这个例子,内置条形图加各种格式设置可以搞定就不用其他。但是内置视觉对象的格式设置局限性很大,第二考虑SVG这种少量代码的方式,SVG在内置表格矩阵和新卡片图都很容易加载。
其他的自定义图表方式我很少使用,第三方视觉对象要么冗余要么不足,冗余指有一堆用不上的功能,不足指不能完全符合需要,而且影响报表速度。JS、Deneb、Python、R普遍代码很长,学习起来让人望而却步。
最后,我们跳出SQLBI的文章,使用第七种方式DAX+HTML自定义一个子弹图,度量值如下:
M.P.子弹图 =
VAR _Taget = [M.销售目标]
VAR _Actual = [M.销售业绩]
VAR _Label = SELECTEDVALUE ( '店铺资料'[城市] ) & " " & FORMAT ( [M.业绩达成率], "0%" )
VAR MaxValue =
MAXX ({
MAXX ( ALLSELECTED ( '店铺资料'[城市] ), [M.销售业绩] ),
MAXX ( ALLSELECTED ( '店铺资料'[城市] ), [M.销售目标] )},
[Value]
)
RETURN
"<p style='width:300px;white-space:nowrap;display:flex;align-items:center; '>
<span style='font-size:30px;display inline-block;background:rgba(21,21,21,0.1);width:" & _Taget / MaxValue * 300 & "px;'> </span><span style='font-size:20px;position:absolute;left:0;display:inline-block;background:deepskyblue; width:" & _Actual / MaxValue * 300 & "px;'>"& _Label & "</span><p>"
把RETURN前面的数据替换为你模型中对应的维度和指标,放入HTML Content视觉对象,得到:
仅仅十几行度量值,有时候技术并不复杂,就是需要一点脑洞。
注1:本文提到的第三方视觉对象均指单一功能视觉对象(比如表格、子弹图、折线图等),不包含自主扩展式视觉对象(Deneb可以自主扩展,众多支持HTML、SVG、JS的视觉对象也可以自主扩展)
注2:本文的观点具有个人认知的局限性,熟悉Python但是不熟悉HTML、Vega的读者可能偏好完全不同。