Отображение огромного набора данных в JFreeChart - PullRequest
1 голос
/ 31 августа 2011

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

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

    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 ]

3 голосов
/ 31 августа 2011

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

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

Image image = chartPanel.createImage ();

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

1 голос
/ 31 августа 2011

Чтобы минимизировать рендеринг, вы можете посмотреть SlidingXYDataset, обсуждено здесь .

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

...