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

JFreeChart双Y轴正确显示问题排查与解决请求

JFreeChart双Y轴配置问题修正方案

核心问题分析

你的代码存在两个关键错误:

  • 将两个TimeSeries放入同一个TimeSeriesCollection,又重复将该集合设置为数据集0和数据集1,导致数据被两次渲染,出现重复曲线
  • 数据集与Y轴的映射关系混乱,引发缩放时曲线消失、轴范围同步错误的问题

修正步骤与完整代码

1. 拆分数据集

为左右Y轴分别创建独立的TimeSeriesCollection,避免数据复用冲突:

public Graphen(final String title) {
    super(title);

    // 左Y轴:电池电压数据集
    resultSet = Verbinden_thread_Datenbank.DatenAbfrage3();
    TimeSeriesCollection batteryDataset = new TimeSeriesCollection();
    TimeSeries batterySeries = Batterieleistung(resultSet);
    batteryDataset.addSeries(batterySeries);
    
    // 右Y轴:锅炉温度数据集
    TemperaturKesselResultSet = Verbinden_thread_Datenbank.DatenAbfrage2();
    TimeSeriesCollection tempDataset = new TimeSeriesCollection();
    TimeSeries tempSeries = TemperaturKessel(TemperaturKesselResultSet);
    tempDataset.addSeries(tempSeries);

2. 初始化图表并配置双Y轴

创建图表时绑定左轴数据集,再添加右轴并建立正确的映射关系:

// 创建初始图表,绑定左Y轴数据集
    final JFreeChart chart = ChartFactory.createTimeSeriesChart(
        "PV Daten", "Uhrzeit", "Batteriespannung", batteryDataset
    );

    // 配置日期轴格式
    SimpleDateFormat f = new SimpleDateFormat("HH:mm:ss");
    f.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
    DateAxis domain = (DateAxis) chart.getXYPlot().getDomainAxis();
    domain.setDateFormatOverride(f);
    domain.setVerticalTickLabels(true);

    XYPlot plot = (XYPlot) chart.getXYPlot();
    
    // 配置左Y轴范围
    ValueAxis leftAxis = plot.getRangeAxis(0);
    leftAxis.setRange(-5000.0, 5000.0);
    
    // 添加并配置右Y轴
    final NumberAxis rightAxis = new NumberAxis("Temperatur Kessel");
    plot.setRangeAxis(1, rightAxis);
    rightAxis.setRange(38.0, 50.0);
    
    // 绑定右轴数据集与对应Y轴
    plot.setDataset(1, tempDataset);
    plot.mapDatasetToRangeAxis(1, 1);

3. 配置渲染器(可选,区分曲线样式)

为两个数据集设置独立渲染器,避免样式冲突:

// 左轴曲线样式(红色)
    XYLineAndShapeRenderer leftRenderer = (XYLineAndShapeRenderer) plot.getRenderer(0);
    leftRenderer.setSeriesPaint(0, Color.RED);
    leftRenderer.setDefaultShapesVisible(false);

    // 右轴曲线样式(蓝色)
    XYLineAndShapeRenderer rightRenderer = new XYLineAndShapeRenderer();
    rightRenderer.setSeriesPaint(0, Color.BLUE);
    rightRenderer.setDefaultShapesVisible(false);
    plot.setRenderer(1, rightRenderer);

4. 图表面板配置

保留原有缩放与尺寸设置:

final ChartPanel panel = new ChartPanel(chart);
    panel.setPreferredSize(new java.awt.Dimension(1600, 800));
    panel.setRangeZoomable(true);
    panel.setDomainZoomable(true);
    setContentPane(panel);
}

关键修复点

  • 每个Y轴对应独立数据集,彻底解决重复渲染问题
  • 通过mapDatasetToRangeAxis明确数据集与Y轴的绑定关系,确保缩放时轴与数据关联正确
  • 独立渲染器让两条曲线样式区分更清晰,避免渲染逻辑冲突

内容的提问来源于stack exchange,提问作者Chefselber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:09:55