2012-09-18 34 views
1

我意識到這可能是一個愚蠢的問題,我知道這可以通過確定每個數據點在哪個星期或每個月內等來完成,但是,我正在尋找避免編碼的方法。如果它是在圖書館完成的(大概所有的陷阱都得到了),我寧願使用它。將帶日期數據的JFreeChart TimeSeries系列轉換爲星期或月份數據?

原始數據存儲在Excel電子表格中,但我無法直接操作電子表格。如果是唯一的解決方案,我可以製作一份副本並進行操作,但這將是最後的手段。我目前使用JFreeChart圖表的這些數據,如果這有什麼不同。我也願意使用任何圖書館。

非常感謝您提供的任何建議。

回答

3

沒有說你必須使用TimeSeriesRegularTimePeriod。工廠方法ChartFactory.createTimeSeriesChart()將接受任何XYDataset,其中域表示來自Java epoch的毫秒。下面的例子擴展了AbstractXYDataset以綜合一系列的日子。您的實施將不得不規範化Excel日期,這些日期使用不同的epoch

附錄:Apache POI包括執行轉換的靜態DateUtil.getJavaDate()方法。結果時間可以直接用於您選擇的數據集。一個完整的例子可以發現here

image

import java.awt.Dimension; 
import java.text.DateFormat; 
import java.util.Date; 
import javax.swing.JFrame; 
import org.jfree.chart.*; 
import org.jfree.chart.axis.DateAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.xy.AbstractXYDataset; 
import org.jfree.data.xy.XYDataset; 

/** @see https://stackoverflow.com/a/12481509/230513 */ 
public class AbstractXYTest { 

    private static XYDataset createDataset() { 
     return new AbstractXYDataset() { 

      private static final int N = 16; 
      private final long t = new Date().getTime(); 

      @Override 
      public int getSeriesCount() { 
       return 1; 
      } 

      @Override 
      public Comparable getSeriesKey(int series) { 
       return "Data"; 
      } 

      @Override 
      public int getItemCount(int series) { 
       return N; 
      } 

      @Override 
      public Number getX(int series, int item) { 
       return Double.valueOf(t + item * 1000 * 3600 * 24); 
      } 

      @Override 
      public Number getY(int series, int item) { 
       return Math.pow(item, 1.61); 
      } 
     }; 
    } 

    private static JFreeChart createChart(final XYDataset dataset) { 
     JFreeChart chart = ChartFactory.createTimeSeriesChart(
      "Test", "Day", "Value", dataset, false, false, false); 
     XYPlot plot = (XYPlot) chart.getPlot(); 
     DateAxis domain = (DateAxis) plot.getDomainAxis(); 
     domain.setDateFormatOverride(DateFormat.getDateInstance()); 
     return chart; 
    } 

    public static void main(String[] args) { 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     XYDataset dataset = createDataset(); 
     JFreeChart chart = createChart(dataset); 
     ChartPanel chartPanel = new ChartPanel(chart) { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(800, 300); 
      } 
     }; 
     f.add(chartPanel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

首先,感謝您抽出時間來回答我的問題。我想避免這種手工編碼的解決方案。我希望我可以指出一個圖書館,我可以用它來簡單地將日常數據點轉換爲每週數據點,並將每週的所有日常數據點(M-S)加在一起。 – Techogre

+0

對不起,我知道沒有這樣的圖書館。我首先將Excel日期轉換爲數據模型中的Java日期。您可以從適當的本地化默認視圖開始,並讓用戶選擇替代方案,如[建議](http://stackoverflow.com/a/5522583/230513)中所述。 – trashgod

+0

無論如何謝謝你。如果我找到它,我會繼續尋找並重新發布。 – Techogre

相關問題