【问题标题】:Converting a JFreeChart TimeSeries series with Day data to Week or Month data?将带有日数据的 JFreeChart 时间序列系列转换为周或月数据?
【发布时间】:2012-09-10 19:41:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

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

    附录:Apache POI 包括用于执行转换的静态 DateUtil.getJavaDate() 方法。结果时间可以直接用于您选择的数据集中。一个完整的例子可以在here找到。

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

    【讨论】:

    • 首先,感谢您抽出宝贵时间回答我的问题。我想避免这种手工编码的解决方案。我希望我可以找到一个库,我可以使用它来简单地将每日数据点转换为每周数据点,并将一周内的所有每日数据点 (M-S) 相加。
    • 对不起,我不知道这样的图书馆。我首先在数据模型中将 Excel 日期转换为 Java 日期。您可以从合适的本地化默认视图开始,让用户选择替代方案,如建议here
    • 还是谢谢你。当/如果我找到它,我会继续寻找并重新发布。
    • 我硬着头皮手动进行了转换。无论如何感谢您的回答。
    猜你喜欢
    • 2018-03-23
    • 2012-02-02
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多