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
相关产品推荐
相关产品推荐

