超有趣的JSecharts中国

ECharts设置X轴axisLabel自适应

2019-07-05  本文已影响100人  Nanayai

江汉曾为客,相逢每醉还。
浮云一别后,流水十年间

制作echarts的柱状图时我们发现axisLabel的长度过长时文字会堆叠在一起:

有些网站选择倾斜axisLabel来显示,或者让axisLabel完全竖直,效果都很差,我这里采用计算x轴刻度宽度的方法来进行换行处理:

echarts将柱状图分为grid,X轴Label和Y轴Label三个部分;

我们首先计算每个X轴Label大致可以显示多少个字:

var xAxisData = ["something...","something...","something...","something..."]
var gridWidth = 681; //可以根据canvas的宽度和grid的right,left,width进行计算
var fontsize = 14; //字体大小
var wordNum = parseInt((gridWidth / xAxisData.length) / fontsize);

然后在xAxis.axisLabel的formatter中设置换行:

 xAxis: {
     data: xAxisData,
     type: 'category',
     axisLabel: {
         interval: 0,
         formatter: function (value, index) {
             var strs = value.split('');
             var str = ''
             for (var i = 0, s; s = strs[i++];) {
                 str += s;
                 if (!(i % wordNum)) str += '\n';
             }
             return str
         }
     }
 }

这时我们发现如果grid的bottom默认为60,意味着x轴到canvas底部只能放下3行文字,所以我们需要调整grid的高度来放下更多的行:

计算最多有多少行,并根据最大行数设置chart容器高度:

var xAxisData = ["something...", "something...", "something...", "something..."]
var gridWidth = 681;
var fontsize = 14; //字体大小默认12px,这里设置成14可以保证label之间的间距
var wordNum = parseInt((gridWidth / xAxisData.length) / fontsize);
var maxLine = 0;
for (var i = 0; i < xAxisData.length; i++) {
    var flag = parseInt(xAxisData[i].length / wordNum) + 1;
    if (flag > maxLine) maxLine = flag;
}
//改变chart容器高度,340为dom的height减去grid的高度和top:
//此句放在echarts.init(dom)之前:
document.getElementById(id).style.height += (340 + max * 12) + "px";

设置grid的bottom:

grid: {
  bottom: (max + 1) * 12, //字体大小默认12px
}

这样设置好就可以像上图那样自适应显示

当我们使用的dataZoom工具是时候:

为了让我们的缩放grid的时候重新计算每行显示多少字体,我们可以使用监听datazoom事件来完成:

myChart.on('datazoom', function (params) {
    if (params.batch) {
        var start = params.batch[0].start;
        var end = params.batch[0].end;
    } else {
        var start = params.start;
        var end = params.end;
    }
    var cur_col_num = ((end - start) / 100) * xAxisData.length; //计算缩放后可以显示几个柱子
    wordNum = parseInt(Math.ceil((gridWidth / cur_col_num)) / 14);//重新计算wordNum
});

因为缩放的时候会触发我们设置的axisLabel的formatter,所以只要重新计算wordNum,我们的label就会随着缩放而改变每行显示的字:


上一篇下一篇

猜你喜欢

热点阅读