2012-08-22 3 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을 설정하면이 화면에 그려진되기 전에 차트가 약 3K 데이터 포인트를 추가

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

} 

:

이 예를 생각해 보자.

설정 loadFirst = false 그것은 그들이 나중에 더 이상 복용 추가합니다.

당신은 성능의 차이를 볼 수 있습니다. 어떤 방법을 사용하고 있는지 예제로는 명확하지 않습니다.

데이터를로드하기 전에 차트를 표시하는 경우 가능한 경우 순서를 바꿔보십시오.

+0

예, 정말 고마워요, 나는 그것을 시도하고 성능의 차이를 보았다. 그래서 지금 저는이 수업을 적응하려고 시도 할 것입니다. ;) – Abdousoft