echarts折线图踩坑记录

文章详细描述了如何在ECharts折线图中实现鼠标焦点强调、定制tooltip显示内容、控制空白区域行为以及优化legend显示,包括使用emphasis、formatter和dispatchAction等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题及期望

问题期望效果
折线添加强调效果强调鼠标所指折线
tooltip.trigger='axis’时,tooltip显示所有的折线在当前x坐标的数据tooltip只显示当前鼠标所指折线的点的数据
鼠标移动到折线图空白处,所有的折线都会被强调鼠标移动到折线图空白处,不强调任何折线
折线数量过多导致legend覆盖折线图legend正常显示,与折线展示分离
legend中文本太长优化legend文本显示效果,显示固定长度内容

实现方法

强调鼠标所指折线

问题简述

折线添加强调效果

期望效果

鼠标移动到折线处,折线出现强调效果,更清晰的展示折线内容
在这里插入图片描述

代码实现

只需要给所有的serie在创建的时候后增加一个emphasis的属性

// An highlighted block
emphasis: {
	focus: 'series'
},;

更多emphasis可以实现的效果参考官方文档

tooltip只显示当前鼠标所在折线数据

问题简述

tooltip在tooltip.trigger='axis'情况下,会展示所有折线在当前鼠标所指位置x轴的数据。如下图
图1
在折线过多的情况下,会造成视觉上的混乱,找不到所需折线信息。

期望效果

仅显示鼠标所指曲线的当前位置数据
在这里插入图片描述

代码实现
// option部分,设置formatter,以自定义数据展示内容和条件
formatter:function(params){                
    var res = "";
    for (var i =0;i<params.length;i++){
        var series = params[i];                          
        if (series.seriesName == window.selectSeries){
            res = series.axisValue +"<br/>" + series.marker + series.seriesName + ":" +series.data +"<br/>";                        
            break;
        }                    
    }                
    return res;
};

// 设置鼠标mousemove事件,当鼠标移动到数据上时触发,获取其所属的seriesName
myChart.on('mousemove', function(params) {
  window.selectSeries = params.seriesName;
});

// 设置鼠标mouseout事件,当鼠标移出折线触发,避免鼠标移到空白上还有tooltip显示。
myChart.on('mouseout', function (params) {
  window.selectSeries = '';
});

参考:

鼠标在折线图空白处,不强调任何折线

问题简述

鼠标停留在折线图的空白处,所有折线都会出现强调效果。(可以通过垂直于x轴的虚线判断此时鼠标是否在折线图上)
鼠标在折线图外:
在这里插入图片描述
鼠标在某条折线上:
在这里插入图片描述
鼠标在折线图空白处:
在这里插入图片描述

期望效果

鼠标在折现空白处,取消所有折线的强调效果。保证只有鼠标指向了某个折线,才会出现折线的强调效果
在这里插入图片描述

代码实现
// option部分,设置formatter,以自定义数据展示内容和条件
 formatter:function(params){                
    if (myChart && params.length > 0) {
    	myChart.dispatchAction({
        	type: "downplay",
        	seriesName: countries,//这里注意,和参考资料不同
    	})
	    for (var i =0;i<params.length;i++){
	        var series = params[i];                          
	        if (series.seriesName == window.selectSeries){               
	            myChart.dispatchAction({
	            	type: "highlight",
	            	seriesIndex: series.seriesIndex,
	            	dataIndex: series.dataIndex
	            });
	            break;
	        }                    
	    }                
	    return res;
	}
}

// 设置鼠标mousemove事件,当鼠标移动到数据上时触发,获取其所属的seriesName
myChart.on('mousemove', function(params) {
  window.selectSeries = params.seriesName;
});

// 设置鼠标mouseout事件,当鼠标移出折线触发,避免鼠标移到空白上还有tooltip显示。
myChart.on('mouseout', function (params) {
  window.selectSeries = '';
});

这里注意非常关键的一点:

myChart.dispatchAction({
	type: "downplay",
	seriesName: countries,//这里注意,和参考资料不同
	//dataIndex: params[0].dataIndex,//这里是参考文章的写法
})

这里是通过seriesName属性来设置作用到哪条折线,seriesName支持列表参数。当使用dataIndex属性设置触发事件的作用对象时,会出现mouseover事件无法获取到折线上的数据点,以至于tooltip无法显示的问题。(设置dataIndex属性导致鼠标事件无法触发问题的原因有待进一步探究)

ECharts 中支持的图表行为,通过 dispatchAction 触发相应的事件。例如这里我们希望:
(1)指针指向空白处的时候,取消所有折线的强调效果,可以使用myChart.dispatchAction.type= 'downplay'来达成
(2)指针指向某个折线再将其高亮,可以通过myChart.dispatchAction.type= 'highlight'来达成

参考:

解决legend过多的堆叠问题

问题简述

legend中折线示例过多,导致内容重叠、标签混乱
在这里插入图片描述

期望效果

legend整齐有序美观。这里时通过增加分页的方式对标签进行整理。
在这里插入图片描述

代码实现
// 设置option中的legend属性
 legend: {
    type: 'scroll',
    orient: 'vertical',
    right: 10,
    top: 20,
    bottom: 20,
    data: data.legendData
 }

可以通过调整legend的height属性,控制每页的长度

参考:

legend文本视觉效果优化

问题简述

折线的标签中,各折线名字长度不一致,影响美观
在这里插入图片描述

期望效果

过长的文本自动增加省略号,鼠标悬浮会显示全称
在这里插入图片描述

代码实现
// 
// 格式化文本方式一
formatter: function (name) {
	return echarts.format.truncateText(name, 50, '14px Microsoft Yahei', '…');
},
// 格式化文本方式二
formatter: function (name) {
 return name.length > 17 ? name.substr(0, 17) + '...' : name
}
//开启tooltip
tooltip: {
	show: true
};

option.legend中设置其formattertooltip

参考:

完整实现

// 在echarts官网示例基础上修改得到
// https://echarts.apache.org/examples/zh/editor.html?c=line-race
$.get(
  ROOT_PATH + '/data/asset/data/life-expectancy-table.json',
  function (_rawData) {
    run(_rawData);
  }
);
function run(_rawData) {
  // var countries = ['Australia', 'Canada', 'China', 'Cuba', 'Finland', 'France', 'Germany', 'Iceland', 'India', 'Japan', 'North Korea', 'South Korea', 'New Zealand', 'Norway', 'Poland', 'Russia', 'Turkey', 'United Kingdom', 'United States'];
  const countries = [
    'Finland',
    'France',
    'Germany',
    'Iceland',
    'Norway',
    'Poland',
    'Russia',
    'United Kingdom'
  ];
  const datasetWithFilters = [];
  const seriesList = [];
  echarts.util.each(countries, function (country) {
    var datasetId = 'dataset_' + country;
    datasetWithFilters.push({
      id: datasetId,
      fromDatasetId: 'dataset_raw',
      transform: {
        type: 'filter',
        config: {
          and: [
            { dimension: 'Year', gte: 1950 },
            { dimension: 'Country', '=': country }
          ]
        }
      }
    });
    seriesList.push({
      type: 'line',
      datasetId: datasetId,
      showSymbol: false,
      name: country,
      endLabel: {
        show: true,
        formatter: function (params) {
          return params.value[3] + ': ' + params.value[0];
        }
      },
      labelLayout: {
        moveOverlap: 'shiftY'
      },
      emphasis: { focus: 'series',lineStyle: {
          shadowBlur: 10,
          shadowOffsetX: 0,
          shadowColor: 'rgba(0, 0, 0, 0.5)'
        } },
      encode: {
        x: 'Year',
        y: 'Income',
        label: ['Country', 'Income'],
        itemName: 'Year',
        tooltip: ['Income']
      }
    });
  });
  option = {
    animationDuration: 1000,
    legend: {
      type: 'scroll',
      orient: 'vertical',
      right: 10,
      // top: 20,
      bottom: '10%',
      formatter: function (name) {
      return echarts.format.truncateText(name, 50, '14px Microsoft Yahei', '…');
   },
     //开启tooltip
     tooltip: {
        show: true
     }
    },
    dataset: [
      {
        id: 'dataset_raw',
        source: _rawData
      },
      ...datasetWithFilters
    ],
    title: {
      text: 'Income of Germany and France since 1950'
    },
    tooltip: {
      order: 'valueDesc',
      trigger: 'axis',
      formatter:function(params){                
        var res = "";
        if (myChart && params.length > 0) {
        myChart.dispatchAction({
            type: "downplay",
            seriesName: countries,
            // dataIndex: params[0].dataIndex
        })
        for (var i =0;i<params.length;i++){
            var series = params[i];                          
            if (series.seriesName == window.selectSeries){
                res = series.axisValue +"<br/>" + series.marker + series.seriesName + ":" +series.data +"<br/>";                        
                myChart.dispatchAction({
                  type: "highlight",
                  seriesIndex: series.seriesIndex,
                  dataIndex: series.dataIndex
                });
                break;
            }                    
        }                
        return res;
      }
    },
    },
    xAxis: {
      type: 'category',
      nameLocation: 'middle'
    },
    yAxis: {
      name: 'Income'
    },
    grid: {
      right: 140
    },
    series: seriesList
  };
  myChart.setOption(option);
}

myChart.on('mousemove', function(params) {
  window.selectSeries = params.seriesName;
});

myChart.on('mouseout', function (params) {
  window.selectSeries = '';
});

本文所有截图和代码主题主要来自于ECharts官网示例

参考资料

  1. ECharts官方网站
  2. echarts折线图tooltip中如何仅展示鼠标当前位置相应的指标数据
  3. event事件官方文档
  4. dispatchAction图表行为官方文档
  5. echarts堆叠图tooltip中如何仅展示鼠标当前位置相应的指标数据
  6. echarts 图例文本太长、或者数量太多溢出的处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值