五分钟搞懂ECharts中X轴刻度标签的显示问题

9,133 阅读4分钟

在我们的日常echarts开发中,经常会遇到 X轴显示不全的问题,解决方法很多,下边我来总结一下(踩过的坑),供小伙伴们参考。

一:问题场景

问题一:

每一个的刻度标签都太长或者要显示的刻度标签数目过多,但是需要把所有的文本全部展示出来。

刻度标签角度倾斜

刻度标签换行

问题二:

当X轴数目过多的时候,需要坐标轴的刻度标签有间隔的显示。

有间隔的显示

有间隔并且均匀的显示

二:解决方法

基础代码

// #index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>X轴显示不全</title>
    // 通过 cdn 库引用 echarts
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.3.1/dist/echarts.min.js"></script>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      html,
      body {
        width: 100%;
        height: 100%;
        background: #000000;
      }
      .echarts {
        width: 100%;
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div class="echarts"></div>
    <script src="./index.js"></script>
  </body>
</html>
// #index.js

let chartDom = document.querySelector('.echarts'); 
let myChart = echarts.init(chartDom); 
let option; 
// 模拟数据 
let DataList = [   ['00:00', _random()],   ['00:15', _random()],   ['00:30', _random()],   ['00:45', _random()],   ['01:00', _random()],   ['01:15', _random()],   ['01:30', _random()],   ['01:45', _random()],   ['02:00', _random()],   ['02:15', _random()],   ['02:30', _random()],   ['02:45', _random()],   ['03:00', _random()],   ['03:15', _random()],   ['03:30', _random()],   ['03:45', _random()],   ['04:00', _random()],   ['04:15', _random()],   ['04:30', _random()],   ['04:45', _random()],   ['05:00', _random()],   ['05:15', _random()],   ['05:30', _random()],   ['05:45', _random()],   ['06:00', _random()],   ['06:15', _random()],   ['06:30', _random()],   ['06:45', _random()],   ['07:00', _random()],   ['07:15', _random()],   ['07:30', _random()],   ['07:45', _random()],   ['08:00', _random()],   ['08:15', _random()],   ['08:30', _random()],   ['08:45', _random()],   ['09:00', _random()],   ['09:15', _random()],   ['09:30', _random()],   ['09:45', _random()],   ['10:00', _random()],   ['10:15', _random()],   ['10:30', _random()],   ['10:45', _random()],   ['11:00', _random()],   ['11:15', _random()],   ['11:30', _random()],   ['11:45', _random()],   ['12:00', _random()],   ['12:15', _random()],   ['12:30', _random()],   ['12:45', _random()],   ['13:00', _random()],   ['13:15', _random()],   ['13:30', _random()],   ['13:45', _random()],   ['14:00', _random()],   ['14:15', _random()],   ['14:30', _random()],   ['14:45', _random()],   ['15:00', _random()],   ['15:15', _random()],   ['15:30', _random()],   ['15:45', _random()],   ['16:00', _random()],   ['16:15', _random()],   ['16:30', _random()],   ['16:45', _random()],   ['17:00', _random()],   ['17:15', _random()],   ['17:30', _random()],   ['17:45', _random()],   ['18:00', _random()],   ['18:15', _random()],   ['18:30', _random()],   ['18:45', _random()],   ['19:00', _random()],   ['19:15', _random()],   ['19:30', _random()],   ['19:45', _random()],   ['20:00', _random()],   ['20:15', _random()],   ['20:30', _random()],   ['20:45', _random()],   ['21:00', _random()],   ['21:15', _random()],   ['21:30', _random()],   ['21:45', _random()],   ['22:00', _random()],   ['22:15', _random()],   ['22:30', _random()],   ['22:45', _random()],   ['23:00', _random()],   ['23:15', _random()],   ['23:30', _random()],   ['23:45', _random()],   ['24:00', _random()] ]; let Data = _format(DataList);

 // console.log(DataList);
let Data = _format(DataList);

option = {
  grid: {
    containLabel: true
  },
  xAxis: {
    type: 'category',
    axisLine: {
      show: true,
      lineStyle: {
        color: '#fff',
        width: 2
      }
    },
    axisTick: {
      show: false
    },
    axisLabel: {
      show: true,
      color: '#fff',
      fontSize: 30
    },
    data: Data[0]
  },
  yAxis: {
    type: 'value',
    axisLine: {
      show: false
    },
    axisTick: {
      show: false
    },
    axisLabel: {
      show: true,
      color: '#fff',
      fontSize: 30
    },
    splitLine: {
      show: true,
      lineStyle: {
        color: '#fff',
        width: 1,
        type: 'dashed'
      }
    }
  },
  series: [
    {
      data: Data[1],
      type: 'bar'
    }
  ]
};

option && myChart.setOption(option);

/**
 * 生成 0-100 的随机数
 * @returns 随机数
 */
function _random() {
  return Math.round(Math.random() * 100);
}

/**
 * 格式化数据,行列装换
 * @param {*} data 
 * @returns 
 */
function _format(data) {
  let one = [];
  let two = [];
  data.forEach(function (item) {
    one.push(item[0]);
    two.push(item[1]);
  });
  return [one, two];
}

针对问题一的解决方案:

1.使用 xAxis.axisLabel.rotate 设置刻度标签旋转的角度,旋转的角度从 -90 度到 90 度,仅在类目轴中有效。

option = {
    xAxis: {
            ...
            // 标签角度转换
            rotate: 45
        },
        data: Data[0]
    }
}

2.使用 xAxis.axisLabel.formatter 函数写法设置文本换行。

option = {
    xAxis: {
           ...
           formatter: (value, index) => { 
               // 字符串换行 
               return value.replace(/(.{3})/g, '$1\n');       
           },
        },
        data: Data[0]
    }
}

针对问题二的解决方案:

1.使用 xAxis.axisLabel.interval 设置坐标轴刻度标签的显示间隔,可以设置成 0 强制显示所有标签,仅在类目轴中有效。

option = { 
    ... 
    xAxis: { 
        ... 
        axisLabel: {
        ... 
        // interval 可以定义成数字,但这也会有一个弊端,在不确定数据量的时候,间隔数不好定义,不能随心所欲的控制所要展示的内容 
        interval: 13, 
        }, 
        data: Data[0] 
    } 
}

2.使用 xAxis.axisLabel.interval 的函数写法控制刻度标签的显示隐藏,仅在类目轴中有效。 JavaScript

自动换行

option = {
    ...
    xAxis: {
        ...
        axisLabel: {
            ...
           interval: (index, value) => {
                // 每逢索引 8 的倍数显示(规则可自定义,只在类目轴中有效)
                // 此处返回 true 和 false
                return index % 8 == 0;
           },
        },
        data: Data[0]
    }
}

3.使用 xAxis.axisLabel.formatter 的函数写法自定义刻度标签的显示隐藏,可作用于所有轴类型。

option = {
    ...
    xAxis: {
        ...
        axisLabel: {
            ...
           formatter: (value, index) => {
                // 每逢索引 8 的倍数显示(规则可自定义,在所有轴类型中有效)
                // 此处返回要显示的文本
                return index % 8 == 0 ? value : '';
           },
        },
        data: Data[0]
    }
}

参考:

[1] ECharts官方网站:echarts.apache.org/zh/option.h…

总结

小伙伴们快来举一反三呀。如有更好的想法,欢迎评论区留言。