Power BI 子弹图:实际与预算对比

2021-11-26 11:11:36 浏览数 (2)

子弹图,常用来实际值和预算值对比,Power BI图表市场有第三方厂商提供的多种样式,功能也非常丰富。

比如xViz的,实际值、预算值、同期值都可以显示:

这些个子弹图有个共同的问题:太复杂了,不够直观。元素太多,需要一个个看图例才能理解是什么意思。

子弹图剥离外壳,核心是:实际值用条形图画,再给目标值画个线。如下图所示:

这种效果在Power BI只用一个度量值就可以完成。比第三方图表先进的是,类别标签可以加上条件格式,红色表示未达成目标,青色表示达成,一目了然。

演示数据源格式为:

图表度量值:

代码语言:javascript复制
子弹图 = 
VAR StoreCount =
    DISTINCTCOUNT ( '表'[店铺] )
VAR MaxSales =
    MAXX ( VALUES ( '表'[店铺]), [实际])
VAR MAXTarget= 
    MAXX ( VALUES ( '表'[店铺]), [目标])
VAR MAXValue=MAX(MaxSales,MAXTarget)
VAR BarTable =
    ADDCOLUMNS (
        SUMMARIZE (
'表',
'表'[店铺],
"索引", RANKX ( ALLSELECTED ( '表' ), [实际],,, DENSE )
        ),
"Rect",
"<rect rx='3' x='20' y='" & ( [索引] - 1 ) * 20 & "' width='" & 100*[实际]/ MAXValue & "' height='10' fill='DarkCyan' />",
"Text",
"<text x='18' y='"
                & ( [索引] - 1 ) * 20
                      7 & "'  text-anchor='End' font-size='6' fill='"&IF([业绩达成率]>=1,"DarkCyan","Tomato")&" '>" & [店铺]& "</text>",
"Label",
"<text x='"&21 100*[实际]/MAXValue&"' y='"
                & ( [索引] - 1 ) * 20
                      7 & "'  text-anchor='left' font-size='6' >"
                & ROUND ( [实际]/10000, 0 ) & "</text>",
"Rect_Target",
"<rect  x='"& 20 100*[目标]/ MAXValue&"' y='" & ( [索引] - 1 ) * 20 & "' width='0.5' height='10' fill='Tomato' />"
    )

VAR Bar =
    CONCATENATEX ( BarTable, [Rect] & [Text]&[Label]&[Rect_Target] )
VAR SVG = "<svg xmlns='http://www.w3.org/2000/svg' viewbox='0 0 141 "&20*StoreCount &"' >" & Bar & "</svg>"
RETURN
    SVG

度量值放入image或者HTML content显示。原理是用DAX改造SVG图形,text标签用作显示类别和数据,填充fill使用IF语句按照指标达成率切换颜色;条形用rect构造;目标线可以用line构造,此处还是用的rect,只不过细了点,看上去像一条线。

如果你觉得太简陋,可以不停的加rect,加个rect去年对比,加个rect前年对比,无穷尽,加到超过xViz那种地步。

0 人点赞