
在 AmCharts 5 中,无法直接在 labelText 模板字符串中执行 JavaScript 表达式(如 {Math.abs(valueY)}),但可通过 adapters 或 formatter 灵活实现任意逻辑的 tooltip 格式化。
在 amcharts 5 中,无法直接在 `labeltext` 模板字符串中执行 javascript 表达式(如 `{math.abs(valuey)}`),但可通过 `adapters` 或 `formatter` 灵活实现任意逻辑的 tooltip 格式化。
AmCharts 5 的 tooltip 渲染机制与 v4 有显著区别:模板占位符(如 {valueY})仅支持静态字段映射,不支持内联函数调用或运算表达式。若需动态计算、格式化或调用自定义函数,必须借助更底层的扩展机制——adapters(推荐)或 formatter(适用于简单数值转换)。
✅ 推荐方案:使用 adapters 动态生成 tooltip 文本
adapters 是 AmCharts 5 中最强大、最灵活的定制方式,允许你完全接管 tooltip 标签的文本生成逻辑。它在每次 tooltip 显示前触发,可访问当前数据项(tooltipDataItem)、系列配置及任意上下文。
// 定义你的自定义格式化函数
function customFun(value: number): string {
if (value === undefined || value === null) return "–";
return Math.abs(value * 2).toLocaleString("en-US", {
minimumFractionDigits: 0,
maximumFractionDigits: 1
});
}
// 为 tooltip 的 label 绑定 text adapter
series2.get("tooltip")?.label.adapters.add("text", function(text, target) {
const dataItem = series2.get("tooltipDataItem");
if (!dataItem) return "";
const name = series2.get("name") || "Series";
const valueY = dataItem.get("valueY");
return `${name}: $${customFun(valueY)}`;
});
⚠️ 注意事项:
- 必须通过 series2.get("tooltip")?.label.adapters.add(...) 绑定,而非直接设置 tooltip.labelText;
- tooltipDataItem 提供当前悬停点的完整数据上下文(含 valueY, categoryX, dataContext 等);
- Adapter 函数返回值即为最终显示文本,完全绕过原始模板解析,因此可自由拼接、调用函数、处理空值等。
✅ 替代方案:formatter(仅限基础数值转换)
若只需对 valueY 做简单数学运算或单位包装(如加 $、取绝对值),且不依赖其他字段,可使用 tooltip.formatter:
tooltip: am5.Tooltip.new(root, {
pointerOrientation: "horizontal",
formatter: (value: number) => `$${Math.abs(value)}` // ← 仅接收 valueY 数值
})
⚠️ 局限性:formatter 只接收单个数值参数(默认为 valueY),无法获取系列名、类别、原始数据对象等上下文信息,适用场景有限。
? 关键总结
- ❌ 错误写法:labelText: "{name}: {Math.abs(valueY)} $" —— 模板引擎不解析 JS 表达式;
- ✅ 正确路径:优先使用 label.adapters.add("text", ...) 实现全功能定制;
- ✅ 简单需求:tooltip.formatter 可快速包装数值,但无上下文感知能力;
- ? 调试提示:在 adapter 中 console.log(dataItem) 可查看所有可用字段,如 dataItem.get("categoryX")、dataItem.dataContext 等。
通过 adapters,你不仅能实现 2 * valueY、customFunction(valueY),还能结合时间格式化、多语言、条件高亮等复杂交互逻辑,真正掌控 tooltip 的每一处细节。











