在前不久发表的文章 Dygraphs 中 x 轴等间距实现 中,我们介绍了如何在 x 轴等间距地实现图表划线。
嗯,当间距太小的时候,在 x 轴上展示的 label 文案(我这里是时间)就会交替重叠,如下:

上图中,我选择的时间间隔是 20s ,每个灰色的竖线代表一秒
上图会产生密集恐惧症有没有~那么,我们怎么去处理这种密集的数据呢?
一开始,我还以为 Dygraphs 官网上有相关的 api 或者 options 属性去控制,帮我们优化,自己还特意在 stackoverflow 上发问 Dygraphs set x label width But too tide to see the x label text,然而并什么用...
那么,我们还可以怎么做呢?摆烂?积极需求答案?
曲线救国

既然没有文档支持,那么我们可以使用 CSS 对相关的 DOM 进行隐藏,来个曲线救国。具体思路如下:
- 查看
x 轴上label 的DOM 节点,记下其公共有的类名A - 通过
JavaScript 获取图标下的全部的类名A 文档节点 - 假设我们每个
label 的宽度是B px,图表的宽度是C px,那么我们可以得到想要的数据:每间隔Math.floor(C / B) - 1 个点来展示label 的文案(也就是其他label 的DOM 元素设置为display: none)
具体实现
上面我们已经分析了思路,我们先获取到公共有的类名:

相关的代码如下,我们将在代码中详解注解说明:
public beautifyXAxis(): void {
let widthLabel = 100; // 预设的宽度,能够容纳展示 label 的文案
// this.chartWidth 是图表的宽度,应该动态计算,因为浏览器可以伸缩
// this.resolution.getValue() 是获取到整个图表展示区间的时间,这里是我上面提到的 20s
let _pixelsPerLabel = (this.chartWidth / this.resolution.getValue() / 2) * 1000; // 计算实际的 label,其 _pixelsPerLabel 值和 this.dygraphs.options.axes.x.pixelsPerLabel 相同
if(_pixelsPerLabel >= 100) { // 大于预设值,不用做什么处理
return
}
// Math.floor 向下取整,这里不用减 1,见下 for 循环讲解
let tooTidePointNumber = Math.floor(widthLabel / _pixelsPerLabel);
// 获取到全部的 x 轴的 label 的 `DOM` 相关类集合
let classXAxis: any = document.getElementById('theChartContainer')?.getElementsByClassName('dygraph-axis-label-x') || [];
for(let i = 0; i < classXAxis.length; i++) {
// 间隔 tooTidePointNumber - 1 个点展示 x 轴 label 的文案
if(i % tooTidePointNumber == 0) {
classXAxis[i].style.display = 'block';
} else {
classXAxis[i].style.display = 'none';
}
}
}
实现的效果如下:

我们经过计算,在间隔相应的距离,才展示 x 轴的 label 文案。这样看起来,图表的 x 轴就清晰多了,妥妥地一枚小清新。
-
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏










