JFreeChart in einer dynamischen Aufzeichnung neue Serien hinzufügen?

endidu

Mitglied
Hallo,

ich lese ständig von einem Gerät Messwerte und zeichne die in einem XY-Graph, solange die Werte unter einer bestimmten Grenze liegen. Und wenn die Grenze überschritten wird, läuft die Aufzeichnung im Hintergrund, also Linie ist unsichtbar. Jetzt kommt meine Frage:

Wenn die Werte wieder unter die Grenze liegen, muss ich mit der Aufzeichnung wieder anfangen. Und ein zeitich begrenzter Abschnitt (z.B. 5 Sekunden) vor dem Unterschreiten muss auch mit aufgezeichnet werden. Also d.h. ich muss letzte 5 Sekunden immer irgendwo speichern, damit ich die später im Graph zeigen lassen kann.

ich habe ein
Java:
CombinedDomainXYPlot
mit 3 Subloten. Ich zeige jetzt nur eins:

Java:
aSerie = new TimeSeries("A");
aSerie.setMaximumItemAge(10*60*1000); //!< 10 Minuten Zeitfenster
aDataset = new TimeSeriesCollection(aSerie);
//! Neues NumberAxis("A");
aRange = new DefaultAutoAdjustNumberAxis("A"); 
aRange.setAxisLineVisible(true);
aRange.setTickMarksVisible(true);
aRange.setNumberFormatOverride(new DecimalFormat("###%"));
aRange.setAutoTickUnitSelection(true);
aRange.setDefaultAutoRange(new Range(0.0, 1.4));
aRange.setRange(0.0, 1.4); //!< y-Acshe: von 0% bis 125%
aRange.setTickLabelsVisible(true);
aRenderer = new XYLineAndShapeRenderer(false, false); //!< (Seriesunsichtbar, Sharpes unsichtbar)
aRenderer.setDrawSeriesLineAsPath(true); //!< minimiert die Anzahl von Java2D-Aufrufen
aRenderer.setSeriesPaint(0, Color.BLACK);
aRenderer.setSeriesStroke(0, 
					 new BasicStroke(2f, 
			  		 BasicStroke.CAP_BUTT, 
			  		 BasicStroke.JOIN_BEVEL)); 
//! Erzeugt ein neues Plot mit den spezifizierten Datensatz, Achsen und Renderer
aPlot = new XYPlot(aDataset, null,
			      aRange,
			      aRenderer);
aPlot.addRangeMarker(new ValueMarker(0.0));
plot.add(aPlot, 3);

Ich habe zuerst mit ArrayList versucht. Die letzte 5 Sekunden habe ich in einem ArrayList gespeichert. und wenn die Grenze wieder unterschritten wurde, habe ich den Inhalt des ArrayList im Graph aufgezeichnet. Aber ich finde diese Lösung nicht so elegant und das Programm wird auch ein bisschen langsamer. Deswegen wollte ich fragen, wie ich es mit dem Hinzufügen neuer Series hinkriegen kann. Meine Idee ist, dass ich mit dem Überschreiten der Grenze eine neue Serie erzeuge, die immer nur letzte 5 Sekunden speichert. Und diese serie mache ich dann beim Unterschreiten der Grenze wieder sichtbar.

ich habe sowas versucht aber ohne Erfolg:
Java:
private void makeSeries(){
	seriesNumber++;
	aSerie = new TimeSeries("A"); 
        aSerie.setMaximumItemAge(5000); // 5 Sekunden
	aRenderer.setSeriesLinesVisible(seriesNumber, false);
	aDataset.addSeries(aSerie);
}

Wenn die Grenze überschritten wird:
Java:
aDataset.getSeries(seriesNumber).addOrUpdate(packet.getTimestamp(), packet.getA());

und wenn die Grenze wieder unterschritten wird:
Java:
aDataset.getSeries(seriesNumber).addOrUpdate(packet.getTimestamp(), packet.getA());
aDataset.getSeries(seriesNumber).setMaximumItemAge(ZeusMenuBar.getInstance().getZeitfenster()*60); // 10 Minuten Zeitfenster
aRenderer.setSeriesLinesVisible(seriesNumber, true);

Danke im Voraus.
 
S

SlaterB

Gast
falls noch aktuell, dann musst du deine Frage grundsätzlich anders gestalten,
zwingend ist ein komplett läuffähiges Programm erforderlich,
und anscheinend irgendeine Ablaufbeschreibung, muss man irgendwo Button x drücken und 6 Min. später Button y?
 

endidu

Mitglied
Also ich mache ein Live-Charting.. man klickt auf das Start-Button, dann fängt die Aufzeichnung an..Die Werte werden ständig vom Gerät ausgelesen..d.h. mehr als 20 Abfragen pro Sekunde..

X-Achse besteht aus aktuellen Zeitstempeln und Y-Achse aus Werten von 0 bis 120.

Nehmen wir mal an, die Grenze liegt bei 100 und ausgelesene Werte zwischen 80-90. Dann werden diese Werte direkt nach dem Auslesen auch im Graph mit Zeitstempel aufgezeichnet. Aber wenn einer von ausgelesenen Werten zum ersten Mal über 100 liegt (z.B. 110), dann wird die Aufzeichnung gestoppt. Programm läuft aber weiter..also ohne Benutzerinteraktionen..

Nehmen wir jetzt mal an, nach 20 Sekunden wird ein Wert wieder unter 100..(z.B. 90).
Dann muss die Aufzeichnung wieder anfangen, aber nicht ab diesem Zeitpunkt sondern die letzte 5 Sekunden vor dem Unterschreiten muss auch mit aufgezeichnet werden. Und die erste Zeichnung bleibt auch noch im Graph. (Hab auch einen Scrollbalken implementiert).

Wenn die erste Aufzeichnung fertig ist, möchte ich mit einer neuen Serie, die nur 5 Sekunden aufzeichnet (aSerie.setMaximumItemAge(5000)), die Werte immer aufzeichen aber die Serie ist unsichtbar.. und wenn das Programm bemerkt, dass ein Wert wieder unter 100 liegt, soll dann diese Serie wieder sichtbar sein und das Zeitfenster wird wieder auf 10 Minuten eingestellt.(aSerie.setMaximumItemAge(10*60*1000)).

Hoffentlich konnte ich jetzt mein Problem ausführlicher beschreiben.

PS: Man kann die Werte durch das Drehen eines Button im Gerät erhöhen bzw. erniedrigen.
 

bERt0r

Top Contributor
Nunja, ich würde die Daten in einem Ringpuffer speichern. Du wirst ja die Daten mit einer fixen Rate einlesen. Du kalkulierst die Größe des Puffers einfach auf 5 Minuten und überschreibst dann einfach immer die alten Daten. Kommt ein gültiger Wert, holst du die Daten aus dem Ringpuffer und speicherst sie in deinen Chart.
[Edit] Damit mans besser versteht was ich meine:
Java:
MessObjekt[] puffer=new MessObjekt[6000];
int i=0;
public void addData(MessObjekt o)
{
   puffer[i]=o;
   i++;
   if(i==puffer.length)
   {
      i=0;
   }
}
[/Edit]
 
Zuletzt bearbeitet:

endidu

Mitglied
Danke für die Antwort. Sowas ähnliches habe ich auch mit ArrayList schon hingekriegt. Aber diese Lösung verlangsamt die Aufzeichnung ein bisschen. Deswegen wollte ich das Problem mit einem neuen TimeSeries lösen, wenn es geht.
 
S

SlaterB

Gast
womit wir wieder bei Antwort 1 wären
falls noch aktuell, dann musst du deine Frage grundsätzlich anders gestalten,
zwingend ist ein komplett lauffähiges Programm erforderlich,
und anscheinend irgendeine Ablaufbeschreibung, muss man irgendwo Button x drücken und 6 Min. später Button y?
 

endidu

Mitglied
Ja, hast Recht..eigentlich brauchte ich zuerst Ideen ob sowas machbar ist..

Aber das Problem hat sich erledigt.. Ich habe es gerade hingekriegt.. :)
ich schreibe die Methode noch hier, kann vllt noch jemandem weiterhelfen, der mit einem ähnlichen Problem hier landet.
Java:
private void makeNewSeries(){
	seriesNumber++;
	aSerie = new TimeSeries("A");
	aSerie.setMaximumItemAge(zBar.getInstance().getPreRollSecond()*1000); //5 Sekunden in diesem Fall
	aRenderer.setSeriesLinesVisible(seriesNumber, false);
	aRenderer.setDrawSeriesLineAsPath(true); // minimiert die Anzahl von Java2D-Aufrufen
	aRenderer.setSeriesPaint(seriesNumber, Color.BLACK);
	aRenderer.setSeriesStroke(seriesNumber, new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); 
	aDataset.addSeries(aSerie);
}

So markiere ich das Thema als erledigt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
H JFreeChart BarDiagramm Balken der gleichen Serie unterschiedliche Farbe zuordnen AWT, Swing, JavaFX & SWT 2
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H JFreeChart Charts überlagern AWT, Swing, JavaFX & SWT 2
C JFreeChart x-Achse mit absteigenden Werten AWT, Swing, JavaFX & SWT 1
K JFreeChart nicht ohne BarChartDemo startklar? AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
B JFreeChart Gantt Höhe Tasks AWT, Swing, JavaFX & SWT 1
V JFreeChart: Tooltip auf Knopfdruck anzeigen AWT, Swing, JavaFX & SWT 2
V JFreechart: In Linechart Linien einzeichnen und Bereiche färben AWT, Swing, JavaFX & SWT 4
M In JFreeChart Geraden erzeugen AWT, Swing, JavaFX & SWT 11
M JFreechart Zoom out AWT, Swing, JavaFX & SWT 2
M Swing JFreechart X-Achse Tick auslesen AWT, Swing, JavaFX & SWT 13
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
D JFreeChart range der Y Achse verändern. AWT, Swing, JavaFX & SWT 1
G JFreeChart - SetSeriesColor Problem AWT, Swing, JavaFX & SWT 3
K 2D-Grafik JFreeChart plot.setBackgroundImage() AWT, Swing, JavaFX & SWT 1
K 2D-Grafik JFreeChart DateAxis AWT, Swing, JavaFX & SWT 9
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
M JFreeChart in ein File schreiben (bzw. JFrame in ein File Schreiben) AWT, Swing, JavaFX & SWT 2
A JFreeChart in GUI AWT, Swing, JavaFX & SWT 3
E JFreeChart: Timeseries-Chart und Area-Chart "überlappen" lassen AWT, Swing, JavaFX & SWT 6
B JFreeChart-Erweiterungen AWT, Swing, JavaFX & SWT 4
I XML - JFreeChart AWT, Swing, JavaFX & SWT 15
N Dynamische JFreechart updated UI nicht AWT, Swing, JavaFX & SWT 5
S JFreeChart - Schriftgröße der Legende AWT, Swing, JavaFX & SWT 2
O Swing JFreechart subtitle formatieren AWT, Swing, JavaFX & SWT 3
N JFreeChart: Plot soll mit skalieren AWT, Swing, JavaFX & SWT 5
R JFreeChart Plots AWT, Swing, JavaFX & SWT 6
J JFreechart spezielles Balkendiagramm AWT, Swing, JavaFX & SWT 2
R JFreeChart: nur jeden n-ten Wert auf der X-Achse anzeigen AWT, Swing, JavaFX & SWT 5
R JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern AWT, Swing, JavaFX & SWT 8
T JFreeChart Linine einzeichnen AWT, Swing, JavaFX & SWT 2
M JFreeChart Ausrichtung der Balken AWT, Swing, JavaFX & SWT 2
R jFreeChart in eine NetBeans Projekt integrieren AWT, Swing, JavaFX & SWT 24
D JFreeChart Breite (width) ändern AWT, Swing, JavaFX & SWT 6
A Swing JFreeChart, Gantt, Schichtplan AWT, Swing, JavaFX & SWT 3
R JFreeChart Skalierung zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
F Wie lade ich eine CategoryDataset aus XML ins JFreeChart? AWT, Swing, JavaFX & SWT 9
J JFreeChart - mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
A JFreeChart: 2 X-Achsen für ein Dataset AWT, Swing, JavaFX & SWT 2
T JFreeChart export Problem AWT, Swing, JavaFX & SWT 4
S JFreeChart Achse immer sichtbar AWT, Swing, JavaFX & SWT 2
D JFreechart maximalangezeigter Wertebereich AWT, Swing, JavaFX & SWT 3
B AWT [JFreeChart] malt nicht so wie ich will :-( AWT, Swing, JavaFX & SWT 2
B JFreeChart Balkendiagramm ActionEvent AWT, Swing, JavaFX & SWT 2
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
A Schachbrettartiges Diagramm mit JFreeChart AWT, Swing, JavaFX & SWT 4
E JFreeChart AWT, Swing, JavaFX & SWT 2
L Gantt Chart - JFreeChart AWT, Swing, JavaFX & SWT 5
K JFreeChart im JScrollPane ausblenden AWT, Swing, JavaFX & SWT 2
L JFreeChart Labelrotation AWT, Swing, JavaFX & SWT 2
L JFreeChart Farbe von Balken AWT, Swing, JavaFX & SWT 5
L JFreeChart Balkenanordnung AWT, Swing, JavaFX & SWT 10
L JFreeChart Achsenskalierung AWT, Swing, JavaFX & SWT 4
L JFreeChart - Dataset befüllen AWT, Swing, JavaFX & SWT 2
L JFreeChart - Line Shapes AWT, Swing, JavaFX & SWT 15
N JFreeChart - Basics AWT, Swing, JavaFX & SWT 2
L NullPointerException JFreeChart AWT, Swing, JavaFX & SWT 10
L JFreeChart - Legende vertikal AWT, Swing, JavaFX & SWT 5
L JFreeChart - Linienstärke einstellen AWT, Swing, JavaFX & SWT 2
L JFreeChart Einstellungen AWT, Swing, JavaFX & SWT 22
L JFreeChart - Gitterfarbe schwarz AWT, Swing, JavaFX & SWT 4
L JFreeChart StackedBar + Line-Chart kombinieren AWT, Swing, JavaFX & SWT 4
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
L JFreeChart - Legende beliebig positionieren AWT, Swing, JavaFX & SWT 16
G JFreechart Balken einfärben AWT, Swing, JavaFX & SWT 6
F Probleme mit NumberAxis bei JFreeChart AWT, Swing, JavaFX & SWT 5
G jfreechart (Diagramm speichern mit ein vorgegebenen Namen) AWT, Swing, JavaFX & SWT 6
S JFreeChart neu zeichnen sich das Datenset geändert hat. AWT, Swing, JavaFX & SWT 4
K JFreeChart Eigentschaften des Charts ändern AWT, Swing, JavaFX & SWT 8
G JFreeChart und das updaten AWT, Swing, JavaFX & SWT 7
G Ausser Jfreechart, Chart Programme? AWT, Swing, JavaFX & SWT 11
S Dimensionen JFreeChart AWT, Swing, JavaFX & SWT 5
S JFreeChart Stufendiagramm AWT, Swing, JavaFX & SWT 2
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K JFreeChart: Platz zwischen Balken AWT, Swing, JavaFX & SWT 3
M JFreeChart Handbuch? AWT, Swing, JavaFX & SWT 8
P JFreeChart - TimeSeriesDiagram AWT, Swing, JavaFX & SWT 2
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben