Power BI表格/矩阵展示迷你着色地图
前面的文章介绍了SVG地图在Power BI中的用法:用于Power BI的SVG省市地图(带数据标签,含下载)。借助Synoptic Panel这个第三方图表可以方便的实现SVG地图展现,并带有数据标签。

本文讲解SVG地图在Power BI的另外一种用法,在表格或者矩阵中展示迷你着色地图。效果如下:

该用法有三个优点:
- 无需加载第三方图表,Power BI默认的表格或者矩阵均可使用。
- 占用画布体积小,仅仅相当于一个单元格的位置,可以批量展示。
- 公式驱动,可以当作指标达成指示灯的升级版,例如绿色表示该地区指标达成,红色表示未达成。
那么如何实现?本文以各省各城市业绩达成迷你着色地图举例。
1.SVG地图导入Power BI
本案例我们同时需要很多地图,而不是一个,所以采用批量导入的方式。将准备好的SVG地图存放在同一文件夹。

在Power BI中选择-获取数据-从文件夹:

在Power Query后台,无法直接读取SVG中的数据。

已知SVG格式可以用记事本打开,如下图所示,我们需要的其实就是里面的文本。

所以,添加自定义列,使用Text.FromBinary这个函数将SVG当作文本提取出来。

生成的结果如下图所示:

另外准备好省份城市对照表,和销售数据,并导入Power BI,如下图所示:


三个表如下建立关系:

2.省份业绩达成迷你着色地图
使用Related函数将SVG地图代码从地图资源列表导入到省份城市对照表中。此处我们其实仅仅准备了省份地图,为的是一图两用,当查看整个省达成的时候,整张地图作为一个整体,当查看某个城市的时候,选择地图中的相应城市区域进行着色。

一般情况下,我推荐这样的选择。因为读者一般对省份轮廓和城市位置比较清楚,而对单个城市的轮廓概念比较模糊。例如,我们可能清楚延安在陕西省北部,西安在陕西省中部。但是可能对延安、西安的轮廓形状没有认知。当然,如果你一定省市分别使用相应层级的地图也可以,准备好相关地图资源即可(本公众号wujunmin后台回复SVG地图有下载提示)。

用记事本打开一份地图,会发现有个共同点,每个城市均有个fill字段,后面是颜色代码。本例使用的地图是一种灰色,这意味着,我们只需将业绩达成和这个颜色相关联,即可达到变换颜色的目的。

以下是完整的度量值,当业绩达成率大于100%,将灰色替换为绿色,否则替换为红色:
省份达成地图 = VAR Province = SELECTEDVALUE ( '省份城市对照表'[省份] )VAR SVG = SELECTEDVALUE ( '省份城市对照表'[SVG] )VAR SVG_Color =IF ( [业绩达成率] >= 1, SUBSTITUTE ( SVG, "#D3D3D3", "#217346" ), SUBSTITUTE ( SVG, "#D3D3D3", "#B7472A" ) )RETURN"data:image/svg+xml;utf8," & SVG_Color
将该度量值放到表格中,即实现下图的效果。

3.城市业绩达成迷你着色地图
省份达成是对SVG文件中的所有颜色进行替换,城市只能替换局部。再次使用记事本打开地图文件,查看每个城市对应的颜色如何识别。本文使用的地图具有以下代码规则:城市后面是" fill="接着就是颜色代码。

因此,需要实现的效果是,当选择某一城市时,仅仅变更该城市后面的颜色代码。完整度量值如下:
城市达成地图 = VAR City = SELECTEDVALUE ( '省份城市对照表'[城市] )VAR SVG = SELECTEDVALUE ( '省份城市对照表'[SVG] )VAR SVG_Color = IF ( [业绩达成率] >= 1, SUBSTITUTE ( SVG, City & """" & " fill=" & """" & "#D3D3D3", City & """" & " fill=" & """" & "#217346" ), SUBSTITUTE ( SVG, City & """" & " fill=" & """" & "#D3D3D3", City & """" & " fill=" & """" & "#B7472A" ) )RETURN"data:image/svg+xml;utf8," & SVG_Color
如果你使用的SVG地图代码不是以上规律也没有关系,只要识别你的文件规律并替换公式相应部分即可。最后得到以下结果:

这里我们将省份和城市分别计算以便展示他们的不同逻辑,实际应用也可以将两个度量值融合到一起。
示例文件下载: