echarts折线图踩坑记录
问题及期望
问题 | 期望效果 |
---|---|
折线添加强调效果 | 强调鼠标所指折线 |
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轴的数据。如下图
在折线过多的情况下,会造成视觉上的混乱,找不到所需折线信息。
期望效果
仅显示鼠标所指曲线的当前位置数据
代码实现
// 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
中设置其formatter
和tooltip
参考:
完整实现
// 在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官网示例