JFreeChart - Value und veriable Zeitachse

Nisbo

Bekanntes Mitglied
Servus,

ich bin gerade auf JFreeChart gestoßen
http://www.jfree.org/jfreechart/download.html

und habe auch schon etwas damit rum experimentiert.

Was ich jetzt umsetzen möchte ist das ich z.B. eine Spannung / Strom / Leistung über einen variablem Zeitraum anzeigen lassen kann.

Der Wert selbst ist ja kein Problem aber wie funktioniert das mit der Zeitachse ?
Die Zeit liegt bei mir im Format: 2016-08-09 18:48:18.0 vor, kann ich aber natürlich noch umformatieren

Kann JFreeChart mit dem Format umgehen ? Messwerte liegen immer nur vor wenn sich was geändert hat, kann also mal 30 Minuten nichts sein oder in einer Minute 30 Änderungen.

Momentan mache ich die Grafikerstellung noch selbst ohne JFreeChart und berechne mir somit auch die X Achse selbst (siehe Screenshot) allerdings mit dem Nachteil das rechts immer der letzte Wert steht und nicht nur bis zu dem Zeitpunkt einer 24 Stundenachse gezeichnet wird welcher der letzte ist.

Kann sowas JFreeChart umsetzen ?
Hier gibt es ja ein Haufen toller Beispiele
http://www.java2s.com/Code/Java/Chart/CatalogChart.htm

nur welches davon sollte ich mir näher umsetzen für mein Vorhaben ?

Nochmal kurz, mein Hauptproblem liegt bei der X Achse mit der Timeline, dort möchte ich
- einmal ein 24 Stunden Zeitraum anzeigen lassen mit Beschriftungen von 0-24 Uhr mit passend dazu Einträgen welche aber nicht immer zur vollen Stunde vorliegen, das müsste JFreeChart dann schon selbst erkennen.

- das andere ist halt ein flexibler Zeitraum, dort müssten dann wie bei mir im Screenshot die Zeitmarken auch eingefügt werden.

Hoffe ich habe es einigermaßen gut erklärt, bin mir eigentlich ziemlich sicher das so ein riesen Projekt wie JFreeChart das kann nur brauche ich nen Stups in die richtige Richtung ;)
 

Anhänge

  • Screenshot_6.jpg
    Screenshot_6.jpg
    49 KB · Aufrufe: 34

mrBrown

Super-Moderator
Mitarbeiter
Der Wert selbst ist ja kein Problem aber wie funktioniert das mit der Zeitachse ?
Die Zeit liegt bei mir im Format: 2016-08-09 18:48:18.0 vor, kann ich aber natürlich noch umformatieren

Kann JFreeChart mit dem Format umgehen ? Messwerte liegen immer nur vor wenn sich was geändert hat, kann also mal 30 Minuten nichts sein oder in einer Minute 30 Änderungen.

Die Zeit sollte als Zeit vorliegen - also zB LocalDateTime - und nicht schon in irgendeiner Weise formatiert.
JFreeChart hat mWn ein eigenes Datumsformat, man sollte aber recht leicht aus LocalDateTime das passende erstellen.

Hier gibt es ja ein Haufen toller Beispiele
http://www.java2s.com/Code/Java/Chart/CatalogChart.htm

nur welches davon sollte ich mir näher umsetzen für mein Vorhaben ?

Das passendste sollte das TimeSeries-Beispiel sein

- einmal ein 24 Stunden Zeitraum anzeigen lassen mit Beschriftungen von 0-24 Uhr mit passend dazu Einträgen welche aber nicht immer zur vollen Stunde vorliegen, das müsste JFreeChart dann schon selbst erkennen.
- das andere ist halt ein flexibler Zeitraum, dort müssten dann wie bei mir im Screenshot die Zeitmarken auch eingefügt werden.

Man übergibt einfach die einzelnen Datenpunkte, der kleinste ist dann Start, der größte Endpunkt.
Start/Endpunkt kann man aber auch selbst setzten, damit erreicht man dann zB einen 24h-Zeitraum

Zeitmarken werden automatisch gesetzt in regelmäßigen Intervallen, das kann man aber auch verändern
 

Nisbo

Bekanntes Mitglied
Ja OK bei der Zeit fehlt das T noch
2016-08-09T18:48:18.0 das ist nicht das Problem, auch nicht die Umformatierung

JFreeChart hat mWn ein eigenes Datumsformat
das heißt es dann noch raus zu bekommen, denke mal Google wird da schon was ausspucken

Das passendste sollte das TimeSeries-Beispiel sein
die arbeiten da halt auch immer mit festen Werten in festen Intervallen

Start/Endpunkt kann man aber auch selbst setzten, damit erreicht man dann zB einen 24h-Zeitraum ... Zeitmarken werden automatisch gesetzt in regelmäßigen Intervallen, das kann man aber auch verändern
was es dann auch noch raus zu bekommen heißt

Momentan habe ich das so gelöst
Java:
final DefaultCategoryDataset dataset =
          new DefaultCategoryDataset( );

ResultSet rs4=connect2db().executeQuery("select * from history WHERE "
                    + "TYPE    = 'LACROSSE' AND "
                    + "DEVICE  = 'Terrarium.Sensor2' AND "
                    + "READING = 'temperature' AND "
                    + "TIMESTAMP < '" + this.datePickerTo.getDateTimeStrict().toString().replace("T", " ") + "' AND "
                    + "TIMESTAMP > '" + this.datePickerFrom.getDateTimeStrict().toString().replace("T", " ") + "' "
                    + "ORDER BY TIMESTAMP DESC"
                    );
       
            while(rs4.next())  {
                dataset.addValue(  rs4.getInt(6) , "Temperature" , rs4.getString(1) );
            }
       
       
            ResultSet rs5=connect2db().executeQuery("select * from history WHERE "
                    + "TYPE    = 'LACROSSE' AND "
                    + "DEVICE  = 'Terrarium.Sensor2' AND "
                    + "READING = 'humidity' AND "
                    + "TIMESTAMP < '" + this.datePickerTo.getDateTimeStrict().toString().replace("T", " ") + "' AND "
                    + "TIMESTAMP > '" + this.datePickerFrom.getDateTimeStrict().toString().replace("T", " ") + "' "
                    + "ORDER BY TIMESTAMP DESC"
                    );
         
            while(rs5.next())  {
                dataset.addValue(  rs5.getInt(6) , "Luftfeuchte" , rs5.getString(1) );
            }
       
       
        // create the chart...
        final JFreeChart chart      = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
     
        chartPanel.setPreferredSize(new Dimension(800, 600));
        chartPanel.setEnforceFileExtensions(false);
        chartPanel.setBounds(11, 11, 800, 600);
        chartPanel.setVisible(true);
        panel_2.add(chartPanel);
        panel_2.repaint();
was dann halt die Zeitachse unlesbar macht und auch die Werte nicht richtig anzeigt, die sind nicht komplett sortiert (siehe Screenshot) der rechts blaube Block hat wohl wie es ausschaut keine mit der Temperatur überlappenden Timestamps


Werde dann mal versuchen irgendwo noch Infos über TimeSeries von JFreeChart zu bekommen, danke erst mal bis hier her.


EDIT: TimeSeries is deprecated
 

Anhänge

  • Screenshot_7.jpg
    Screenshot_7.jpg
    110,9 KB · Aufrufe: 23
Zuletzt bearbeitet:

Nisbo

Bekanntes Mitglied
EDIT geht leider nicht mehr, laut Google ist wohl TimeSeries nicht deprecated !?!?

Was ich bisher raus bekommen habe
Java:
final TimeSeries s1 = new TimeSeries("Series 1");
        s1.add(new Minute(0, 0, 7, 12, 2003), 1.2);
        s1.add(new Second(0, 0, 0, 7, 12, 2003), 1.2);
Erwartet wird eine RegularTimePeriod

Ich denke mal ich habe es
Java:
final TimeSeries s1 = new TimeSeries("Series 1");
        //s1.add(new Second(0, 0, 0, 7, 12, 2003), 1.2);
       
        String mysqlDateStr = "2016-08-09 18:48:18.0";
        SimpleDateFormat standardDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
        java.util.Date myDate = null;
        try {
            myDate = standardDateFormat.parse(mysqlDateStr);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        s1.add(new Second(myDate), new Double(1.5807));
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Zur Darstellung zeitaufgelöster Daten ist ein CategoryPlot denkbar ungeeignet, wie du ja schon selber rausgefunden hast.
Du kannst für die Datenspeicherung jede beliebe XYDataset Implementierung verwenden. Es muss nicht unbedingt eine TimeSeriesCollection sein. Du musst lediglich dafür sorgen, dass die x-Werte im richtigen Bereich liegen. Letzten Endes verwendet JFreeChart für Zeitwerte long-Werte, die den Millisekunden seit dem 1.1.1970 entsprechen. Die ganzen RegularTimePeriod-Klassen dienen nur dazu, den Umgang mit den Werten zu vereinfachen und dem Benutzer Rechenarbeit zu sparen. Wenn man noch nicht verstanden hat, wie sie funktionieren, können sie allerdings auch etwas verwirrren.
Bliebe noch die Frage nach dem Format der Tick labels. Hierzu verwendet JFreeChart Instanzen von SimpleDateFormat. JFreeChart wählt je nach Wertebereich der x-Achse bzw. nach Länge des angezeigten Zeitbereichs ein zumindest halbwegs passendes Format (bei einem Zeitraum von wenigen Minuten werden auch die Sekunden angezeigt, bei mehreren Monaten nur noch Jahr und Monat). Damit das alles funktioniert, musst du lediglich dafür sorgen, dass die eine DateAxis als x-Achse verwendest.
Hier habe ich mal ein einfaches Beispiel für einen "Zeitchart" erstellt:
Java:
public class DateAxisPlot {

  public static void main(String[] args) {
  int count = 500;
  int series = 5;
  DefaultXYDataset dataset = new DefaultXYDataset();
  long start = System.currentTimeMillis();
  long increment = 1000*60*60; //20 min
  for(int s = 0; s < series; s++){
  double[][] data = new double[2][count];
  for(int i = 0; i < count; i++){
  data[0][i] = start + increment * i;
  data[1][i] = (s + 1)*i;
  }
  dataset.addSeries("Series " + s, data);
  }
  DateAxis xAxis = new DateAxis("Date axis");
  NumberAxis yAxis = new NumberAxis("y axis");
  XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(false, true);
  XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
  JFreeChart chart = new JFreeChart(plot);
  JFrame frame = new JFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(new ChartPanel(chart));
  frame.pack();
  frame.setVisible(true);
  }
}
So was könntest du für deine Daten auc verwenden. Du müsstest lediglich die Daten aus der db in die entsprechenden long- und double Werte umwandeln.
 

Nisbo

Bekanntes Mitglied
OK funktioniert :)

EDIT: mein funktioniert war auf meinen letzten Beitrag bezogen, die Antwort hatte ich in der Zwischenzeit noch nicht gesehen, danke auch Dir für die Antwort :)
 

Anhänge

  • Screenshot_8.jpg
    Screenshot_8.jpg
    72,3 KB · Aufrufe: 28

mrBrown

Super-Moderator
Mitarbeiter
Da schon ein Beispiel gepostet wurde spar ich mir mal ein zweites mit
TimeSeries und zwei Achsen, falls du doch eins willst melde dich ;)

Rein aus Interesse, was soll das mal werden? Hab nur Terrarium gelesen und es wurd interessant für mich :D
 

Nisbo

Bekanntes Mitglied
Hi mrBrown

ich habe zu Hause die Homeautomatisierung FHEM zu laufen, das soll ein Programm werden um die Daten aus der MySQL Datenbank auszulesen und grafisch darzustellen.

Das funktioniert soweit auch nur die grafische Darstellung hat mir nicht gefallen.

Da wird bzw meine bessere Hälfte auch ein Terrarium hat (Chamäleon) überwachen wir mit FHEM auch die Temperatur, die Luftfeuchte sowie die ganzen Lampen und Strahler.

All diese Daten möchte ich dann auch aufbereitet meinbem Weibchen zur Verfügung stellen denn die Übersicht in FHEM ist nicht gerade so toll. Evtl auch mal das sie dann selbst die Einschaltzeiten der Lampen einfach einstellen kann.

Ich werde das Programm wenn es fertig ist auch der FHEM Community natürlich kostenlos zur Verfügung stellen, aber bis dahin wird es noch ne Weile dauern. Die aktuelle Version die ich freigegeben habe liest nur jeweils einzelne Werte aus, also man hat nicht mehrere Werte in einem Diagramm oder mehrere Diagramme nebeneinander usw.
 

Harry Kane

Top Contributor
Du könntest auch einen JDBCXYDataset verwenden, musst dann aber die query so formulieren, dass sie den Anforderungen des JDBCXYDataset genügt (der ResultSet muss mindestens 2 Spalten enthalten, die erste für die x-Werte, die anderen für die y-Werte).
 

mrBrown

Super-Moderator
Mitarbeiter
Ich würde da gänzlich von der Herkunft der Daten trennen. Die Daten also erst in eigene Objekte überführen, und diese dann zum Diagramm generieren nutzen. uU kann man dann später noch auf JPA umstellen, oder die Daten über 'ne RestSchnittstelle bekommen, etc...
 

Nisbo

Bekanntes Mitglied
Eigene Objekte bei ner Datenbank wo ja schon alles drin ist ? Wenn nicht sogar noch besser :D

Aber so verkehrt ist die Idee nicht denn so könnte man so lange das Programm auf ist Daten "gecached" vorhalten was bei remote MySQL Verbindungen durchaus Sinn machen würde.

Im Endeffekt bin ich aber schon mit meiner TimeSeries Lösung zu Frieden
 

Anhänge

  • Screenshot_9.jpg
    Screenshot_9.jpg
    153,1 KB · Aufrufe: 18

mrBrown

Super-Moderator
Mitarbeiter
Eigene Objekte bei ner Datenbank wo ja schon alles drin ist ? Wenn nicht sogar noch besser :D

Aber so verkehrt ist die Idee nicht denn so könnte man so lange das Programm auf ist Daten "gecached" vorhalten was bei remote MySQL Verbindungen durchaus Sinn machen würde.

Objekte machen (fast) immer Sinn ;)
Generell ist es sinnvoll, das bekommen der Daten vom benutzen der Daten zu trennen. Eine Klasse soll eine Sache machen, und Laden und graphisch Aufbereiten wären zwei ;)

Im Endeffekt bin ich aber schon mit meiner TimeSeries Lösung zu Frieden
Das Problem was ich sehe, ist die eine Achse. Die muss ja fast immer auf den Bereich von 0-100 gestreckt sein, aufgrund der rLF, dabei ist das für die anderen beiden Werte völlig überflüssig ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JFreeChart (LineChart) akutalisiert nicht Java Basics - Anfänger-Themen 10
C JFreeChart Linie nicht korrekt dargestellt Java Basics - Anfänger-Themen 1
B Markieren einzelner Punkte in JFreeChart Java Basics - Anfänger-Themen 1
N JFreeChart --> TimeSeries auslesen Java Basics - Anfänger-Themen 9
J JFreeChart wird nicht angezeigt Java Basics - Anfänger-Themen 6
A JFreeChart als png abspeichern Java Basics - Anfänger-Themen 2
S Jfreechart mit LinkedList befüllen Java Basics - Anfänger-Themen 1
G JFreeChart | Plot updaten bei neuem Dataset | wahrscheinlich "Thread-abhängig" Java Basics - Anfänger-Themen 3
S JFreeChart - Speichermanagement Java Basics - Anfänger-Themen 6
M Problem JFreeChart Java Basics - Anfänger-Themen 8
M JFreeChart Java Basics - Anfänger-Themen 5
P JFreechart Java Basics - Anfänger-Themen 9
G JFreeChart und das Update(was nicht klappt). Java Basics - Anfänger-Themen 3
G jfreechart einbinden + tutorial Java Basics - Anfänger-Themen 2
G JFreeChart einbinden Java Basics - Anfänger-Themen 4
M JFreeChart nach erneutem aufruf fehlt 2. Achse Java Basics - Anfänger-Themen 4
N JFreeChart Koordinatenachsen Java Basics - Anfänger-Themen 11
G Problem mit der Darstellung (JFreechart) Java Basics - Anfänger-Themen 3
M jfreechart - Balkendiagramm mit Werten anzeigen, geht das? Java Basics - Anfänger-Themen 2
S JFreeChart Java Basics - Anfänger-Themen 4
L JFreeChart Java Basics - Anfänger-Themen 3
L JFreeChart in Eclipse Java Basics - Anfänger-Themen 5
S JFreeChart Java Basics - Anfänger-Themen 7
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
I JSON - cannot deserialize from Object value Java Basics - Anfänger-Themen 16
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
J Java call by Value oder Reference Java Basics - Anfänger-Themen 35
R Call-by-Value, Call-by-Reference, Call-by-Name Ausgabe Java Basics - Anfänger-Themen 1
D String value change listener Java Basics - Anfänger-Themen 2
G Java Object value und entity? Java Basics - Anfänger-Themen 2
ms_cikar Den Wert einer Hex. value bestimmten. Java Basics - Anfänger-Themen 8
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
F Entity vs value Java Basics - Anfänger-Themen 3
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
R Value von einem JSON-Objekt ausgeben Java Basics - Anfänger-Themen 4
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
E jProgressbar, 6 Versuche, welche value angeben ? Java Basics - Anfänger-Themen 3
G Klassen Call by Value auch bei Objekten? Java Basics - Anfänger-Themen 2
E Hash map Value Wert hochzuholen/ändern Java Basics - Anfänger-Themen 7
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
J Open Office Property Value mit Java aufrufen Java Basics - Anfänger-Themen 0
H call by reference & value Java Basics - Anfänger-Themen 14
R Property Value als null setzen Java Basics - Anfänger-Themen 1
O Erste Schritte TreeMap nach Value sortieren Java Basics - Anfänger-Themen 2
B Compiler-Fehler Hilfe!!! required variable ; found value Java Basics - Anfänger-Themen 4
M Arrays als return Value? Java Basics - Anfänger-Themen 2
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
T Schleifenindex "by reference" / "by value" Java Basics - Anfänger-Themen 13
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
C Probleme bei einem Stringvergleich - Attribut "value" unterscheidet sich Java Basics - Anfänger-Themen 9
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
D TreeMap: Höheren Key ermitteln und den Value liefern Java Basics - Anfänger-Themen 3
B Call by Value/Reference Java Basics - Anfänger-Themen 4
Todesbote Map (Key=String; Value = Vector) Value/Vector sortieren Java Basics - Anfänger-Themen 13
B Variablen unique Value Java Basics - Anfänger-Themen 12
R Key/Value ohne Maps? Java Basics - Anfänger-Themen 2
B Datentypen Key/Value sortieren Java Basics - Anfänger-Themen 15
S Warnung in Eclipse: unassigned closeable value Java Basics - Anfänger-Themen 20
J Objectreferenz statt value an Methode uebergeben? Java Basics - Anfänger-Themen 2
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
P Key anhand von Value finden (Hashtable) Java Basics - Anfänger-Themen 3
B JavaSkript Form-Tag Value & Post Java Basics - Anfänger-Themen 6
M String( char[] value ) Java Basics - Anfänger-Themen 3
feardorcha Java von Kopf bis Fuß "Java ist Pass-by-Value" Java Basics - Anfänger-Themen 6
M Value-returing Methode funktioniert nicht Java Basics - Anfänger-Themen 4
O Was bedeutet public class value? Java Basics - Anfänger-Themen 3
M jSpinner: nur angezeigte Value auslesen? Java Basics - Anfänger-Themen 3
F Erste Schritte return (char)toUnsignedInt(value) Java Basics - Anfänger-Themen 2
J unexpected type variable/value Java Basics - Anfänger-Themen 2
F Hilfe Regular Expression Grouping Value Java Basics - Anfänger-Themen 3
K unexpected type variable/value Java Basics - Anfänger-Themen 7
turmaline Duration Value Java Basics - Anfänger-Themen 8
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
K java pass by value Java Basics - Anfänger-Themen 29
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
A ein map key/value"problem" Java Basics - Anfänger-Themen 9
A Regex get Value Java Basics - Anfänger-Themen 5
D Key und Value aus hashMap speichern Java Basics - Anfänger-Themen 7
M HashMap-Value | Array Java Basics - Anfänger-Themen 3
N Methode erfüllt nicht den zweck (Call by value) Java Basics - Anfänger-Themen 17
0 Call by value Java Basics - Anfänger-Themen 3
H TreeMap.remove(value) - und nicht mit key! Geht das? Java Basics - Anfänger-Themen 18
H Abhängigkeiten (key-value ) Java Basics - Anfänger-Themen 19
P Value einer Konstante lesen Java Basics - Anfänger-Themen 2
lumo Magic Value?! Java Basics - Anfänger-Themen 19
S HashMap: Rückgabe des key zu bestimmten value Java Basics - Anfänger-Themen 3
K Maps mit veränderlichen Daten als Value Objekte Java Basics - Anfänger-Themen 3
D Hashtable Value(Array) in String und dann Ausgeben Java Basics - Anfänger-Themen 23
? key - value Struktur in ArrayList Java Basics - Anfänger-Themen 3
G Container für [key,value] elemente ? Java Basics - Anfänger-Themen 7
G Überprüfen ob einen Array einen Value enthält Java Basics - Anfänger-Themen 13
C Passing Reference by Value Java Basics - Anfänger-Themen 4
A Integer Value Error beim Start Java Basics - Anfänger-Themen 5
G jProgressBar value aus anderer Klasse heraus verändern Java Basics - Anfänger-Themen 7
F Hashtable mit String[] als value Java Basics - Anfänger-Themen 2
L HashMap Key<->Value vertauschen Java Basics - Anfänger-Themen 5
T Klasse String enthält Methode value? Java Basics - Anfänger-Themen 2
T Suche über mehrere Felder value = key = value Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben