在 ECharts 中,当 tooltip
的触发模式设置为 axis
(基于坐标轴触发)时,默认只会显示该坐标轴位置下所有系列的数据,而 markPoint
(标注点)的悬浮值内容可能无法直接显示。以下是实现该需求的详细方案:
一、核心问题分析
-
axis
模式的限制
tooltip.trigger: 'axis'
会触发坐标轴对应位置的所有数据项,但markPoint
作为独立标注点,默认不属于常规数据系列,其tooltip
需要单独配置。 -
markPoint
的交互特性
markPoint
的悬浮提示依赖tooltip.trigger: 'item'
,与axis
模式存在冲突,需通过混合配置或事件监听解决。
二、实现方法
方法 1:混合触发模式 + 自定义 formatter
通过动态判断 tooltip
的触发来源,合并 axis
和 markPoint
的内容:
javascript
tooltip: {
trigger: 'axis',
formatter: function (params) {
// 1. 获取坐标轴数据
let axisTip = params.map(p => `${p.seriesName}: ${p.value}`).join('<br/>');
// 2. 检查是否存在 markPoint 数据(需预先标记)
const markPointData = params.data?.markPoint; // 假设数据中存储了 markPoint 信息
if (markPointData) {
axisTip += `<br/>标注点值: ${markPointData.value}`;
}
return axisTip;
}
}
关键点 :需在数据中预先绑定 markPoint
信息,或在 formatter
中通过逻辑判断当前坐标轴位置是否存在标注点。
方法 2:事件监听 + 手动触发 tooltip
通过监听图表事件,手动控制 markPoint
的悬浮提示:
javascript
myChart.on('mousemove', (params) => {
if (params.componentType === 'markPoint') {
// 手动显示 tooltip
myChart.dispatchAction({
type: 'showTip',
seriesIndex: params.seriesIndex,
dataIndex: params.dataIndex
});
}
});
配置要求 :需在 series
中为 markPoint
启用 tooltip
:
javascript
series: [{
type: 'line',
markPoint: {
data: [{ type: 'max', name: '最大值' }],
tooltip: { show: true } // 显式启用 tooltip
}
}]
此方法通过事件监听动态触发 markPoint
的提示框,与 axis
模式的 tooltip
共存。
方法 3:结合 axisPointer
与 item
触发模式
通过配置 axisPointer
显示坐标轴信息,同时允许 markPoint
触发 item
类型的提示:
javascript
tooltip: {
trigger: 'item',
axisPointer: { type: 'cross' } // 显示坐标轴指示器
},
series: [{
type: 'line',
markPoint: {
data: [{ type: 'max', name: '最大值' }],
tooltip: { triggerOn: 'mousemove' }
}
}]
效果 :悬停坐标轴区域时显示 axisPointer
,悬停 markPoint
时显示独立 tooltip
。
三、注意事项
-
数据关联性
markPoint
的位置需与坐标轴数据对齐,否则可能无法正确触发提示。可通过coord
属性精确指定坐标:javascriptmarkPoint: { data: [{ type: 'max', coord: [xAxisValue, yAxisValue] }] }
-
性能优化
频繁的事件监听可能影响性能,建议使用防抖(debounce)或限制触发频率。
-
样式隔离
若需区分
axis
和markPoint
的提示框样式,可通过formatter
返回不同 HTML 结构,并配合 CSS 类名控制。
四、完整配置示例
javascript
option = {
tooltip: {
trigger: 'axis',
formatter: function (params) {
let tip = params.map(p => `${p.seriesName}: ${p.value}`).join('<br/>');
// 检查当前轴位置是否有 markPoint
const markPoint = params.data.markPoint;
if (markPoint) {
tip += `<span style="color:red">标注值: ${markPoint.value}`;
}
return tip;
}
},
xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed'] },
yAxis: { type: 'value' },
series: [{
type: 'line',
data: [
{ value: 150, markPoint: { value: 200 } }, // 绑定 markPoint 数据
{ value: 230 },
{ value: 224 }
],
markPoint: {
data: [{ type: 'max', coord: ['Mon', 200] }]
}
}]
};
五、适用场景
- 数据对比分析 :在趋势图中同时展示某时间点的详细数据(
axis
)和极值标注(markPoint
)。 - 混合交互需求:需要坐标轴区域触发全局数据,同时支持关键点的独立提示。
通过上述方法,可灵活实现 axis
模式下的 markPoint
悬浮值显示,具体方案需根据实际数据结构和交互需求调整。
由小艺AI生成<xiaoyi.huawei.com>