【问题标题】:Displaying huge dataset in JFreeChart在 JFreeChart 中显示巨大的数据集
【发布时间】:2016-03-26 17:06:19
【问题描述】:

我有一个超过 10 万条记录的二维数组。当我试图绘制它时 - CPU 负载很重,没有其他任何事情发生。我已经检查了所有可能的方法,包括抗锯齿、禁用事件侦听器等。没有任何效果。我假设表演接近 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);

}

【问题讨论】:

  • 我认为不可能在单个图表上完全显示 100k 位数据,并且如果您通过平均或其他方法以某种方式限制数据,您将在更短的时间内获得相同的图表。另外,您是否对您的程序进行了概要分析,以准确了解您的瓶颈在哪里?
  • 在显示过程中的某个地方(可能是缩放),其余的都运行正常。问题是我必须使用缩放和原始大小数据,因此我最好自动缩放它。

标签: java performance swing jfreechart


【解决方案1】:

这不是 JFreeChart 问题。您只是试图绘制太多数据。如果你尝试用 swing 画 100k 线,你会感觉到同样的性能问题。减少数据集。

您也可以尝试解决方法,但我不确定它是否有效。不显示生成的 ChartPanel。而是使用以下方法生成 ChartPanel 的图像:

Image image = chartPanel.createImage ();

在您喜欢的组件内显示生成的图像。图像的生成时间可能相当长,但是一旦生成,它应该更快地显示它并调整存储它的组件的大小。那是因为它是一个静态图像,并且在显示它时不会调用绘图图元。 当然,这样您将失去所有 ChartPanel 功能,只获得它的图像。

【讨论】:

    【解决方案2】:

    为了尽量减少渲染工作,您可以查看SlidingXYDataset,讨论here

    附录:或者,您可以按照here 的建议将数据的可管理部分分页到视图中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多