Utilizzo di JFreeChart per visualizzare le modifiche recenti in una serie storica

Come posso utilizzare JFreeChart per visualizzare solo i dati più recenti in una serie JFreeChart continuamente aggiornata?

Addenda: qui viene mostrato un esempio completo e funzionante che incorpora la risposta accettata. Vedi anche questa variazione con due serie. Vedi anche questo Q & A riguardo a setTimeBase() .

    Puoi anche eliminare lo zero prima di advanceTime (), quindi appendData. (scambia il modo in cui lo stanno facendo nell’esempio).

    La class JFreeChart DynamicTimeSeriesCollection è una buona scelta.

    Addendum: come notato da @ Bahadir, l’ultimo punto della serie era persistentemente zero. @ Don suggerisce di anticipare il tempo e quindi di aggiungere i dati.

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

    inserisci la descrizione dell'immagine qui

     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 actionPerformsd(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 actionPerformsd(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 actionPerformsd(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 approccio alternativo alla risposta di @ thrashgod sarebbe utilizzare TimeSeriesCollection e impostare l’età dell’elemento su TimeSeries . Sotto il codice è ansible impostare un grafico per mostrare l’ultima ora di dati con intervalli di 1 minuto.

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

    ..e aggiungerai i dati così come sono:

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