You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AmChart (v4)中自定义带动态变量名的提示框

解决方案

情况1:JavaFX XYChart

核心思路是将原始数据绑定到每个图表数据点的userData属性,然后根据系列名称动态拼接Lot ID字段名,从原始数据中提取对应值。

步骤1:定义数据模型类(或使用Map存储原始数据)

// 对应你的JSON数据结构的POJO类
class TempRecord {
    private String sumTime;
    private int TEMP_REAR;
    private String TEMP_REAR_lotId;
    private int TEMP_CR;
    private String TEMP_CR_lotId;

    // 自行补充构造器、Getter方法
}

步骤2:创建LineSeries并绑定原始数据

// 假设已将JSON解析为List<TempRecord> tempRecords
LineSeries<String, Number> tempRearSeries = new LineSeries<>();
tempRearSeries.setName("TEMP_REAR");

LineSeries<String, Number> tempCrSeries = new LineSeries<>();
tempCrSeries.setName("TEMP_CR");

// 给每个系列添加数据点,同时将原始记录存入userData
for (TempRecord record : tempRecords) {
    // TEMP_REAR系列数据点
    XYChart.Data<String, Number> rearData = new XYChart.Data<>(record.getSumTime(), record.getTEMP_REAR());
    rearData.setUserData(record);
    tempRearSeries.getData().add(rearData);

    // TEMP_CR系列数据点
    XYChart.Data<String, Number> crData = new XYChart.Data<>(record.getSumTime(), record.getTEMP_CR());
    crData.setUserData(record);
    tempCrSeries.getData().add(crData);
}

// 将系列添加到XYChart
XYChart<String, Number> chart = new LineChart<>(new CategoryAxis(), new NumberAxis());
chart.getData().addAll(tempRearSeries, tempCrSeries);

步骤3:自定义提示框(Tooltip)

编写通用方法处理所有系列的提示框,根据系列名动态获取Lot ID:

private void setupCustomTooltip(LineSeries<String, Number> series) {
    String seriesName = series.getName();
    String lotIdField = seriesName + "_lotId";

    for (XYChart.Data<String, Number> dataPoint : series.getData()) {
        TempRecord rawRecord = (TempRecord) dataPoint.getUserData();
        String sumTime = rawRecord.getSumTime();
        Number value = dataPoint.getYValue();
        String lotId;

        // 根据系列名匹配对应Lot ID字段
        switch (seriesName) {
            case "TEMP_REAR":
                lotId = rawRecord.getTEMP_REAR_lotId();
                break;
            case "TEMP_CR":
                lotId = rawRecord.getTEMP_CR_lotId();
                break;
            default:
                lotId = "Unknown";
        }

        // 构建提示框文本
        String tooltipContent = String.format("Name: %s\nSum Time: %s\nSum Value: %d\nLot ID: %s",
                seriesName, sumTime, value.intValue(), lotId);

        Tooltip tooltip = new Tooltip(tooltipContent);
        Tooltip.install(dataPoint.getNode(), tooltip);
    }
}

// 给两个系列应用自定义提示框
setupCustomTooltip(tempRearSeries);
setupCustomTooltip(tempCrSeries);

如果需要支持后续新增系列,可用反射替代switch实现通用逻辑:

private String getLotIdByReflection(TempRecord record, String fieldName) {
    try {
        String getterName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
        Method getter = TempRecord.class.getMethod(getterName);
        return (String) getter.invoke(record);
    } catch (Exception e) {
        e.printStackTrace();
        return "Error";
    }
}

在setupCustomTooltip中替换switch部分:

String lotId = getLotIdByReflection(rawRecord, lotIdField);

情况2:ECharts(前端XY轴折线图)

核心是在系列数据中携带Lot ID字段,然后在提示框格式化函数中根据系列名动态提取对应值。

配置示例

// 假设原始JSON已解析为tempData数组
const option = {
    tooltip: {
        formatter: function(params) {
            const seriesName = params.seriesName;
            // 动态拼接Lot ID字段名
            const lotIdField = `${seriesName}_lotId`;
            const lotId = params.data[lotIdField];
            
            return `Name: ${seriesName}\nSum Time: ${params.name}\nSum Value: ${params.value}\nLot ID: ${lotId}`;
        }
    },
    xAxis: {
        type: 'category',
        data: tempData.map(item => item.sumTime)
    },
    yAxis: {
        type: 'value'
    },
    series: [
        {
            name: 'TEMP_REAR',
            type: 'line',
            // 每个数据项携带对应Lot ID
            data: tempData.map(item => ({
                value: item.TEMP_REAR,
                TEMP_REAR_lotId: item.TEMP_REAR_lotId
            }))
        },
        {
            name: 'TEMP_CR',
            type: 'line',
            data: tempData.map(item => ({
                value: item.TEMP_CR,
                TEMP_CR_lotId: item.TEMP_CR_lotId
            }))
        }
    ]
};

// 初始化图表
const myChart = echarts.init(document.getElementById('main'));
myChart.setOption(option);

内容的提问来源于stack exchange,提问作者Sao Bui Van

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:37:21