0

I need some basic help formatting date/time so that I can add it to my JFreeChart TimeSeries. Because my code is adding duplicates I get the error below the second time through the loop.

I have a temperature sensor we use in healthcare and I need to plot the temp that is read every 30 minutes. So I need my x-axis to be Month-Day-Hour-Minute but I just dont know how to get my time formatted correctly. The line below were I am having issue specifically is " timeSeries.add(new Day(gc.getTime()), temp );"

It's been a really long time since college so I apologize, I think I am close but just can't close the gap. Any help would be appreciated.

thx! L

Output

Sat Nov 20 12:41:00 PST 2021: 72.5 F
TimeSeries.add 20-November-2021
Sat Nov 20 13:11:00 PST 2021: 70.7 F
TimeSeries.add 20-November-2021

Run-time Error when adding duplicates

Exception in thread "main" org.jfree.data.general.SeriesException: You are attempting to add an observation for the time period 20-November-2021 but the series already contains an observation for that time period. Duplicates are not permitted. Try using the addOrUpdate() method.

at org.jfree.data.time.TimeSeries.add(TimeSeries.java:701)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:746)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:732)
at dumpMission.main(dumpMission.java:212)


TimeSeries timeSeries = new TimeSeries("Date");
TimeSeriesCollection timeSeriesCollectionTemps = new TimeSeriesCollection();
long time = time_stamp.getTime().getTime() + owc.getFirstLogOffset(state);

GregorianCalendar gc = new GregorianCalendar();
for (int i = 0; i < log.length; i++){

     gc.setTime(new Date(time));
    System.out.println(gc.getTime() + ": " +  Convert.toFahrenheit(owc.decodeTemperature(log [i])) + " F");
    time += sample_rate * 60 * 1000;
    
    double temp = Convert.toFahrenheit(owc.decodeTemperature(log [i]));
    System.out.println("TimeSeries.add " + new Day(gc.getTime()));
    //add needs org.jfree.data.time.RegularTimePeriod
    //need to plot month-day-hour-minute
    timeSeries.add(new Day(gc.getTime()), temp );  // NEED HELP to get into unique month/day/hour/minute
    timeSeriesCollectionTemps.addSeries(timeSeries);
}

1 Answers1

1

As shown here, you can instantiate Minute or any suitable RegularTimePeriod to get the desired effect. As shown here, you can parse your sample date using SimpleDateFormat or ZonedDateTime; the example below uses the former.

image

import java.awt.Dimension;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;

/**
 * @see https://stackoverflow.com/q/70071299/230513
 * @see https://stackoverflow.com/a/12481509/230513
 */
public class TimeTest {

    private static XYDataset createDataset() throws ParseException {
        SimpleDateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
        TimeSeries series = new TimeSeries("Temperature");
        series.add(new Minute(f.parse("Sat Nov 20 12:41:00 PST 2021")), 72.5);
        series.add(new Minute(f.parse("Sat Nov 20 13:11:00 PST 2021")), 70.7);
        return new TimeSeriesCollection(series);
    }

    private static JFreeChart createChart(final XYDataset dataset) {
        SimpleDateFormat f = new SimpleDateFormat("HH:mm");
        f.setTimeZone(TimeZone.getTimeZone("PST"));
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "Test", "Time", "Temperture °F", dataset, true, true, false);
        XYPlot plot = (XYPlot) chart.getPlot();
        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
        r.setDefaultShapesVisible(true);
        DateAxis domain = (DateAxis) plot.getDomainAxis();
        domain.setDateFormatOverride(f);
        domain.setVerticalTickLabels(true);
        return chart;
    }

    public static void main(String[] args) throws ParseException {

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        XYDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        ChartPanel chartPanel = new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 250);
            }
        };
        f.add(chartPanel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
trashgod
  • 203,806
  • 29
  • 246
  • 1,045