在表格中,每一行独立存在,上一行的内容和下一行没有交集,中间有一根看不见的线把每一行隔离开来。
但今天介绍的这一个技巧突破了这一限制,表格的上下行之间产生了关联,这就是纵向折线图。很多数据媒体偏好纵向折线图,也有不少读者问如何在Power BI实现纵向折线图(本文仅在于拓宽可能性,我并不习惯使用这种图表)。前期介绍了独立纵向折线图的制作(pbix此处下载https://t.zsxq.com/07JQzbQRj),今天展示如何在Power BI内置表格矩阵实现类似的效果。
实现的原理是DAX+SVG组合。上图展示了表格中的显示效果,使用Power BI内置的折线图画个横排效果,大家可以看到形状是一样的。
每一行的折线形状由上一行数据、本行数据和下一行数据共同决定。比如,上一行数据50,本行数据20,下一行数据80,我们大体可以判断本行的折线走向大致如下图所示:
如何在计算本行折线的时候,让图表度量值知道上一行数据和下一行数据分别是多少?这就不得不提到Power BI新出的函数OFFSET,该函数可以实现偏移计算。OFFSET的详细用法可参考佐罗老师的这篇文章:PowerBI DAX 新函数 OFFSET。如下是上一行和下一行的计算结果:
上一行 = CALCULATE([Value],OFFSET(-1,ALLSELECTED('日期表'[Date]),ORDERBY('日期表'[Date])))
下一行 = CALCULATE([Value],OFFSET(1,ALLSELECTED('日期表'[Date]),ORDERBY('日期表'[Date])))
实操过程中,度量值可能有报错提示,不用去理会。以下是纵向折线的完整度量值,新建好度量值后,标记为图像URL,拖入表格。
纵向折线图 =
VAR OffsetNext=CALCULATE([Value],OFFSET(1,ALLSELECTED('日期表'[Date]),ORDERBY('日期表'[Date])))
VAR OffsetLast=CALCULATE([Value],OFFSET(-1,ALLSELECTED('日期表'[Date]),ORDERBY('日期表'[Date])))
VAR MaxValue=MAXX(ALLSELECTED('日期表'[Date]),[Value])
VAR MinValue=MINX(ALLSELECTED('日期表'[Date]),[Value])
VAR Gap=MaxValue-MinValue
VAR r= 5
VAR X_Last= (50-2*r) *(OffsetLast-MinValue)/Gap +r
VAR X= (50-2*r) *([Value]-MinValue)/Gap + r
VAR X_Next= (50-2*r) * (OffsetNext-MinValue)/Gap + r
VAR Y_Last= -25
VAR Y= 25
VAR Y_Next= 75
VAR SVG = "data:image/svg+xml;utf8,
<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50'>
<polyline id='wujunmin'
points='"&
IF(OffsetLast<>BLANK(),X_Last &","&Y_Last&" ",BLANK())
& X &","&Y&" "&
IF(OffsetNext<>BLANK(),X_Next &","&Y_Next,BLANK())&"' " & "
stroke-width='1' stroke='black' fill='none'/>
<circle cx='"&X&"' cy='"&Y&"' r='"&r&"' fill='" &IF([Value]>=30,"DarkCyan","tomato")&"' />
</svg>"
RETURN
SVG
此时你大概率得不到正确的结果,很可能显示如下图的断裂效果。这是因为水平网格线的存在切断了连线。
将网格线的宽度调整为0之后,即可得到一条连贯的折线。另外图像高度的设置与度量值中的高度保持一致(此处为50)。
这条折线还有第二种用法,放入条件格式的图标,下图右侧是条件格式模式:
有读者可能会有疑问,日期具有连续的特性,非连续的维度是否也可以同样操作?答案是可以的。下图的店铺业绩增长率是个示例:
这条折线的圆点设置了按条件变化颜色,在这基础上还可以进行深加工,比如加上数据标签:
本文的技巧大大拓宽了Power BI表格、矩阵可视化的可能性,后续还有更多介绍,敬请期待。