Power BI仿豆瓣读书日历型热力图
豆瓣在个人主页上提供了热力地图总结,颜色越深代表当日标记读完的书越多。方框的多少代表读书(含影音)的频率。Power BI其实也能实现类似的功能,甚至实用性上更胜一筹。本文仅以读书记录为例尝试操作。

该热力图除了用深浅颜色表示读书数量,还可以悬窗动态提示当日阅读情况,信息包含:当天是几号,截止当天全年累计读了多少本书,本月读了多少本书,并显示当天标记的图书封面。那么如何实现呢?


一、数据准备
在豆瓣个人主页的“已读”记录中,可以看到你在豆瓣标记的所有图书信息。将需要的书名、阅读日期、图片链接等信息批量下载下来。

因豆瓣对网抓有限制,该信息无法像抓取电影数据那样使用Power BI直接下载,读者需要使用其他网抓手段批量下载。如果不懂网抓也没关系,可以直接将全部页面手动复制粘贴到Excel,稍微清洗即可使用。

获得的规范数据如下图所示:

将整理好的数据导入Power BI,并对格式进行规范设置,注意“封面”字段的数据类别设置为图像URL:

“书籍链接”字段如后期需跳转豆瓣,则设置为Web URL:

二、建模
首先,新建一个日期表,包含完整年份,并添加年、月、周等必要字段。可以使用CALENDAR函数新建,也可Excel手工新建。

周指全年周排序,公式如下:
第几周 = WEEKNUM('日期表'[Date],2)
月份字段有两个,一个是自然月,一个是图表月。后续在作图的时候使用图表月,图表月的计算列公式是:
图表月 = MAXX(FILTER('日期表',EARLIER('日期表'[第几周])='日期表'[第几周]),'日期表'[月])

这样做的原因是,如上图,2020年第5周,有的日期在2月份,有的日期在1月份。如果采用自然月份作图,会产生下图中的问题:因为月份区隔,第5周被分割成了两列。因此单独设立图表月,使得跨月周取最大月份值作为唯一值。

接着,将日期表和准备好的豆瓣数据关联:

最后,新建需要的基础度量值:
数量 =DISTINCTCOUNT(data[书籍链接])
年度累计 = TOTALYTD([数量],'日期表'[Date])
月度累计 = TOTALMTD([数量],'日期表'[Date])
提示信息 = "全年累计"&[年度累计]&"本书,"&"本月累计"&[月度累计]&"本书"
三、作图
图表市场有日历热力地图Calendar Visual,加载到Power BI后,字段如下设置:


生成的热力图如下图所示:

该图表非常遗憾,只能设置显示颜色,没有更多功能。如需实现文章开始提到的悬窗信息,则需要使用矩阵实现。

如下字段设置新建矩阵:

默认的矩阵显示的是数据,热力图不需要数据,需要的是有颜色的方块。

因此,我们可以将背景色和字体设置为相同颜色,即可隐藏具体数字。

另外,颜色还有按数字大小变化的需求,新建颜色度量值,阅读数量越多,颜色越深:
颜色 =
SWITCH
( [数量], 0, "#FFFFFF", 1, "#CBECB4", 2, "#86D665", "#11AD2B" )
豆瓣的颜色代码可通过colorpix获取。点击上图条件格式中的“高级控件”,按照“颜色”度量值变化颜色。
写到这里,热力图基本做完了,但仍有个小问题,比方第6周没有读书,图表不会显示,直接从第5周跳到第7周:
这样不符合日历常识,选中“第几周”,鼠标右键,勾选“显示无数据的项目”即可避免这一问题:
接着制作悬浮页面,新建空白页,页面大小选择“工具提示”;日期和读书信息使用卡片图;书籍封面使用第三方图表Image Grid。

图表制作完成后,将该页面的“工具提示”功能打开:

返回热力图页面,“工具提示”选择刚刚设置好的“工具提示”页面:

以上即是整个制作过程。