Usando JFreeChart para mostrar los cambios recientes en una serie temporal

¿Cómo puedo usar JFreeChart para mostrar solo los datos más recientes en una serie temporal continuamente actualizada?

Addenda: Aquí se muestra un ejemplo completo y funcional que incorpora la respuesta aceptada. Ver también esta variación que tiene dos series. Consulte también esta pregunta y respuesta sobre setTimeBase() .

También puede eliminar el cero por first advanceTime (), luego appendData. (cambiar de la forma en que lo están haciendo en el ejemplo).

La clase JFreeChart DynamicTimeSeriesCollection es una buena opción.

Addendum: Como señaló @ Bahadır, el último punto de la serie fue persistentemente cero. @Don sugiere ayudar a avanzar el tiempo y luego anexar los datos.

 dataset.advanceTime(); dataset.appendData(newData); 

enter image description here

 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.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; /** @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), 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(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); demo.start(); } }); } } 

Un enfoque alternativo a la respuesta de @ thrashgod sería usar TimeSeriesCollection y establecer la edad del elemento en el TimeSeries . A continuación, el código puede configurar un gráfico para mostrar la última hora de datos con intervalos de 1 minuto.

 private TimeSeriesCollection dataset; private TimeSeries sensorSeries; sensorSeries = new TimeSeries("name", Minute.class); sensorSeries.setMaximumItemAge(60); dataset = new TimeSeriesCollection(); dataset.addSeries(sensorSeries); 

… y agregarás los datos tal como vienen:

 sensorSeries.add(new Minute(new Date()), newData);