Echarts图表中的几个问题

12/22/2023

最近需求中用到 Echarts 的双y轴图表时遇到几个问题,有必要记录一下

一、 双y轴刻度线水平对齐问题
二、 tooltip内容过多无法完全展示问题
三、 series动态变化时,图表曲线数量错误问题

option 基础配置如下

const option = {
    title: {
        show: true,
        textstyle: {
            fontsize: 16
        },
        left:'50%',
        top:'0%'
    },
    legend:{
        show: true,
        // type:'scroll',显示图例分页(图例过多时可配置此项)
        orient: "horizontal",
        top:"30px",
        data: [] //图例 例:  ["东部地区","中部地区", ......]
    },
    tooltip: {
        trigger: 'axis',
        axisPointer: {type: ' shadow'}
    },
    dataZoom:[ //横向滚动条(可在横坐标数据量太大的时候配此项)
        {
            type:'slider',
            show:true,
            height:'10px',
            bottom:'15px'
        }
    ],
    xAxis:{
        type:'category',
        axisTick:{
            alignWidthLabel:true,
        },
        data:[]//横坐标值
    },
     yAxis:[ //两个y轴时,yAxis用数组配置
        {
            type:'value',
            name:'',//y轴名称,例 降雨量
            nameTextStyle:{
                fontsize:14
            },
            position:'left',//y轴在图表左边
            // min:0, 最小值
            // splitNumber:5  分隔数量
        },
        {
            type:'value',
            name:'',//y轴名称,例 温度
            nameTextStyle:{
                fontsize:14
            },
            position:'right',//y轴在图表左边
            // min:0, 最小值
            // splitNumber:5  分隔数量
        }
    ],
    series:[]
}

# 双y轴刻度线水平对齐问题

以上配置的双y轴左右两条 y轴 的刻度左右水平是不对齐的,可以分别给两条y轴设置最小值 (min) 、最大值 (max) 、刻度分隔数量 (splitNumber)、间隔 (interval)以保证水平对齐;其中最小值 min 一般是 0 , 刻度分隔数量 splitNumber 根据需要自定义,我这里分五份,这两项为静态配置可以在定义option基础配置的时候直接写上。

但是y轴最大值和间隔我们是不知道的,往往是从后台获取的数据,所以y轴最大值和间隔是动态变化的; 在调用接口获取数据后会给series赋值,其中series数组中的每个对象要添加一个 yAxisIndex 用来指定使用的 y 轴的 index,在单个图表实例中存在多个 y轴的时候有用。这样我们可以拿到同一条y轴的所有纵坐标数据并使用Math对象取其最大值。

series示例

series:[
    {
        name:'东部地区',//name值需要与图例名称相同
        type:'line',//图表类型
        yAxisIndex:0,
        data:[]// 例 [130,260,360,450,220]
    },
    {
        name:'中部地区',
        type:'line',//图表类型
        yAxisIndex:1,
        data:[]// 例 [200,130,260,100,300]
    }
]
//左右y轴最大值
const leftMax = Math.max(...option.series.filter(item=>item.yAxisIndex === 0).map(_item=>_item.data).flat())
const rightMax = Math.max(...option.series.filter(item=>item.yAxisIndex === 1).map(_item=>_item.data).flat())
//设置最大值和间隔
option.yAxis[0].max = leftYMax
option.yAxis[1].max = rightYMax
option.yAxis[0].interval = leftYMax / 5
option.yAxis[1].interval = rightYMax / 5

然后重新设置图表配置 myChart.setOption( option )这样就解决了上述y轴刻度线水平对齐的问题

# tooltip内容过多无法完全展示问题

鼠标移动到曲线上时会有 tooltip 显示每个图例以及对应的纵坐标值,当内容很多时,tooltip会超出图表区域,且超出的部分有时会被其他区域遮住导致看不见;
方法一:配置 tooltip.confine 属性为 true ,表示将 tooltip 框限制在图表的区域内,这样tooltip就不会超出图表,全在图表区域内展示;此配置对于内容量不是特别大时已经满足基本要求,但是数据量很大的时候显然图表区域内也不一定够完全展示;
方法二:配置 tooltip.formatter 方法,格式化输出 tooptip 的内容( 此为静态配置,在定义option基础配置的时候直接写上 ), 即

tooltip: {
    trigger: 'axis',
    axisPointer: {type: ' shadow'},
    // confine:true,让tooltip显示在图表区域内(一般在tooltip内容过多时配置此项)
    formatter: function (params){ // tootltip内容过多时格式化输出tooltip,可搭配上面confine:true一起使用
        if (params instanceof Array){
            let str = ''
            str += `${params[0].axisValue}<br/>`
            params.forEach((item, index) => {
                str +=`<span class="chart-tooltip-color" style="display:inline-block;margin-right:5px;background-color: ${item.color}; width:10px;height:10px;border-radius:100%;"></span>`
                str += `${item.seriesName} : ${item.data}`
                str += '<span style="margin-left:20px"></span>'
                str += `${index % 2 === 0 ? '<br/>' : ''}` // 一行展示2个图例,可更改
            })
            return str
        }
    }
}

# series动态变化时,图表曲线数量错误问题

第一次查询后展示四条曲线,然后改变查询参数后重新查询会重新给 option.series 赋值,数组只有两项了但还是显示了四条曲线,查看文档得知 echarts.setOption( ) 方法默认开启了跟之前设置的 option 进行合并,配置此方法的第二个参数可关闭合并 ,即 myChart.setOption( option , { notMerge:true } )