#分享 , #编码
这个功能最早是看到椒盐豆豉 如何给 Hugo 博客添加热力图 做的分享,不过当时还没下定心思来弄。后来陆续在蜗牛、空白大佬们的博客上看到,还是比较想加到自己博客上的,不过在这个月十几号的时候研究过一下,当时没太研究明白,放弃了。
但是今天在长毛象上看到空白大佬在 称赞蜗牛大佬的新热力图 ,所以跑过去看了一下,发现好像的确和第一版确实不一样,遂通过蜗牛大佬的 Github仓库源码 折腾了一下午,终于弄好了,分享一下折腾经过。
Cal-heatmap
大佬新的热力图是基于 Cal-heatmap
这个工具,这是一个专门制作热力图表的JS工具包,我们只需要通过简单的配置即可生成漂亮的可定制热点图。
基本初始化
首先是引入Cal-heatmap的js库和css库,当然你可以用使用CDN也可以直接下载源码到项目内。
另外大佬没有将这部分代码写在 head
里面,所以我也是照猫画虎直接在网页中需要使用的地方插入。
其中悬浮提示插件、日历插件可以根据需求引入。
其次添加一个 script
代码标签,之后的业务逻辑、初始化等代码都写在这个里面。
然后再添加一个 id
为 cal-heatmap
的 div
容器,用于存放生成的热力图。
<!-- 基础图表库 -->
<script src="https://d3js.org/d3.v7.min.js"></script>
<!-- cal-heatmap 核心库-->
<script src="https://unpkg.com/cal-heatmap/dist/cal-heatmap.min.js"></script>
<!-- 样式库 -->
<link rel="stylesheet" href="https://unpkg.com/cal-heatmap/dist/cal-heatmap.css">
<!-- 悬浮提示插件 -->
<script src="https://unpkg.com/@popperjs/core@2"></script>
<script src="https://unpkg.com/cal-heatmap/dist/plugins/Tooltip.min.js"></script>
<!-- 日历标签插件 -->
<script src="https://unpkg.com/cal-heatmap/dist/plugins/CalendarLabel.min.js"></script>
<script>
// 这里写逻辑代码
</script>
<!-- 容器代码 -->
<div id="cal-heatmap"></div>
数据初始化
热力图是一种将数据图表化的一种形式,所以我们也需要给它提供一定量的数据,而在博客中,我们一般都是用于展示每个月的文章更新频次。
Cal-heatmap支持多种形式的数据,如:json
、csv
、text
等,这边蜗牛大佬使用的是 json
格式,并直接将数据通过模板生成在了网页之上,而我使用的是一个用于数据索引的,包含全站文章信息的 json
文件。
其实,这里你可以用你能做到的任何形式将数据定义、引用到页面中。
当然,蜗牛大佬的方式应该效率更好一些,我之后可能也会使用这种方法。
不过无论你使用那种形式,都推荐组成以下形式的 json
数据,其中 word_count
用于在最后的热力图上展现不同的颜色时作为判断依据使用。
Cal-heatmap绘制
为了便于理解,我大概说一下Cal-heatmap的组成形式。
(我下午弄的时候想了好久🤣)
- 黄色框框为主数据,既下方配置中的
domain
,一般是以年或月为单位 - 红色框框内的小格子为单项数据,既下方配置中的
subDomain
,一般是以天、小时、星期为单位 - 下方截图就是由一个年为单位的domain和不同天的subDomain组合而成。
开始正式初始化热力图。
这部分代码比较散乱,相关说明我直接写在代码片断的备注中。
定义样式
同时,你还可以使用css定义一些热力图中的样式。
.ch-plugin-calendar-label{
position: absolute;
top: 20px;
left: 30px;
gutter: 5px;
}
/** 周几初标签部分样式 **/
.ch-plugin-calendar-label-text{
fill: var(--gray-500) !important;
font-size: 12px !important;
transform: translate(6px, 0px);
}
/** 隐藏月份信息 **/
.ch-domain-text{
display: none;
}
/* 修改小方块的背景填充颜色 */
[data-theme=dark] .ch-subdomain-bg {
fill: var(--gray-200);
}
结束
God Job!恭喜你,至此你应该已经成功完成了热力图的绘制!
本文大多都是个人基于Cal-heatmap官方文档+ChatGTP理解,如有错漏请指正。
加入评论