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:
So würde ich es gern haben:
Testprojekt anbei.
[gelöst] TAChart zwei LineSeries normalisieren
[gelöst] TAChart zwei LineSeries normalisieren
- Dateianhänge
-
ChartTest.zip
- (2 KiB) 57-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;
Re: TAChart zwei LineSeries normalisieren
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 (21.67 KiB) 885 mal betrachtet
-
normalize_two_series.zip
- (2.27 KiB) 59-mal heruntergeladen
Re: TAChart zwei LineSeries normalisieren
Prima, funktioniert tadellos!
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):
Test anbei, sieht hier so aus:

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;
- Dateianhänge
-
ChartNormalized.zip
- (4.18 KiB) 48-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: [gelöst] TAChart zwei LineSeries normalisieren
Gut.
In diesem Zusammenhang vielleicht auch ein Hinweis auf die RunTime-FAQ-Seite im wiki: https://wiki.lazarus.freepascal.org/TAChart_Runtime_FAQ
In diesem Zusammenhang vielleicht auch ein Hinweis auf die RunTime-FAQ-Seite im wiki: https://wiki.lazarus.freepascal.org/TAChart_Runtime_FAQ