[gelöst] TAChart zwei LineSeries normalisieren

Rund um die LCL und andere Komponenten
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[gelöst] TAChart zwei LineSeries normalisieren

Beitrag von Michl »

Hi,

ich möchte mehrere LineSeries normalisiert darstellen. Also sie sollen unabhängig von ihren tatsächlichen Werten in dem den Bereich von 0% bis 100% dargestellt werden.

Ich weiß, daß ich das beim Füllen der Series selbst berechnen kann. Nur würde ich gern wissen, ob das nicht schon von Haus aus bei TAChart implementiert ist (z.B. ein Property, was gesetzt werden muss).

So sieht es z.B. aus:
Chart1.png
Chart1.png (21.53 KiB) 766 mal betrachtet

So würde ich es gern haben:
Chart2.png
Chart2.png (22.64 KiB) 766 mal betrachtet

Testprojekt anbei.
Dateianhänge
ChartTest.zip
(2 KiB) 46-mal heruntergeladen
Zuletzt geändert von Michl am Mo 10. Jan 2022, 22:27, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: TAChart zwei LineSeries normalisieren

Beitrag von wp_xyz »

Es gibt mehrere Möglichkeiten, am wenigsten Code (keinen) muss man bei der folgenden Variante schreiben:
  • Eine zweite y-Achse einrichten: Rechtsklick auf AxisList im Object-Tree > "Add Item". Es entsteht eine zweite y-Achse. Du kannst sie mit Visible=false ausblenden oder auch stehen lassen - dann wäre sie auf der rechts Achse gut aufgehoben: Alignment = calRight.
  • Zwei TChartAxisTransformations-Komponenten aufs Formular klicken, jeweils eine TAutoScaleAxisTransform hinzufügen (nach Doppelklick auf der Transformations-Komponente)
  • Jeder y-Achse wird nun eine der Transformations zugewiesen: Im Object-Tree die linke Achse anklicken, der Transformations-Eigenschaft die 1.TChartAxisTransformations-Komponente zuweisen. Mit der rechten Achse und der zweiten Transformations-Komponente wiederholen.
  • Nun müssen wir noch sagen, welche Series welcher Achse zugeordnet sein soll. Jede Series hat dazu einen AxisIndexY - hier muss man den Index der gewünschten y-Achse eintragen. Bei der Series, die die linke y-Achse verwenden soll, wäre das die 0, bei der für die rechte y-Achse die 2.
  • Fertig. Jede Series wird nun auf den Maximal-Bereich skaliert und füllt den ganzen Chart aus.
  • Wenn du "schöne" Labels willst, kannst du z.B. den Range jeder Achse entsprechend setzen.
  • Damit man weiß, welche Series zu welcher Achse gehört, könnte man z.B. die Achse entsprechend der Series einfärben.
Dateianhänge
normalize_two_series.png
normalize_two_series.png (21.67 KiB) 750 mal betrachtet
normalize_two_series.zip
(2.27 KiB) 46-mal heruntergeladen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TAChart zwei LineSeries normalisieren

Beitrag von Michl »

Prima, funktioniert tadellos! :D
Da ich es dynamisch benötige, habe ich das darauf aufbauend lösen können. Vielen Dank!!

Als Gedächtnisstütze für mich oder nachfolgende Leser, so funktioniert das hier dynamisch (nullbasiert):

Code: Alles auswählen

procedure TForm1.CreateAxisForSeries(ALineSeries: TLineSeries);
var
  LAxis: TChartAxis;
  LAxisTransformation: TChartAxisTransformations;
  LAxisTransform: TAutoScaleAxisTransform;
begin
  LAxisTransformation := TChartAxisTransformations.Create(Self);
  LAxisTransform := TAutoScaleAxisTransform.Create(Self);
  LAxisTransform.Transformations := LAxisTransformation;
  LAxisTransform.MinValue := 0;
  LAxisTransform.MaxValue := 100;
  LAxis := Chart1.AxisList.Add;
  LAxis.Transformations := LAxisTransformation;
  LAxis.Visible := False;
  LAxis.Range.Max := ALineSeries.MaxYValue;
  LAxis.Range.Min := 0;
  LAxis.Range.UseMax := True;
  LAxis.Range.UseMin := True;
  ALineSeries.AxisIndexY := Chart1.AxisList.Count - 1;
end;   
Test anbei, sieht hier so aus:
Chart.png
Chart.png (33.66 KiB) 740 mal betrachtet
Dateianhänge
ChartNormalized.zip
(4.18 KiB) 37-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: [gelöst] TAChart zwei LineSeries normalisieren

Beitrag von wp_xyz »

Gut.

In diesem Zusammenhang vielleicht auch ein Hinweis auf die RunTime-FAQ-Seite im wiki: https://wiki.lazarus.freepascal.org/TAChart_Runtime_FAQ

Antworten