1

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);

}
Heisenbug
  • 38,762
  • 28
  • 132
  • 190
wanderlust
  • 1,826
  • 1
  • 21
  • 25
  • 2
    I don't think that it is possible to fully display 100k bits of data to full precision on a single chart, and that if you somehow limited the data by averaging or some other method, you'll get the same chart displayed in a much shorter time period. Also, have you profiled your program to see just exactly where your bottleneck is? – Hovercraft Full Of Eels Aug 30 '11 at 22:12
  • Somewhere during the displaying (maybe scaling), all the rest runs OK. The thing is I have to work with the scaled and original size data, therefore it is preferable for me to scale it automatically. – wanderlust Aug 30 '11 at 22:15

2 Answers2

3

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.

Heisenbug
  • 38,762
  • 28
  • 132
  • 190
1

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.

Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045