如何在 echarts4r 中为 trigger=axis 自定义 tooltip?
trigger = "axis" 时,formatter 接收一个数组,包含当前坐标轴位置上各系列的数据。逐项读取数据点绑定的 year_method,从中提取 method,就能拼出 tooltip 的 HTML 字符串。
利用已经设置的 bind = year_method,可以在每个系列名称后标注对应的方法。
可直接使用的代码
沿用问题中的 eg_data,将原来的 e_tooltip() 替换为:
library(echarts4r)
library(dplyr)
e_charts(eg_data, x = fin_year) %>%
e_line(value, bind = year_method) %>%
e_tooltip(
trigger = "axis",
renderMode = "html",
formatter = htmlwidgets::JS("
function(params) {
if (!params.length) return '';
var year = params[0].axisValueLabel;
if (year == null) year = params[0].axisValue;
var rows = params.map(function(p) {
var value = Array.isArray(p.value)
? p.value[1]
: p.value;
if (value == null || value === '-') return '';
var name = String(p.name);
var method = name.substring(name.indexOf(' ') + 1);
return (p.marker || '') +
p.seriesName + ' (' + method + ') ' + value;
}).filter(function(row) {
return row !== '';
});
return year + '<br>' + rows.join('<br>');
}
")
)
在 2021/22 年,tooltip 显示的文字为:
2021/22
line1 (A) 13
line1 (B) 11
line2 (A) 14
line2 (B) 15
代码保留了各系列的颜色标记,显示顺序与 params 一致。如果还需要标出方法变更年份的竖线,可以保留原来的 e_mark_line(),放在 e_tooltip() 前面。
formatter 中的字段分别是什么
使用 e_line(value, bind = year_method) 时,formatter 中各字段的含义如下:
| 字段 | 用途 |
|---|---|
params | 当前年份参与 tooltip 的数据项数组 |
p.seriesName | 当前项所属的系列名称,例如 line1 |
p.name | 数据点名称;这里通过 bind 绑定为 year_method,例如 "2021/22 A" |
p.value | 数据项的值;常见的 echarts4r 折线图结构为 [横坐标, 纵坐标] |
p.marker | ECharts 生成的系列颜色标记 |
方法名称从 p.name 中提取:
var name = String(p.name);
var method = name.substring(name.indexOf(' ') + 1);
year_method 由 paste(fin_year, method) 生成。这里的年度字符串不含空格,因此取第一个空格之后的内容,就能从 "2021/22 A" 得到 "A"。
数值的读取方式是:
var value = Array.isArray(p.value)
? p.value[1]
: p.value;
JavaScript 数组下标从 0 开始,所以在 [横坐标, 纵坐标] 结构中,p.value[1] 是纵坐标数值。如果 p.value 本身就是单个数值,这段代码也能读取。
map() 为每个数据项生成一行,join('<br>') 用 HTML 换行符连接各行。htmlwidgets::JS() 将这段字符串作为 JavaScript 函数传给图表。
使用时需要注意什么
这段代码依赖 bind = year_method,需要先通过绑定把相关信息传入图表数据。即使 R 数据框中有 method 列,formatter 也不能因此直接读取 p.method。
不同方法覆盖的年份不同,因此示例跳过了值为 null、undefined 或 '-' 的数据项,避免在 tooltip 中显示缺失项。数值 0 会正常保留。
如果图表显示 undefined,或方法名称不正确,可以临时在 formatter 函数开头加入:
console.log(params);
打开浏览器开发者工具的 Console,再将鼠标悬停在图表上,检查实际的 name 和 value。如果所用版本或图表配置生成的数据结构不同,需要相应调整字段读取方式。p.value[1] 并不适用于所有 ECharts 图表。
备注:内容仅供参考。
