简体   繁体   English

如何在JFreeChart TimeSeries图表上显示降雨量指数和温度?

[英]How do I show rainfall index along with temperature on my JFreeChart TimeSeries chart?

Currently, my TimeSeries graph shows the temperature of a location every 2 seconds. 目前,我的TimeSeries图每2秒显示一个位置的温度。
Now, if I want to show the rainfall index along with the temperature every 2 seconds, how can I achieve it? 现在,如果我想每2秒显示一次降雨指数和温度,该如何实现呢?
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();
        }
    });


}}

As noted here , a TimeSeriesCollection can display more than one series. 如前所述这里 ,一个TimeSeriesCollection可以显示多个系列。 Simply add both series to the collection and update each series in your timer's ActionListener . 只需将两个系列添加到集合中,并在计时器的ActionListener更新每个系列。 In the example below, setMaximumItemAge() is also invoked on each TimeSeries , as shown here , to discard older data. 在下面的例子, setMaximumItemAge()也调用每个TimeSeries ,如图这里 ,丢弃旧的数据。 To accommodate different units, you can set multiple axes on the same plot, as shown here . 为了适应不同的单位,可以在同一个情节设置多个轴,如图所示这里

图片

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);
        });
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何每10秒更新一次JFreeChart TimeSeries图表? - How do I update my JFreeChart TimeSeries chart every 10 seconds? 如何使用 JFreeChart TimeSeries 图表在绘图点显示形状? - How to show shapes at plot points with JFreeChart TimeSeries chart? JFreeChart-如何在TimeSeries图表的X轴上显示实时 - JFreeChart - How to show real-time on the X-Axis of a TimeSeries chart JFreeChart-如何在TimeSeries图表的X轴上实时显示并保存数据 - JFreeChart - How to show real-time on the X-Axis of a TimeSeries chart and keep datas JFreeChart - Timeseries和CandleStick在同一张图表上 - JFreeChart - Timeseries and CandleStick on the same chart 我如何正确地将 MouseHandler 添加到我的 JFreeChart-FX 以从左到右拖动图表 - How do I properly add a MouseHandler to my JFreeChart-FX to drag the chart from left to right Java JFreeChart DynamicTimeSeriesCollection。 如何使我的X轴显示当前时间? - Java JFreeChart DynamicTimeSeriesCollection. How do I get my x-axis to show the current time? JFreeChart TimeSeries Chart删除没有价值的天数 - JFreeChart TimeSeries Chart remove days with no value 如何使JFreeChart条形图的图扩展到在条形上方显示垂直标签? - How can I make a JFreeChart Bar Chart's plot expand to show vertical labels above the bars? 如何在JFreeChart烛台图表中将主体和边框颜色设置为相同 - How do I set the body and border colors to be the same in a JFreeChart Candlestick chart
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM