[Gelöst] TChart Probleme mit mehreren Achsen.

Rund um die LCL und andere Komponenten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

[Gelöst] TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Hallo
Ich habe ein Problem mit TChar. Eigentlich wollte ich mir auch selbst eine Komponente schreiben, aber ich habe mir dann doch TChart noch mal angesehen.

Also, es geht darum dass ich ein Tagesverlauf von verschiedenen Werten als Kurve dastellen möchte.
Ich habe pro Stunde ca 12 Messungen, die Fasse ich zusammen und übergebe die dann an TChart:

Code: Alles auswählen

var
  i:integer;
  H,M,S,MS:Word;
begin
  DataContainer.LoadFromFile('/home/pluto/weather/data/raw/2015/2015-12/2015-12-25.txt',true);
  Chart1LineSeries1.SeriesColor:=clRed;
  Chart1LineSeries2.SeriesColor:=clBlue;
  Chart1LineSeries3.SeriesColor:=clLime;
  Chart1LineSeries4.SeriesColor:=clYellow;
 
  for i:=0 to DataContainer.Count-1 do begin
    DecodeTime(DataContainer[i].Time,H,M,S,MS);
 
    Chart1LineSeries1.AddXY(h,Double(DataContainer[i].Temp_out));
    Chart1LineSeries2.AddXY(h,Double(DataContainer[i].Temp_in));
    Chart1LineSeries3.AddXY(h,Double(DataContainer[i].Hum_out));
    Chart1LineSeries4.AddXY(h,Double(DataContainer[i].Hum_in));
  end;
  Chart1.AddSeries(Chart1LineSeries1);
  Chart1.AddSeries(Chart1LineSeries2);
  Chart1.AddSeries(Chart1LineSeries3);
  Chart1.AddSeries(Chart1LineSeries4);
Jedoch sind die XAchsen Eigenartig verschoben. Die ersten Vier. Ich würde gerne die ersten Vier ebenfalls bei der Pixel Position 0 Anfangen lassen.
Ich hoffe ihr wisst was ich meine.
Dateianhänge
TChart_Problem.jpg
Zuletzt geändert von pluto am Mo 28. Dez 2015, 17:25, insgesamt 1-mal geändert.
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart Probleme mit mehreren Achsen.

Beitrag von wp_xyz »

Zum Thema "mehrere Achsen" gibt es zwei Tutorials:
http://wiki.lazarus.freepascal.org/TACh ... is,_Legend
http://wiki.lazarus.freepascal.org/TACh ... _one_Chart

Übrigens: ich würde die Daten nicht gegen die Stunde plotten, das gibt beim Tageswechsel Chaos. Oder soll ab Mitternacht ein komplett neuer Datensatz begonnen werden?

P.S. Es würde nicht schaden, den Text vor dem Abschicken nochmals durchzulesen. Es verwirrt, wenn du von x-Achsen schreibst, aber y-Achsen meinst.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Danke für die Antworten, die Links bringen mich leidern nicht weiter. Mein Englisch reicht dafür leider nicht aus.
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart Probleme mit mehreren Achsen.

Beitrag von wp_xyz »

Dann musst du dir die Mühe machen, das was du hast, in einem kleinen compilierbaren Minimal-Projekt zusammenzustellen (nur pas, lfm, lpi und lpr-Datei, die Daten-Datei, keine exe, keine ppu, alles in 1 zip zusammengeschnürt und dieses hier hochgeladen).

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Das ganze ist bereits ein Test Projekt.

Ich hoffe ich habe keine Datei vergessen.
Du musst nur den Pfad der Datei anpassen, ich habe hier keine Relativen Verzeichnis Namen verwenden, wie sonst, sondern Absolute.
Dateianhänge
2015-12-25.txt
(17.64 KiB) 47-mal heruntergeladen
upldatacontainer.pas
(11.24 KiB) 59-mal heruntergeladen
CharTest.zip
(127.33 KiB) 59-mal heruntergeladen
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart Probleme mit mehreren Achsen.

Beitrag von wp_xyz »

Erzeuge ChartTest.zip bitte nochmals. Das kann ich nicht öffnen.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Zweiter versuch:
Dateianhänge
CharTest.zip
(127.33 KiB) 59-mal heruntergeladen
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Dritter Versuch, diesmal als ein "tar.gz"
Dateianhänge
CharTest.tar.gz
(127.33 KiB) 47-mal heruntergeladen
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart Probleme mit mehreren Achsen.

Beitrag von wp_xyz »

Kein Wunder, da hast du den Chart ziemlich ver"konfiguriert"... Ich habe mal alles wieder auf die Default-Werte zurückgesetzt und mich langsam vorgearbeitet.

Hier die wesentlichen Punkte (ich fürchte aber, ich vergesse einiges...):
- Bei Diagrammen mit mehreren y-Achsen brauchst du für jede y-Achse eine TChartTransformation-Komponente, der du jeweils durch Doppelklick eine Autoscale-Transformations hinzufügst. Wenn sich alle Achsen über die gesamte Höhe des Diagramms erstrecken sollen, kannst du bei den Voreinstellungen bleiben.
- Jeder y-Achse muss die entsprechende TChartAxisTransformation-Komponente zugewiesen werden (Property "Transformations").
- Jeder Series-Komponente, die auf einer der y-Achsen dargestellt werden soll, muss in der Property "AxisIndexY" der Index der entsprechenden y-Achse zugeordnet werden.

Damit müsste das Mehrachsendiagramm, nach Run, eigentlich schon laufen.

Verfeinerungen bei den Achsen:
- Achsentitel: Um die Beschriftung der neuen y-Achsen zu drehen, unter "Title.LabelFont.Orientation" den Wert 900 (Drehwinkel in Zehntel Grad) eintragen
- Achsenlinien einblenden: AxisPen.Visible = true
- Achsen dieselbe Farbe zuweisen wie den zugehörigen Series: AxisPen.Color, Title.labelFont.Color, Marks.LabelFont.Color, TickColor
- Bereich für Achsenbeschriftung festzurren: du möchtest die Temperaturachse immer zwischen -5 und 35° laufen lassen: Grenzen unter range.Min/Max eintragen, mit UseMin/UseMax aktivieren
- Überlappende Achsenbeschriftung: Kommt oft bei der x-Achse vor, wegen des begrenzten Platzes. Intervals.MinLength und Intervals.Maxlength vergrößern (das ist der minimale und maximale Abstand aufeinanderfolgender Labels in Pixeln)
- die überlagerten Kurven trennen, z.B. die Temperatur-Kurven auf die obere Hälfte des Diagramms beschränken, die Feuchtigkeitskurven auf den unteren: In der Autoscale-Transformation, die der Temperatur-Achse zugeordnet ist, als Minvalue 0.5 eintragen (MaxValue bleibt 1); in der Autoscale-tranformation der Feuchtigkeitsachse MaxValue = 0.5 (Minvalue bleibt 0) -- Diese Werte definieren die unsichtbare Achse, auf der alle Kurven gemeinsam geplottet sind - ich hatte das in dem einen Tutorial beschrieben (aber ich habe keine Lust das jetzt zu übersetzen...)
- usw/usw...

Ein paar Worte zu deinem Code:
- Du hast die 5 Series schon zur Designzeit erzeugt, dann darfst du nicht mehr Chart.AddSeries aufrufen - die sind ja schon da (man sieht sie nur nicht, weil ihnen noch keine Daten zugewiesen sind).
- In der Click-Routine des Einlesen-Buttons musst du mit Series.Clear zuerst die bereits vorhandenen Daten aus den Series löschen, sonst werden die neuen Daten an die alten angehängt, das ergibt manchmal ganz unverständliche Effekte.

Wiegesagt, wahrscheinlich fehlt etwas in dieser Aufzählung. Falls du nicht weiterkommst, melde dich nochmals.
Dateianhänge
chart_test_Forum_de.zip
(8.64 KiB) 61-mal heruntergeladen

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Ersteinmal vielen Dank für dein Beispiel.

Ich haben noch ein paar Fragen:
1: Warum bekomme ich ständig, wenn ich diese Komponente verwende von Lazarus eine
"Access violation."?
Das deutet auf mich darauf hin das irgendeine Klasse nicht Installisiert wurde. Ich kann das noch nicht 100% reproduzieren
Es liegt aber eindeutig an der TChart Komponente.

2: Die Luftfeuchtigkeit, ist leider zwischen 1.0 und 0.0, wie bekomme ich jetzt daraus "Ganze" zahlen?

3: Das gleiche gilt für den Luftdruckt.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Nachtrag:
Ebenfalls vielen Dank für deine Beschreibung.

Konnte die Bereiche der Y Achsen anpassen. Problem ist im Moment, dass die Kurve für den Luftdruck nicht richtig gezeichnet wird.

Die besagte Fehler Meldung scheint nur zu kommen, wenn ich mich in irgendein OI-Dialog befinde z.b. um die Achsen Einzustellen und dann klicke ich wieder auf die Komponente.
Bin mir aber noch nicht 100%ig sicher. Da jedesmal Lazarus ganz abstürzt.
Vielleicht mache ich dazu ein neuen Thread auf.

EDIT01:
Es scheint am ChartAxisTransformations Dialog zu liegen. Egal welches ich davon öffne. Wenn ich ein Item Anklicke und dann die Komponente, kommt die Fehler Meldung und Lazarus beendet sich.

EDIT02:
Aber scheinbar nicht sofort nach einem Neustart.

EDIT03:
Ich habe Lazarus in der Konsole gestartet um die Ausgaben sehen zu können, hier sind sie:

Code: Alles auswählen

 
TApplication.HandleException Access violation
  Stack trace:
  $00000000006B236D line 610 of include/customlistbox.inc
  $00000000013A3CF1 line 339 of editors/tasubcomponentseditor.pas
  $00000000008F2512 line 5902 of propedits.pp
  $000000000049BB4B line 1664 of main.pp
  $00000000008DC74F line 4337 of objectinspector.pp
  $00000000009E14D4 line 514 of customformeditor.pp
  $00000000004BE88A line 8476 of main.pp
  $00000000009F3980 line 2088 of ../designer/controlselection.pp
  $00000000009EF4CC line 1002 of ../designer/controlselection.pp
  $00000000009F4126 line 2254 of ../designer/controlselection.pp
  $00000000009D5A5D line 2101 of ../designer/designer.pp
  $00000000009D948D line 2939 of ../designer/designer.pp
  $00000000006886D4 line 2026 of include/control.inc
  $00000000006794F1 line 5342 of include/wincontrol.inc
  $0000000000760C95 line 112 of lclmessageglue.pas
  $0000000000713059 line 3628 of gtk2proc.inc
  $0000000000724B0C line 2238 of gtk2callback.inc
 
Was mich nur wundert: Das sind alles Dateien direkt von Lazarus, die nur wenig mit TChart zu tun haben....

EDIT04:
Nun habe ich es verstanden, die Scaler wird Automatisch eingestellt, nach dem Einlesen der Datei.

EDIT05:
Müssen die Y-Achse unbedingt mit Komma Zahlen sein? Z.b. für den Luftdruck:
Wenn ich bei Range UseMax und UseMin auf False setzte habe ich in der Scaler Werte zwischen 1 und 0. Wenn ich UseMax und UseMin auf True setzte, habe ich die Gewünschten Werte, nur dann wird die Kurve nicht mehr angezeigt. Das gleiche gilt für die Luftfeuchtigkeit.
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart Probleme mit mehreren Achsen.

Beitrag von wp_xyz »

Was meinst du mit "Scaler"?

Bzgl der Dezimalzahlen ist TAChart nicht ganz konsequent: Alleinige Zahlen (z.B. Axis.Range.Min) werden mit den FormatSettings des Systems erwartet, in Deutschland üblicherweise also mit Dezimalkomma (es sei denn, du hast dein System umgestellt). Zusammengesetzte Zahlen, z.B. in dem String "0.1|0.2|0.5" bei Axix.Intervals.NiceSteps" werden in die einzelnen Zahlenstrings zerlegt und dann mit amerikanischen Settings (Dezimalpunkt) umgewandelt - das werde ich demnächst ändern, so dass auch das Komma funktioniert...

TAChart ist üblicherweise sehr stabil, ich wüsste jetzt auch kein Szenario wie es zu einem Absturz der IDE kommen könnte. Wenn du den Absturz reproduzieren kannst, solltest du wieder ein Demoprojekt hochladen, das den Fehler zeigt. Nur so kann ich den Fehler finden und beseitigen.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

TAChart ist üblicherweise sehr stabil, ich wüsste jetzt auch kein Szenario wie es zu einem Absturz der IDE kommen könnte. Wenn du den Absturz reproduzieren kannst, solltest du wieder ein Demoprojekt hochladen, das den Fehler zeigt. Nur so kann ich den Fehler finden und beseitigen.
Das war dein Beispiel Projekt. Das reicht bereits voll und ganz aus, um Lazarus zum Absturz zu bringen.
Klick mal auf ein z.b. "Temp_ChartAxisTransformations" dann öffnet sich ein Dialog. Klicke da mal auf den ersten Eintrag und dann wieder auf die Komponente und das mach mal ein paar mal. Dieser Fehler ist mir bisher nur in diesem Dialog aufgefallen.
Ich vermute, hier wurde irgendwas vergessen zu Prüfen.
Ach ja: Der Fehler tritt nicht sofort auf, sondern erst nach kurzer Zeit.


Mit Scaler meinte ich " Axix.Intervals.NiceSteps", was genau bedeuten die drei Werte?
Mir ist aufgefallen, zur Desinger Zeit, habe ich "komma" zahlen und zur Laufzeit, wenn ich Werte geladen habe stimmt es. Problem ist jetzt:
Der Luftdruck sieht "Komisch" aus.

Im Bild im Anhang kann man das gut sehen: Der macht ein sehr Starken Sprung bzw. es ist eine sehr Starke Steigung zu erkennen.
Die andere Werte sehen richtig aus.

Ich finde die Komponente ist sehr Kompliziert aufgebaut. Das PlotPanel kann jedoch nur eine Y Achse. Sonst wäre sie einfacher.

Hast du ein Link mit einer Deutschen Beschreiben? Wie was zusammengehört? Deine Beschreibung ist schon gut, ich werde sie mir noch einmal durchlesen. Selbst wenn ich mit Suche z.b. mit Google, finde ich kaum Sinnvolle Erklärungen zur der Komponente, schon gar nicht in Deutsch.
Dateianhänge
ChartImage.png
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TChart Probleme mit mehreren Achsen.

Beitrag von pluto »

Mir ist gerade aufgefallen: Die Außen Temperatur sieht man auf dem Diagramm nicht.

EDIT01: Die Außen Temperatur sehe ich jetzt wieder es lag an der Chart1LineSeries1.AxisIndexX
MFG
Michael Springwald

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart Probleme mit mehreren Achsen.

Beitrag von wp_xyz »

Das war dein Beispiel Projekt. Das reicht bereits voll und ganz aus, um Lazarus zum Absturz zu bringen.
Welche Lazarus-Version hast du denn? Bei mir (trunk) stürzt nichts ab.
Mit Scaler meinte ich " Axix.Intervals.NiceSteps", was genau bedeuten die drei Werte?
Die Intervals.NiceSteps bezeichnen Vorzugswerte, auf die die Achsenlabels gerundet werden sollen. "0.1|0.2|0.5" heißt, dass die Labels, je nach Dekade, Vielfache von 0.1, 0.2 oder 0.5 sind. Weil bei der Labelberechnung aber Kompromisse eingegangen werden müssen, können auch andere Werte auftauchen. Falls die Labelberechnung sich z.B. für den Wert 0.5 entscheidet und der Wertebereich an der Achse zwischen -12 und 16 liegt, werden folgende Labels gezeichnet: -10, -5, 0, 5, 10, 15. wenn die Entscheidung auf 0.2 fällt, wären die Labels: -12, -10, -8, -6, .., 12, 14, 16.
Der Luftdruck sieht "Komisch" aus.
Der Chart zeichnet deine Daten -> schau dir mal deine Daten-Datei an bzw. prüfe deinen TFLDataContainer. Am Chart liegt's bestimmt nicht.
Ich finde die Komponente ist sehr Kompliziert aufgebaut. Das PlotPanel kann jedoch nur eine Y Achse. Sonst wäre sie einfacher.
Kann schon sein. Aber ein mehrachsiges Diagramm, wenn man mit der Software nicht vertraut ist, gehört auch nicht zu den leichtesten Übungen, mit keiner Software. Da musst du durch - hinterher wundert man sich, warum man es nicht gleich verstanden hat.
Hast du ein Link mit einer Deutschen Beschreiben? Wie was zusammengehört? Deine Beschreibung ist schon gut, ich werde sie mir noch einmal durchlesen. Selbst wenn ich mit Suche z.b. mit Google, finde ich kaum Sinnvolle Erklärungen zur der Komponente, schon gar nicht in Deutsch.
Tut mir leid, aber Lazarus hat User auf der ganzen Welt, und es ist Zeitverschwendung, irgendetwas auf Deutsch zu dokumentieren. Hast du schon mal Google-Translate o. ä. probiert? Aber wenn du ernsthaft programmieren willst, kann ich dir nur raten, Englisch zu lernen.
Die Außen Temperatur sieht man auf dem Diagramm nicht.
Da hat meine Demo einen Fehler: In der Achsenzuordnung (AxisIndexX, AxisIndexY) der LineSeries1 sind x und y Achse vertauscht.

Antworten