[gelöst] TAChart: Darstellung mit mehreren Achsen

Rund um die LCL und andere Komponenten
Antworten
Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

[gelöst] TAChart: Darstellung mit mehreren Achsen

Beitrag von Thomas B. »

Hallo zusammen,

ich programmiere schon seit längerem (hobbymäßig) mit Lazarus und war bisher mit der TAChart Komponente unzufrieden.
Wie ich auf dem letzten Forumstreffen schon mal angedeutet hatte, störte mich insbesondere die fehlende
Möglichkeit in einem Liniendiagramm bei 2 verschiedenen Reihen von X-Y-Werten mit stark unterschiedlichen Y-Werten
diese gemeinsam in einem Diagramm sinnvoll darzustellen. Beispielsweise ergeben sich für Sin(x) und Sin(x)+5000
nur 2 gerade (horizontale) Linien als Darstellung in einem Diagramm.
Abhilfe bisher: bei einer der Datenreihen (z.B. bei Sin(x)+5000) den Offset-Wert bzw. die Skalierung "manuell" anpassen,
dann verliert man aber in der Darstellung die Information, bei welchen Y-Werten die Daten eigentlich liegen.

Ich bin deshalb froh, dass mit der neuen 0.9.28 Lazarus Version die TAChart Komponente weiter verbessert wurde,
und jetzt u.a. verschiedene Achsen in der Darstellung definierbar sind.

Ich habe ein bisschen herum probiert, und testweise nachfolgenden Code geschrieben:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Data1 := TLineSeries.Create(Chart1);
  Data2 := TLineSeries.Create(Chart1);
 
  Chart1.AddSeries(Data1);
  Chart1.AddSeries(Data2);
 
  // Linenbreite von 1 auf 3 erhöhen
  Data1.LinePen.Width := 3;
  Data2.LinePen.Width := 3;
 
  Data1.LinePen.Color := clBlack;
  Data2.LinePen.Color := clBlue;
 
  // Extend.UseXMax etc. sind bereits auf true gesetzt
  Chart1.Extent.XMin := -10;
  Chart1.Extent.XMax := 10;
  Chart1.Extent.YMin := -3;
  Chart1.Extent.YMax := 3;
 
  fxValue := -10;
  Chart1.AxisList.Axes[2].Scale := 7; // jeweils anpassen
  Chart1.AxisList.Axes[2].Offset := 5000; // jeweils anpassen
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var y1,y2: Double;
begin
  If fxValue < 10 then begin
    y1 := Sin(fxValue) + 0.5*(Random-0.5);
    y2 := 20*Cos(fxValue) + 5000; // Wertebereich = 5000 +/-20
 
    // Korrektur vom Funktionswert für die Anzeige
    y2 := (y2 - Chart1.AxisList.Axes[2].Offset) / Chart1.AxisList.Axes[2].Scale;
 
    Data1.AddXY(fxValue,y1);
    Data2.AddXY(fxValue,y2);
 
    fxValue := fxValue + 0.2;
  end else
    Timer1.Enabled := false;
end;
Der Timer1 hat ein Intervall von 100 ms und soll eine fortschreitende Datenaufnahme (hier Datenberechnung) simulieren.
Die Uses Einbindung von TASeries nicht vergessen. fxValue habe ich als private Double definiert.
Um den gesamten Datenbereich gleich zu Anfang dargestellt zu bekommen, lässt sich Chart1.Extent entsprechend anpassen.
Dafür musste man bisher XGraphMax verwenden.
Im Anhang dann das Bild, so wie's bei mir aussieht.

Meine Fragen an euch:
- Hat jemand schon einige Erfahrung mit TAChart gesammelt und kann hilfreiche Links zu Beispielen etc. geben?
- Vielleicht habe ich die Darstellung/Umrechnung der zweiten Datenreihe zu umständlich gemacht. Geht das auch anders (einfacher)?
- Lassen sich die Zahlen auf rechten Achse auch blau (so wie die dazu gehörige Kurve) darstellen? Bei den Grid-Linien geht das bereits.

So das wäre dann mein erster (und etwas längerer) Beitrag im Forum.
Thomas B.
Dateianhänge
PictureForm1.jpg
Zuletzt geändert von Thomas B. am So 16. Mai 2010, 13:25, insgesamt 1-mal geändert.

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TAChart: Darstellung mit mehreren Achsen

Beitrag von Linkat »

Hallo Thomas B.,
ich beschäftige mich auch gerade mt der 'neuen' TAChart-Komponente. Bin überrascht über den Fortschritt in Lazarus 0.9.28. Leider kann ich dir bei deinem zwei Achsen-Problem nicht weiterhelfen.Ich versuche gerade verzweifelt TFuncSeries zu verstehen. Über einen Link zu Beispiel-Programme würde ich mich auch sehr freuen.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Update zur TAChart Komponente

Beitrag von Thomas B. »

Die TAChart Komponente ist in der neuen Lazarus Version 0.9.29 nochmals deutlich verbessert worden.
Zum Teil ausführliche Beispiele zu den neuen Funktionen sind zu finden unter: ...\Lazarus\components\tachart\demo
Speziel zum Thema skalierbare zusätzliche Achsen gibt es auch eine eigenes Demoprogramm

@Linkat: schau mal unter ...\tachart\demo\func --> das müsste Dir weiterhelfen

Gruß Thomas

Antworten