Displaying huge dataset in JFreeChart
I have an 开发者_如何学编程two-dimension array with the over of 100k records. When I'm trying to chart it - CPU is hard loading, and nothing else is going on. I've checked all the possible ways, including anti-alias, disabling event listeners etc. Nothing is working. And I assume a performance near 3-5 minutes (ok, that's relative thing, but I'd like to know how to reach it).
Therefore, I'm asking if there is a way to display the data correctly? I'm having two functions, one for specifying the chart, and another for it's plotting:
public void plotXYChart(double dArray[][], String sPlotName, String sSeriesName,
String sRangeName){
XYSeries series1 = new XYSeries(sSeriesName);
series1.clear();
for (int i=0; i< dArray.length; i++){
series1.add(dArray[i][0], dArray[i][1], false);
}
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.removeAllSeries();
dataset.addSeries(series1);
dataset.setAutoWidth(false);
dataset.setIntervalWidth(2000);
chart = ChartFactory.createXYLineChart(sPlotName, sSeriesName, sRangeName,
dataset, PlotOrientation.VERTICAL, false,
true, false);
chart.setAntiAlias(false);
XYPlot plot = (XYPlot) chart.getPlot();
plot.getDomainAxis().setStandardTickUnits(new StandardTickUnitSource());
plot.getRangeAxis().setStandardTickUnits(new StandardTickUnitSource());
SamplingXYLineRenderer renderer = new SamplingXYLineRenderer();
plot.setRenderer(renderer);
plotChart(sPlotName, chart);
}
private void plotChart(String sPlotName, JFreeChart chart){
if (this.cPanel!=null)
cPanel.setChart(chart);
else
cPanel = new ChartPanel(chart);
cPanel.setAutoscrolls(false);
cPanel.setDomainZoomable(false);
cPanel.setRangeZoomable(false);
cPanel.setRefreshBuffer(false);
cPanel.setDoubleBuffered(rootPaneCheckingEnabled);
this.chartFrame.add(cPanel);
this.chartFrame.pack();
if (this.chartFrame.isVisible() == false)
RefineryUtilities.centerFrameOnScreen(this.chartFrame);
this.chartFrame.setVisible(true);
}
It's not a JFreeChart problem. You are simply trying to draw too many datas. If you try to draw 100k line with swing you would feel the same performances problem. Reduce your dataset.
You can also trying a work around, but I'm not sure it will work. Don't show the generated ChartPanel. Instead generate the image of your ChartPanel using:
Image image = chartPanel.createImage ();
Display the generated image inside the component you prefer. The generation time of the image could be quite high, but once generated it should be faster display it and resizing the component in which it is stored. That's because it's a static image and drawing primitives won't be called while displaying it. Of course this way you will loose all ChartPanel functions, getting only it's image.
To minimize rendering effort, you might look into SlidingXYDataset
, discussed here.
Addendum: Alternatively, you can page manageable portions of the data into view, as suggested here.
精彩评论