[gelöst] TChart mit zwei Y-Achsen mit Anzeige einer Teilkurve

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
RainerP
Beiträge: 16
Registriert: Di 16. Mär 2021, 10:52
OS, Lazarus, FPC: Windows ( Lazarus V2.0.12 ) / Mac ( Lazarus V2.2.2 )
CPU-Target: xxBit
Wohnort: Austria, Nenzing
Kontaktdaten:

[gelöst] TChart mit zwei Y-Achsen mit Anzeige einer Teilkurve

Beitrag von RainerP »

Hallo zusammen,

Habe ein Problem mit T-Chart und komme da nicht weiter.
Ich habe zwei Line Series.
Die Daten gehen bei beiden in der X-Achse von 0.0 - 0.1
Die linke Achse geht bei der Y-Achse von ca. -0.2 - 0.2
Die rechte Achse hat Daten von 0.0 - 1.4
Ich möchte jedoch nur die Daten von 0.8 - 1.4 anzeigen und dies mit der selben Skalierung
den Daten der Linken Achse überlagern.

Leider schaffe ich es nicht und es werden die Daten immer 1:1 angezeigt.
Es wird auch die linke Achse auf 0-1.4 Skaliert statt auf -0.2 - 0.2

Jede Y Achse hat eine eigne AutoScaleTransform.

Im Code setze ich die Werte so:
// left axis
EpplerCalcForm.EpplerChart.AxisList.Axes[1].Range.Min := -0.2;
EpplerCalcForm.EpplerChart.AxisList.Axes[1].Range.Max := 0.2;
EpplerCalcForm.LeftAxisTransformationAutoScaleAxisTransform1.MinValue := EpplerCalcForm.EpplerChart.AxisList.Axes[1].Range.Min;
EpplerCalcForm.LeftAxisTransformationAutoScaleAxisTransform1.MaxValue := EpplerCalcForm.EpplerChart.AxisList.Axes[1].Range.Max;
EpplerCalcForm.EpplerChart.AxisList.Axes[1].Range.UseMax := TRUE;
EpplerCalcForm.EpplerChart.AxisList.Axes[1].Range.UseMin := TRUE;
// right axis
EpplerCalcForm.EpplerChart.AxisList.Axes[2].Range.Min := 0.8;
EpplerCalcForm.EpplerChart.AxisList.Axes[2].Range.Max := 1.4;
EpplerCalcForm.RightAxisTransformationAutoScaleAxisTransform1.MinValue := EpplerCalcForm.EpplerChart.AxisList.Axes[2].Range.Min;
EpplerCalcForm.RightAxisTransformationAutoScaleAxisTransform1.MaxValue := EpplerCalcForm.EpplerChart.AxisList.Axes[2].Range.Max;
EpplerCalcForm.EpplerChart.AxisList.Axes[2].Range.UseMax := TRUE;
EpplerCalcForm.EpplerChart.AxisList.Axes[2].Range.UseMin := TRUE;


Habe ich hier einen Denkfehler?
Die Skalierung soll identisch sein 1:1, jedoch auf der rechten Achse eben nur von 0.8 - 1.4 anzeigen.

Vielen Dank und SG
Rainer
Zuletzt geändert von RainerP am Mo 10. Okt 2022, 13:37, insgesamt 1-mal geändert.
Immer Gut Licht und vergesst die schatten nicht!
Rainer Primosch

https://primosch.art

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

Re: TChart mit zwei Y-Achsen mit Anzeige einer Teilkurve

Beitrag von wp_xyz »

Eins ist höchstwahrscheinlich falsch, nämlich dass du die Grenzen des Axis.Range (.Max und .Min) als MaxValue und MinValue Werte der AutoScaleAxisTransform einträgst. Das sind zwei völlig verschiedene Dinge - und das erinnert mich daran, wie lange ich gebraucht habe, die Achsensysteme von TAChart zu verstehen...

Versetze dich zurück in die gute alte Zeit, als man Diagramme noch auf dem schönen orangen Millimeter-Papier gezeichnet hat. Das Papier (im Querformat) hat vielleicht eine Einteilung von 20cm horizontal und 12cm vertikal. TAChart nennt das "Graph"-Einheiten. Nun zeichnest du eine vertikale Achse links und beschriftest sie mit -0.2 ganz unten (bei yg = 0 cm) und mit +0.2 ganz oben (bei yg = 12 cm). -0.2 und 0.2 sind bei TAChart Werte in "Achsen-Einheiten", denn das ist das, was an der Achse steht. Die Zuordnung von Graph- zu Achsen-Einheiten - das ist das, was die AutoScaleAxisTransform macht. yg=0 entspricht dem AutoScaleAxisTransform.MinValue und yg=20 entspricht dem AutoScaleAxisTransform.MaxValue.

Du könntest aber auch sagen: Ich setze AutoScaleAxisTransform.MaxValue auf 10 - dann würde das Diagramm nur die untere Hälfte des Blattes ausfüllen. Und wenn du eine zweite Achse mit einer weiteren AxisTransform hast, die .Minvalue auf 10 und .maxValue auf 20 hat, dann würde dieser Plot die obere Hälfte des Blattes einnehmen. Das ist die Grundidee hinter den "paned charts". Aber das nur nebenbei...

Verstehe ich richtig, dass die zweite Kurve (die auf der rechten y-Achse geplottet wird) sich über den Bereich 0 bis 1.4 erstreckt, du aber nur die Werte zwischen 0.8 und 1.4 darstellen willst? Heißt das, dass die Achse sich nur über den Bereich 0.8 - 1.4 erstrecken soll? Die Werte außerhalb würden dann durch Clipping verschwinden.

Für diesen Fall habe ich ein Beispiel beigefügt: die rote Kurve ist die auf der linken Achse (die natürlich auch rot ist) und geht von -0.2 bis 0.2. Die blaue Kurve ist auf der rechten Achse, enthält Daten zwischen 0 und 1.4; die Achse ist aber so beschriftet, dass nur die Werte zwischen 0.8 und 1.4 sichtbar sind (die anderen bekommt man z.B. durch Verschieben des Ausschnitts mit der rechten Maustaste zu Gesicht...).
Dateianhänge
two_axes.zip
(2.32 KiB) 23-mal heruntergeladen

RainerP
Beiträge: 16
Registriert: Di 16. Mär 2021, 10:52
OS, Lazarus, FPC: Windows ( Lazarus V2.0.12 ) / Mac ( Lazarus V2.2.2 )
CPU-Target: xxBit
Wohnort: Austria, Nenzing
Kontaktdaten:

Re: TChart mit zwei Y-Achsen mit Anzeige einer Teilkurve

Beitrag von RainerP »

Hallo WP_XYZ,

vielen Dank für die Erklärung und das Beispielprojekt.
Damit konnte ich mein Problem fix lösen!!!

Es ist sagenhaft wie schnell ich eine Lösung für mein Prblem hatte!

Vielen Dank und SG
Rainer
Immer Gut Licht und vergesst die schatten nicht!
Rainer Primosch

https://primosch.art

Antworten