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;
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.