2012-08-22 21 views
1

我製作了一個用JfreeChart生成圖形的方法。我在散點圖中繪製了超過2500個值,但這需要很多時間。那麼我們如何解決這個問題呢?用於生成JFreeChart圖形的巨大執行時間

這一段代碼:

public NuagePointsFact(){ 
     LectureFichierExcel lfe = new LectureFichierExcel("data/requete1Test.xls"); 
     this.series = new TimeSeries[lfe.findDate().size()]; 
     this.dataset = new TimeSeriesCollection(); 

     for(int i=0; i<lfe.findDate().size(); i++){ 
     this.series [i] = new TimeSeries(i, Day.class); 
     series[i].add(new Day(new Date(lfe.findDate().get(i))), lfe.findValues().get(i)); 

     dataset.addSeries(series[i]); 

     } 
..... 

謝謝。

+1

買一臺更快的電腦;-)不嚴重:你可以展示一些代碼如何創建情節?或者你懷疑它很慢? – Dirk

+0

當然是。我會在我的問題中發佈它? – Abdousoft

+0

沒有這一行的for循環有多快:dataset.addSeries(series [i]); ? – Averroes

回答

1

我只有幾點建議,您將不得不嘗試一下:您可以將數據添加到100個值左右的系列中。你將不得不使用一個單獨的線程添加到模型,然後重新繪製圖表,等待一段時間,並添加另一堆等等。

但是,我過去使用過JFreeChart,我認爲它的工作方式不僅僅只有2500個值。

+0

是的,謝謝你,我會嘗試你的建議;) – Abdousoft

2

您是在將數據添加到TimeSeries之後創建圖表嗎?如果您在圖表創建/顯示後添加數據,則在添加每個點後將重新繪製plot。如果設置loadFirst = true

import java.text.SimpleDateFormat; 

import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.DateAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.time.Day; 
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.data.time.TimeSeriesDataItem; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

public class TimeSeriesDemo1 extends ApplicationFrame { 

    private static TimeSeries s1; 
    private static boolean loadFirst; 

    public TimeSeriesDemo1(String title) { 
    super(title); 
    JPanel chartPanel = createDemoPanel(); 
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 
    setContentPane(chartPanel); 

    if (!loadFirst){ 
    Runnable task = new Runnable() { 
     @Override 
     public void run() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) {} 
     int count = 0; 
     for (int year = 2000 ; year < 2010 ; year++){ 
      for (int month = 1 ; month < 13 ; month++){ 
      for (int day = 1 ; day < 29 ; day++){ 
       final TimeSeriesDataItem di = new TimeSeriesDataItem(new Day(day, month, year), Math.random() * 20); 
       count++; 
       SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        s1.add(di); 
       } 
       }); 

      } 
      } 
     } 
     System.out.println("After the chart is created " + count); 
     } 
    }; 
    Thread th = new Thread(task,"Load Data"){ 
    }; 
    th.start(); 
    } 
    } 

    private static JFreeChart createChart(XYDataset dataset) { 

    JFreeChart chart = ChartFactory.createTimeSeriesChart(
     "Large Dataset Demo", // title 
     "Date",  // x-axis label 
     "Value",  // y-axis label 
     dataset,  // data 
     true,   // create legend? 
     true,   // generate tooltips? 
     false   // generate URLs? 
); 
    XYPlot plot = (XYPlot) chart.getPlot(); 
    DateAxis domainAaxis = (DateAxis) plot.getDomainAxis(); 
    domainAaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy")); 
    return chart; 

    } 

    private static XYDataset createDataset() { 
     s1 = new TimeSeries("Random Data"); 
     int count = 0; 
     if (loadFirst){ 
     for (int year = 2000 ; year < 2010 ; year++){ 
      for (int month = 1 ; month < 13 ; month++){ 
      for (int day = 1 ; day < 29 ; day++){ 
       final TimeSeriesDataItem di = new TimeSeriesDataItem(new Day(day, month, year), Math.random() * 20); 
       count++; 
       s1.add(di); 
      } 
      } 
     } 
     System.out.println("Before the chart is created " + count); 
     } 
     TimeSeriesCollection dataset = new TimeSeriesCollection(); 
     dataset.addSeries(s1); 
     return dataset; 
    } 

    public static JPanel createDemoPanel() { 
    JFreeChart chart = createChart(createDataset()); 
    return new ChartPanel(chart); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      loadFirst = true; 
      TimeSeriesDemo1 demo = new TimeSeriesDemo1("Large Time Series Demo "); 
      demo.pack(); 
      RefineryUtilities.centerFrameOnScreen(demo); 
      demo.setVisible(true); 
     } 
     }); 
    } 

} 

它在屏幕上繪製之前圖表增加了約3K的數據點:

考慮這個例子。

設置loadFirst = false它將增加它們,然後花費更長的時間。

你可以看到性能上的差異。你不清楚你使用的是哪種方法。

如果您在加載數據之前顯示圖表,請儘可能嘗試交換訂單。

+0

非常感謝你,我嘗試過,我看到了性能的差異。所以現在我會嘗試像這樣適應我的課程。 ;) – Abdousoft