Laden...

[erledigt] zedGraph macht Graphen "komisch"

Erstellt von Benns vor 16 Jahren Letzter Beitrag vor 16 Jahren 5.224 Views
B
Benns Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren
[erledigt] zedGraph macht Graphen "komisch"

Hallo,

ich habe ein Programm geschrieben, welches mir über RS232 ein Messgerät abfragt, die Werte aufbereitet und in eine Datei abspeichert. Zusätzlich habe ich mit zedGraph ein Live-Diagramm eingebunden. Hiermit habe ich aber ein kleines Problem. Das Bild zeigt einen solchen Graphen:

Bei der untersten (schwarzen) Kurve sieht man das Phänomen: es wird erste eine durchgehende Gerade über die gesamte Anzeigenbreite gemalt und dann zusätzlich die wirklichen Werte aufgetragen. Erst wenn das Diagramm in der x-Achse mitscrollt verschindet die durchgehende Linie. Hier noch kurz der Code mit dem ich meinen Graphen erzeuge:

GraphPane myPane = zgc.GraphPane;

            myPane.Title.Text = "Druck und Temperatur der Versuche vom\n"+DateTime.Now;
            myPane.XAxis.Title.Text = "Versuchszeit";
            myPane.YAxis.Title.Text = "Druck oder Temperatur";

            myPane.XAxis.Scale.Min = 0;
            myPane.XAxis.Scale.Max=200;
            myPane.XAxis.Scale.MinorStep = 1;
            myPane.XAxis.Scale.MajorStep = 5;

            
            RollingPointPairList ListDaten = new RollingPointPairList(200);

            #region Graph erzeugen
            double time = Environment.TickCount - tickstart / 1000;


                PointPairList list0 = new PointPairList();
                list0.Add(time, daten[0].Messwert);
                LineItem myCurve = myPane.AddCurve("Messkanal 0"+daten[0].Einheit, list0, Color.Red, SymbolType.Diamond);

                PointPairList list1 = new PointPairList();
                list1.Add(time, daten[1].Messwert);
                LineItem myCurve1 = myPane.AddCurve("Messkanal 1", list1, Color.Blue, SymbolType.Circle);
            
                PointPairList list2 = new PointPairList();
                list2.Add(time, daten[2].Messwert);
                LineItem myCurve2 = myPane.AddCurve("Messkanal 2", list2, Color.Green, SymbolType.Plus);
            
                PointPairList list3 = new PointPairList();
                list3.Add(time, daten[3].Messwert);
                LineItem myCurve3 = myPane.AddCurve("Messkanal 3", list3, Color.Black, SymbolType.Square);
            
                PointPairList list4 = new PointPairList();
                list4.Add(time, daten[4].Messwert);
                LineItem myCurve4 = myPane.AddCurve("Messkanal 4", list4, Color.Magenta, SymbolType.Star);
            #endregion

            
            SetSize();
            zgc.AxisChange();

daten[] ist dabei ein struct-Array mit meinen Messwerten und anderen für mich wichtigen Daten, die zur Messung gehören.

Habt ihr eine Idee wie ich dieses Verhalten des Diagramms abstellen kann? Meine Vermutung ist ja, dass

RollingPointPairList ListDaten = new RollingPointPairList(200);

irgendwie die PointPairList vorbesetzt und ich diese erst mit meinen eigentlichen Werten überschrieben muss. Aber wie kann ich das direkt zu Beginn meiner Messung machen? Stimmt die Vermutung überhaupt?

Vielen Dank schon mal

Benjamin

S
85 Beiträge seit 2007
vor 16 Jahren

Wenn eine Linie doppelt erscheint, dann war die Liste meist nicht leer.

Daher lösche ich immer erst die Liste mit List.Clear() und lasse ZedGraph immer komplett neu zeichnen mit zedGraphControl1.Invalidate()

Ist schon eine Weile her und ich musste jedes Diagramm aus den kompletten Daten neu erzeugen, vielleicht hilft das aber.

S
506 Beiträge seit 2006
vor 16 Jahren

mhhh das ist wirklich komisch. Hast du mal deine messdaten kontrolliert, ob das nicht doch richtig dargestellt wird?

Ich hab leider keine ahnung wo der unterschied von eine RollingPointPairList zu einer "normalen" PointPairList ist. Aber hast du mal probiert ne andere Punktliste zu nehmen?

B
Benns Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo Sangyo, hallo Stu42,

mit List.Clear() erreiche ich leider nichts, denn dann wird mit dem nächsten eingelesenen Messwert halt die durchgezogene Linie auf einer anderen Höhe neu gezeichnet. zedGraphControl1.Invalidate() benutze ich eh nach jedem Messzyklus um das Diagramm zu aktualisieren.

ich habe die RollingPointPairList benutzt um den Live-Graphen anzeigen zu können. Habe jetzt mal testweise die einfach PointPairList benutzt, aber die zeigt das gleiche Verhalten. Nur dass nach einer längeren Messzeit das Programm abstürzt, weil ja die PointPairList immer länger wird. Bei der RollingPointPairList werden halt die alten Einträge automatisch entfernt, das habe ich jetzt für meinen Test nicht manuell implementiert.

Die Darstellung ist definitiv falsch, denn es gibt die letzten Messwerte ja noch gar nicht, die rufe ich ja erst später ab: Ich nehme alle 5 Sekunden einen Messwert, Mein Diagramm zeigt mir immer die letzten 200 Sekunden an. Aber bereits nach der ersten Messung werden die durchgezogenen Graphen angezeigt.

Danke fürs Mitdenken

Benjamin

S
506 Beiträge seit 2006
vor 16 Jahren

ich hab gerade was gelesen zu der RollingList gelesen

/// A class that provides a rolling list of <see cref="PointPair" /> objects.
/// This is essentially a
/// first-in-first-out (FIFO) queue with a fixed capacity which allows 'rolling'
/// (or oscilloscope like) graphs to be be animated without having the overhead of an
/// ever-growing ArrayList.
///
/// The queue is constructed with a fixed capacity and new points can be enqueued. When the
/// capacity is reached the oldest (first in) PointPair is overwritten. However, when
/// accessing via <see cref="IPointList" />, the <see cref="PointPair" /> objects are
/// seen in the order in which they were enqeued.

**capacity is reached the oldest (first in) PointPair is overwritten. **

also der fängt von vorne an den buffer neu zu beschreiben, wenn du ihn nicht erweiterst.

B
Benns Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Stu42,

das ist richtig, hatte ich ja auch geschrieben: "...Bei der RollingPointPairList werden halt die alten Einträge automatisch entfernt...". Soll ja auch so sein, weil ich ja einen rolling graph (immer die letzten 200 Sekunden) haben möchte. Das erklärt aber immer noch nicht warum ich diese durchgezogene Linie angezeigt bekomme.

Ich habe mir mal die RollingPointPairList als Text ausgeben lassen und festgestellt, dass das erste Punktepaar immer (28426562, 0) ist. Daher stammt auch die Linie, die gar keine Waagerechte ist, sondern im angezeigten Ausschnitt nur so aussieht. Jetzt muss ich mal versuchen das erste Element der Liste zu löschen. Das funktioniert mit list.RemoveRange(0,1) ganz gut, list.Remove(0) hingegen gibt immer die Meldung, dass der Index nicht vergeben ist.

Benjamin