How can I use JFreeChart
to display just the most recent data in a continually updated time series?
Addenda: A complete, working example that incorporates the accepted answer is shown here. See also this variation having two series. See also this Q&A regarding setTimeBase()
.
The JFreeChart
class DynamicTimeSeriesCollection
is a good choice.
Addendum: As noted by @Bahadır, the last point of the series was persistently zero. @Don helpfully suggests advancing the time and then appending the data.
dataset.advanceTime(); dataset.appendData(newData);
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.Timer; 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.DynamicTimeSeriesCollection; import org.jfree.data.time.Second; import org.jfree.data.xy.XYDataset; import org.jfree.chart.ui.ApplicationFrame; import org.jfree.chart.ui.UIUtils; /** * @see http://stackoverflow.com/a/15521956/230513 * @see http://stackoverflow.com/questions/5048852 */ public class DTSCTest extends ApplicationFrame { private static final String TITLE = "Dynamic Series"; private static final String START = "Start"; private static final String STOP = "Stop"; private static final float MINMAX = 100; private static final int COUNT = 2 * 60; private static final int FAST = 100; private static final int SLOW = FAST * 5; private static final Random random = new Random(); private Timer timer; public DTSCTest(final String title) { super(title); final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second()); dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 2011)); dataset.addSeries(gaussianData(), 0, "Gaussian data"); JFreeChart chart = createChart(dataset); final JButton run = new JButton(STOP); run.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (STOP.equals(cmd)) { timer.stop(); run.setText(START); } else { timer.start(); run.setText(STOP); } } }); final JComboBox combo = new JComboBox(); combo.addItem("Fast"); combo.addItem("Slow"); combo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ("Fast".equals(combo.getSelectedItem())) { timer.setDelay(FAST); } else { timer.setDelay(SLOW); } } }); this.add(new ChartPanel(chart) { @Override public Dimension getPreferredSize() { return new Dimension(640, 480); } }, BorderLayout.CENTER); JPanel btnPanel = new JPanel(new FlowLayout()); btnPanel.add(run); btnPanel.add(combo); this.add(btnPanel, BorderLayout.SOUTH); timer = new Timer(FAST, new ActionListener() { float[] newData = new float[1]; @Override public void actionPerformed(ActionEvent e) { newData[0] = randomValue(); dataset.advanceTime(); dataset.appendData(newData); } }); } private float randomValue() { return (float) (random.nextGaussian() * MINMAX / 3); } private float[] gaussianData() { float[] a = new float[COUNT]; for (int i = 0; i < a.length; i++) { a[i] = randomValue(); } return a; } private JFreeChart createChart(final XYDataset dataset) { final JFreeChart result = ChartFactory.createTimeSeriesChart( TITLE, "hh:mm:ss", "milliVolts", dataset, true, true, false); final XYPlot plot = result.getXYPlot(); ValueAxis domain = plot.getDomainAxis(); domain.setAutoRange(true); ValueAxis range = plot.getRangeAxis(); range.setRange(-MINMAX, MINMAX); return result; } public void start() { timer.start(); } public static void main(final String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { DTSCTest demo = new DTSCTest(TITLE); demo.pack(); UIUtils.centerFrameOnScreen(demo); demo.setVisible(true); demo.start(); } }); } }
You can also eliminate the zero by first advanceTime()
, then appendData
. (swap the way they are doing it in the example).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With