3

I realize this may be a silly question, and I know it could be done by determining what week or month each data point is in, etc. but, I'm looking for a way to avoid coding that. If it's been done in a library (presumably all the gotchas gotten) I would rather use that.

The raw data is stored in Excel spreadsheets, but I cannot manipulate the spreadsheets directly. I could make a copy and manipulate that if it's the only solution, but this would be the last resort. I am currently using this data for JFreeChart charts, if that makes any difference. I am also open to using any library.

Thank you very much for any advice you can offer.

4

1 に答える 1

4

TimeSeriesまたはを使用する必要があるとは何も言われていませんRegularTimePeriod。ファクトリメソッドは、ドメインがJavaエポックChartFactory.createTimeSeriesChart()からのミリ秒を表すものを受け入れます。以下の例は、一連の日を合成するために拡張されています。実装では、異なるエポックを使用するExcelの日付を正規化する必要があります。XYDatasetAbstractXYDataset

補遺:Apache POIDateUtil.getJavaDate()には、変換を実行するための静的メソッドが含まれています。結果の時間は、選択したデータセットで直接使用できます。完全な例はここにあります。

画像

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);
    }
}
于 2012-09-18T16:50:11.620 に答える