2016-07-12 13 views
2

Ich versuche TimeSeries Daten in Java mit JFreeChart zu zeichnen, aber die Daten bestehen aus doubles, die die Ausgabe von Aufrufen an Renjin sind. Der Code, die Daten an die TimeSeries hinzuzufügen, ist wie folgt:JFreeChart TimeSeries Axis in nichtmilitärischer Zeit

for (int i=0; i<series2Values.length; i++) { 
    if (!Double.isNaN(series2Values[i])) { 
     series2.add(new Hour((int)times[i], new Day()), series2Values[i]); 
    } else { 
     series2.add(new Hour((int)times[i], new Day()), null); 
    } 
} 

final TimeSeriesCollection dataset2 = new TimeSeriesCollection(); 
dataset2.addSeries(series2); 

JFreeChart chart2 = ChartFactory.createTimeSeriesChart(title, "Time (Hour)", "Vehicles Parked", dataset2, true, true, false); 
ChartFrame frame2 = new ChartFrame(title, chart2, false); 
frame2.pack(); 
frame2.setIconImage(img.getImage()); 
frame2.setVisible(true); 

Das Problem ist, dass, wann immer die Daten graphisch dargestellt wird, werden die Zeiten auf der X-Achse in 24-Stunden-militärische Zeit angezeigt, und wenn die time[] Array enthält alle doppelten Werte der folgenden SeriesException geworfen wird:

Exception in thread "AWT-EventQueue-0" org.jfree.data.general.SeriesException: You are attempting to add an observation for the time period [6,12/7/2016] but the series already contains an observation for that time period. Duplicates are not permitted. Try using the addOrUpdate() method. 

die addOrUpdate() von der Exception empfohlene Methode wird nur der Punkt eher früher für diese Zeit 12 Stunden anstelle ersten Daten überschreiben, als einen neuen zu machen. Ich möchte stattdessen die Daten im 12-Stunden-Format mit AM und PM anzeigen lassen.

Gibt es eine bequeme Möglichkeit, dies mit JFreeChart zu tun, oder würde es bequemer sein, den Code zu ändern, so dass meine Anrufe zu Renjin return etwas formatieren, anstatt einfach nur ganze Zahlen zwischen 1 und 24? (z. B. bereits formatierte Zeitzeichenfolgen)?

Cross-posted here.

Antwort

2

Ich bin nicht vertraut mit Renjin, aber unter der Annahme einer Date Wert darstellt Millisekunden seit dem epoch,

  1. Verwendung setDateFormatOverride() auf der Achse mit einem geeigneten SimpleDateFormat, z.B.

    axis.setDateFormatOverride(new SimpleDateFormat("hh:mm")); 
    
  2. TimeSeries „wird dafür sorgen, ... dass jede Periode höchstens ein Mal in der Serie erscheint.“ Dies sollte irrelevant werden, wenn der eingehende Wert korrekt konvertiert wird.

+1

große Arbeitete, hatte ich ein bisschen Casting zu tun, und dies war die letzte Zeile des Codes ich musste '((DateAxis) chart2.getXYPlot(). GetDomainAxis()). SetDateFormatOverride (neu Simple ("hh: mm a")); ' – jstrieb