我正在使用JFreeChart使用线图绘制两个系列的数据(XYSeries)。
复杂的因素是,其中一个数据系列的y值通常比我第二个数据系列的y值高得多(假设第一个系列的y值在数百万个数量级,而第二个系列的y值在数百个数量级。我的第一个数据集中存在高值,导致图的范围如此之大,以致于我的第二个数据集中的y值不再可理解。
在绘图中添加第二个y轴,这样我的两个数据系列都使用自己的y轴,就可以解决此问题。有谁知道如何用JFreeChart做到这一点?
当前代码的完整性:
XYSeriesCollection dataset = new XYSeriesCollection();
XYSeries series1 = new XYSeries("series1");
XYSeries series2 = new XYSeries("series2");
// Here is my code to fill series1 and series2 with data
dataset.addSeries(series1);
dataset.addSeries(series2);
JFreeChart chart = ChartFactory.createXYLineChart(
"title", "x-axis title", "y-axis title", dataset, PlotOrientation.VERTICAL, true, true, false
);
chart.getXYPlot().setRenderer(new XYSplineRenderer());
最佳答案
您可以手动创建JFreeChart对象,而不使用ChartFactory。首先生成数据集并绘制,将每个数据集设置为索引。然后,您可以使用必要的Axis和Renderer自定义绘图。这是使用具有两个数据集(每个数据集具有不同的y值)的伪数据执行此操作的示例:
//create the series - add some dummy data
XYSeries series1 = new XYSeries("series1");
XYSeries series2 = new XYSeries("series2");
series1.add(1000, 1000);
series1.add(1150, 1150);
series1.add(1250, 1250);
series2.add(1000, 111250);
series2.add(1150, 211250);
series2.add(1250, 311250);
//create the datasets
XYSeriesCollection dataset1 = new XYSeriesCollection();
XYSeriesCollection dataset2 = new XYSeriesCollection();
dataset1.addSeries(series1);
dataset2.addSeries(series2);
//construct the plot
XYPlot plot = new XYPlot();
plot.setDataset(0, dataset1);
plot.setDataset(1, dataset2);
//customize the plot with renderers and axis
plot.setRenderer(0, new XYSplineRenderer());//use default fill paint for first series
XYSplineRenderer splinerenderer = new XYSplineRenderer();
splinerenderer.setSeriesFillPaint(0, Color.BLUE);
plot.setRenderer(1, splinerenderer);
plot.setRangeAxis(0, new NumberAxis("Series 1"));
plot.setRangeAxis(1, new NumberAxis("Series 2"));
plot.setDomainAxis(new NumberAxis("X Axis"));
//Map the data to the appropriate axis
plot.mapDatasetToRangeAxis(0, 0);
plot.mapDatasetToRangeAxis(1, 1);
//generate the chart
JFreeChart chart = new JFreeChart("MyPlot", getFont(), plot, true);
chart.setBackgroundPaint(Color.WHITE);
JPanel chartPanel = new ChartPanel(chart);