2011-08-30 4 views
1

У меня есть двумерный массив с более чем 100 000 записей. Когда я пытаюсь нарисовать диаграмму, CPU сильно нагружен, и ничего больше не происходит. Я проверил все возможные способы, включая сглаживание, отключение прослушивателей событий и т. Д. Ничего не работает. И я предполагаю, что производительность около 3-5 минут (хорошо, это относительная вещь, но я хотел бы знать, как ее достичь).Отображение огромного набора данных в JFreeChart

Поэтому я спрашиваю, есть ли способ правильно отобразить данные? У меня две функции, одна для определения диаграммы, а другой для его построения:

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

} 
+2

Я не думаю, что можно полностью отображать 100 тыс. Бит данных для полной точности на одной диаграмме, и если вы каким-то образом ограничили данные путем усреднения или каким-либо другим способом, вы получите тот же график в гораздо более короткий период времени. Кроме того, вы профилировали свою программу, чтобы увидеть, где именно находится ваше узкое место? –

+0

Где-то во время отображения (возможно, масштабирования) все остальное работает нормально. Дело в том, что мне приходится работать с масштабированными и оригинальными данными размера, поэтому для меня предпочтительнее масштабировать его автоматически. – wanderlust

ответ

3

Это не проблема JFreeChart. Вы просто пытаетесь нарисовать слишком много данных. Если вы попытаетесь нарисовать линию 100k с качелями, вы почувствуете ту же самую проблему. Уменьшите набор данных.

Вы также можете попробовать работу, но я не уверен, что она сработает. Не показывать сгенерированную ChartPanel. Вместо этого создайте изображение вашей ChartPanel, используя:

Image image = chartPanel.createImage(); 

Отобразить сгенерированное изображение внутри выбранного вами компонента. Время генерации изображения может быть довольно высоким, но после его создания он должен быстрее отображать его и изменять размер компонента, в котором он хранится. Это потому, что это статическое изображение, и примитивы рисования не будут вызываться при его отображении. Конечно, таким образом вы потеряете все функции ChartPanel, получая только изображение.

1

Чтобы свести к минимуму усилия по увеличению, вы можете посмотреть SlidingXYDataset, обсужденный here.

Приложение: В качестве альтернативы вы можете просматривать управляемые части данных в представлении, как предложено here.

Смежные вопросы