3

我意识到这可能是一个愚蠢的问题,并且我知道可以通过确定每个数据点所在的周或月等来完成,但是,我正在寻找一种避免编码的方法。如果它是在图书馆中完成的(大概是所有的陷阱),我宁愿使用它。

原始数据存储在 Excel 电子表格中,但我无法直接操作电子表格。如果这是唯一的解决方案,我可以制作一个副本并进行操作,但这将是最后的手段。我目前正在将此数据用于 JFreeChart 图表,如果这有什么不同的话。我也愿意使用任何图书馆。

非常感谢您提供的任何建议。

4

1 回答 1

4

没有人说你必须使用TimeSeriesor RegularTimePeriod。工厂方法ChartFactory.createTimeSeriesChart()将接受任何XYDataset域表示从 Java epoch开始的毫秒数。下面的示例扩展AbstractXYDataset到合成一系列天。您的实现必须规范化 Excel 日期,这些日期使用不同的epoch

附录: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 回答