在JFreeChart中绘制时间轴上的不规则周期数据

时间:2016-02-16 18:09:25

标签: java jfreechart

我正在尝试使用JfreeChart API创建折线图。 x轴接收数据长(毫秒),Y轴接收双倍。 当我使用动态模板时,我通过Add_Point方法从单独的线程传递数据,并通过此方法不断更新图表。数据不规则地出现,没有任何周期性,这可能使它更加棘手。

我找不到一种方法可以将long转换成易消化的Jfreechart格式而不用它的实例。看来我已经筋疲力尽了所有的选择,但我的猜测是,有很多人已经通过这个并且有一个现成的答案。

我想做的就是每分钟在X轴标签上反映正确的时间,数据点在相应的时间点正确间隔。通过正确的时间,我的意思是传递给方法的长值而不是当前的系统时间。

以下是代码:

import java.awt.BorderLayout;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.FixedMillisecond;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.RegularTimePeriod;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;


public class DynamicDataDemo extends ApplicationFrame {

    /** The time series data. */
    private static TimeSeries series;

    public DynamicDataDemo(final String title) {

        super(title);
        this.series = new TimeSeries("Random Data", Millisecond.class);
        final TimeSeriesCollection dataset = new TimeSeriesCollection(this.series);
        final JFreeChart chart = createChart(dataset);

        final ChartPanel chartPanel = new ChartPanel(chart);

        final JPanel content = new JPanel(new BorderLayout());
        content.add(chartPanel);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(content);

    }

    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(
            "Dynamic Data Demo", 
            "Time", 
            "Value",
            dataset, 
            true, 
            true, 
            false
        );
        final XYPlot plot = result.getXYPlot();
        ValueAxis axis = plot.getDomainAxis();
        axis.setAutoRange(true);
        axis.setFixedAutoRange(60000.0);  // 60 seconds
        axis = plot.getRangeAxis();
        axis.setRange(9000.0, 11000.0); 
        return result;
    }


    public static void Add_Point(long x, double y){
        series.add(new Millisecond(), y);
//      series.add(new FixedMillisecond(x), y);    }

}

1 个答案:

答案 0 :(得分:1)

如果您的x值是距离Java epoch的毫秒数,则可以这样做:

series.add(new Millisecond(new Date(x)), y);

如果没有,您将必须缩放和/或抵消该值。