在我们的数据图表中,x 轴的最后一个 label 应该是右对齐的。echarts 官方没有参数来配置这个功能,导致文字被截掉了半截。挺失望的,这种情况实在是太有需求了。在不能修改源码的情况下,我们只能通过自己手动来实现这个需求。
xAxis: { type: 'category', boundaryGap: true, data: xAxisData, axisTick: { show: false, }, axisLine: { lineStyle: { width: 1, color: '#ccc', } }, axisLabel: { color: '#89889C', showMinLabel: true, showMaxLabel: true, formatter: (() => { let currentYear = '' return (value, index) => { const year = value.substr(0, 4) const month = value.substr(4, 2) const shouldNotShowYear = index > 0 && currentYear === year const isLast = value === xAxisData[xAxisData.length - 1] const text = shouldNotShowYear ? month : year + '/' + month const label = isLast && !shouldNotShowYear ? `{a|${text}}` : text currentYear = year return label } })(), rich: { a: { width: 70, align: 'left', }, }, },
上面红色部分是关键,我们要让最后一个 label 靠右对齐,但是它受到宽度的限制,所以我们干脆来了一个宽度,直接将 label 的宽度和文字的整体高度相等,这样就可以让文字显示完整了。
但是,你可能会说,我怎么知道文字的总体宽度是多少?label 的字数可多可少,不可控啊。我会告诉你,有一个东西可以帮助你在 canvas 中获取文本的宽高,你听说过吗?通过 canvas 计算文字宽高之后,赋值给 rich 里面的 width。echarts 内部会根据你给定的宽度重新布局 x 轴文本的展示,由于我们设置了 showMaxLabel,所以,无论如何最后一个 label 都会展示,如果空间不够,它会把前一个 label 隐藏起来。