在网上看到个很简约的全年时间进度图表,尝试在Power BI当中实现,效果如下,上方是进度卡片,下方分十二行代表十二个月,已发生天数高亮显示。
加个播放效果,可以体验时间飞逝感
把下方度量值放入Image by CloudScope这个视觉对象即可正常显示圆点进度,制作逻辑见注释。
日期进度 =
VAR ThisYear=YEAR(TODAY())//今夕是何年
VAR CalendarTable =
ADDCOLUMNS(CALENDAR(DATE(ThisYear,1,1),DATE(ThisYear,12,31)),
"年",YEAR([Date]),
"月",MONTH([Date]),
"日",DAY([Date])
)//全年日历表
VAR t=
ADDCOLUMNS(CalendarTable,
"Circle",
"<circle cx='"&5*[日]&"' cy='"&5*[月]&"' r='1' fill='DarkTurquoise' fill-opacity='"&IF([Date]<=today(),1,0.2)&"'/>")//日历的每天加个圆圈,cx是圆心的横坐标,cy是圆心的纵坐标,r是半径,fill是填充色,公众号wujunmin,fill-opacity是透明度
VAR Chart=
"data:image/svg+xml;utf8,"&
"<svg xmlns='http://www.w3.org/2000/svg' width='160' height='65'>"&
CONCATENATEX(t,[Circle])&"
</svg> " //把所有圆串起来
RETURN
Chart
这个度量值没有使用外部数据源。上方的三个卡片比较简单,在此不做展开。
在此基础上,可以进一步优化,可以放大今天的圆点:
把度量值中的半径(r值)加个条件判断,当日期为今天时,r值返回2否则返回1。
日期进度_今天放大 =
VAR ThisYear=YEAR(TODAY())
VAR CalendarTable =
ADDCOLUMNS(CALENDAR(DATE(ThisYear,1,1),DATE(ThisYear,12,31)),
"年",YEAR([Date]),
"月",MONTH([Date]),
"日",DAY([Date])
)
VAR t=
ADDCOLUMNS(CalendarTable,
"Circle",
"<circle cx='"&5*[日]&"' cy='"&5*[月]&"' r='"&IF([Date]=TODAY(),2,1)&"' fill='DarkTurquoise' fill-opacity='"&IF([Date]<=today(),1,0.2)&"'/>")
VAR Chart=
"data:image/svg+xml;utf8,"&
"<svg xmlns='http://www.w3.org/2000/svg' width='160' height='65'>"&
CONCATENATEX(t,[Circle])&"
</svg> "
RETURN
Chart
写完上面度量值之后,我陷入了沉思,这东西有什么用?对业务有什么价值?这种展示方式占据了整个画布空间,仅仅为了显示时间进度有些得不偿失。如果放在上方,作为销售报告的一部分,可能更加实用。
上图展示了2月截止当前的进度,仅仅占据了很窄的空间,其余画布空间可以放置销售数据。这里有两个修改要点:第一,圆心的Y坐标不需要随数据变化,只有一行,X坐标随日期变化而变化;第二,每个月的日期数量不一样,图表的整体宽度width需要随着日期数量变化而变化。完整度量值如下:
日期进度_一行 =
VAR ThisYear=YEAR(TODAY())//今夕是何年
VAR ThisMonth=MONTH(TODAY())//今夕时何月
VAR CalendarTable =
ADDCOLUMNS(CALENDAR(DATE(ThisYear,ThisMonth,1),EOMONTH(DATE(ThisYear,ThisMonth,1),0)),
"月",MONTH([Date]),
"日",DAY([Date])
)//全月日历表
VAR t=ADDCOLUMNS(CalendarTable,
"Circle",
"<circle cx='"&5*[日]&"' cy='5' r='1' fill='DarkTurquoise' fill-opacity='"&IF([Date]<=today(),1,0.2)&"'/>")//日历的每天加个圆圈,cx是圆心的横坐标,cy是圆心的纵坐标,r是半径,fill是填充色,fill-opacity是透明度
VAR Chart=
"data:image/svg+xml;utf8,"&
"<svg xmlns='http://www.w3.org/2000/svg' width='"& 5* COUNTROWS(CalendarTable)+5 &"' height='10'>"&
CONCATENATEX(t,[Circle])&"
</svg> " //把所有圆串起来
RETURN
Chart
接着继续思考,这个时间进度图表能不能价值更大化?比如,不仅显示时间进度,还能显示截止当前的每天业绩达成,如下图所示:
这里改动很小,之前圆圈的颜色是固定色,切换为按业绩达成进行条件格式显示即可:
<circle cx='"&5*[日]&"' cy='5' r='1' fill='"&IF([Date]<TODAY(),IF([虚拟业绩达成]>=1,"DarkCyan","Tomato"),"Grey")&"'/>"
还有没有更多玩法?还可以改造下样式,用来查看天气中的降水分布,当天如果降雨,形状变为雨滴:
技巧在于将度量值中的形状按天气进行变化,之前形状全部是圆圈。现在当遇到雨天时,变为圆圈和三角形的结合(看上去像一滴雨),当不是雨天时,只显示一个灰色的圆圈:
IF([虚拟天气]="雨",
"<circle cx='"&5*[日]&"' cy='5' r='2' fill='DarkTurquoise'/>"&
"<polygon points='"&5*[日]-2&",5 "&5*[日]+2&",5 "&5*[日]&",1' fill='DarkTurquoise'/>",
"<circle cx='"&5*[日]&"' cy='5' r='2' fill='Grey'/>")
此处polygon通过三个点定义了一个三角形。对靠天吃饭的行业,有这么一个天气信息提示也很有帮助。
最后读者可以思考一个问题,某一天雨很大,业绩却很好,如何微调上方的度量值达到天气与业绩结合的展示目的?