0

Currently, my TimeSeries graph shows the temperature of a location every 2 seconds.
Now, if I want to show the rainfall index along with the temperature every 2 seconds, how can I achieve it?
Here is my code:

import testWeatherService.TestWeatherTimeLapseService;

public class graph extends JFrame implements ActionListener  {

private static TimeSeries series;

static final int COUNT = 200;

/** The Constant WINDOW. */
public static final int WINDOW = 25;
TestWeatherTimeLapseService getLocData = new TestWeatherTimeLapseService();
public graph(final String title) {
    super(title);
    this.series = new TimeSeries("Random Data", Millisecond.class);
    this.series2 = 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());

    add(chartPanel, BorderLayout.SOUTH);
    content.add(chartPanel);
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 600));
    setContentPane(content);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
private JFreeChart createChart(final XYDataset dataset) {
    final JFreeChart result = ChartFactory.createTimeSeriesChart(
        "Graph",
        "Time",
        "Temperature",
        dataset,
        true,
        true,
        false
    );

    final XYPlot plot = result.getXYPlot();
    ValueAxis axis = plot.getDomainAxis();
    axis.setAutoRange(true);
    axis.setFixedAutoRange(60000);  // 60 seconds
    axis = plot.getRangeAxis();
    axis.setRange(-10.0, 50.0);

    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer( );
    renderer.setSeriesPaint( 0 , Color.RED );
    renderer.setSeriesStroke( 0 , new BasicStroke( 4.0f ) );
    renderer.setSeriesPaint( 1 , Color.RED );
    renderer.setSeriesStroke( 1 , new BasicStroke( 4.0f ) );
    plot.setRenderer( renderer );
    return result;
}
public void actionPerformed(final ActionEvent e) {
    //
}

public void update(){
    String currTemperature="";
    try {
         currTemperature=getLocData.getWeatherData("Laverton")[1];      //get temperature of laverton
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    float number = Float.parseFloat(currTemperature);
    number=(float) (number-273.15);
    final Millisecond now = new Millisecond();
    System.out.println("Now = " + now.toString());
    this.series.add(new Millisecond(), number);


}
public void doIt(){
    final graph demo = new graph("Graph");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            Timer timer;
            timer = new Timer(2000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    demo.addWindowListener(new WindowAdapter() {
                          public void windowClosing(WindowEvent ev) {  //stop when user closes chart  
                              demo.dispose();  
                              ((Timer)e.getSource()).stop();
                          }
                      });
                    update();
                }
            });
            timer.start();
        }
    });


}}
fredjohnson
  • 187
  • 2
  • 10
  • 18

1 Answers1

1

As noted here, a TimeSeriesCollection can display more than one series. Simply add both series to the collection and update each series in your timer's ActionListener. In the example below, setMaximumItemAge() is also invoked on each TimeSeries, as shown here, to discard older data. To accommodate different units, you can set multiple axes on the same plot, as shown here.

image

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.*;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.Timer;
import org.jfree.chart.*;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

/** @See https://stackoverflow.com/q/44037591/230513 */
public class ChartPanelTest {

    private static final Random R = new Random();
    private static final int AGE = 60;

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            TimeSeriesCollection dataset = new TimeSeriesCollection();
            TimeSeries series1 = new TimeSeries("T1");
            series1.setMaximumItemAge(AGE);
            dataset.addSeries(series1);
            TimeSeries series2 = new TimeSeries("T2");
            series2.setMaximumItemAge(AGE);
            dataset.addSeries(series2);
            JFreeChart chart = ChartFactory.createTimeSeriesChart(
                "Test", "Time", "Value", dataset, false, false, false);
            ChartPanel chartPanel = new ChartPanel(chart) {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(640, 480);
                }
            };
            f.add(chartPanel);
            Timer timer = new Timer(2000, new ActionListener() {
                Second s = new Second();
                { for (int i = 0; i < AGE; i++) actionPerformed(null); }
                @Override
                public void actionPerformed(ActionEvent e) {
                    series1.add(s, R.nextGaussian());
                    series2.add(s, R.nextGaussian());
                    s = (Second) s.next().next();
                }
            });
            timer.start();
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }
}
Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
  • However, why won't the T1 and T2 text be displayed on the chart? Like, in this example the text Series 1 and Series 2 is displayed. http://i.imgur.com/LDTHYzd.png – fredjohnson May 18 '17 at 05:25
  • 1
    @fredjohnson: Set the factory's [`legend`](http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/ChartFactory.html#createTimeSeriesChart-java.lang.String-java.lang.String-java.lang.String-org.jfree.data.xy.XYDataset-boolean-boolean-boolean-) parameter to `true`. – trashgod May 18 '17 at 09:13