TAChart untypische X-Achse - wie umgehen ?

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

Ich schreibe an einer Applikation die Blutzuckerwerte vernünftig darstellen soll, da es für meine Meßgeräte (Contour) kein Programm für Linux gibt (Der erste Teil, die Daten zu bekommen ist mal halbwegs gelöst).

Ich habe die Daten generell im Format
X= Datum + Uhrzeit im ISO8601 Format
Y = der gemessene Wert.

Die Daten sind für die Auswertung in einer TCollection in den Items gespeichert. Ich habe zum Beispiel die Daten von einem Monat, drei Monate, wie auch immer in der Collection. Die Collection kann ich zum Beispiel nach Datum/Zeit sortieren und im TAChart anzeigen. Das geht so halbwegs.

Sortiere ich die Daten jetzt nach Uhrzeit (oder auch Wochentag) gruppiert, kann ich diese nicht im Chart nach Stunden aufgegliedert anzeigen. Ich bräuchte auf der X-Achse die Stunden (oder Wochentage) angezeigt - auch von den Stunden (Tagen) an denen es keine Daten gibt.

Nur irgendwie fehlt mir da die Kenntnis von TAChart. Und in den ganzen Beispielen die mitgeliefert sind, ist IMHO nichts dabei wo ich Verständnis finden kann. Das "Population 2" kommt noch am nähesten, ich habe es aber nicht geschafft daraus was zu machen.

Ich habe ein Demoprogramm beigelegt, das Demodaten erzeugen kann und auch anzeigen (zumindest die Datum/Zeit sortierten). Ist für "Fixes" backported.

Vielleicht kann mir jemand einen Schubs (oder Tritt in den A) geben.

Anleitung:
*) Starten
*) Enable Frame drücken
*) Demo Data drücken

-> Test DT = Auswertung nach Datum/ Zeit (hier einmal auf ein Monat begrenzt)
-> Test T = Wäre Auswertung nach Tag - aber hier keine Ahnung

Die jeweiligen sortierten Daten liegen im Grid unter Daten.
Dateianhänge
Bildschirmfoto vom 2026-01-12 11-42-21.png
Bildschirmfoto vom 2026-01-12 11-42-21.png (65.79 KiB) 295 mal betrachtet
AnalyseDemo.zip
(101.06 KiB) 50-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 503
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von Zvoni »

Hmm....
Heisst:
Du willst z.B. auf den 13. November "reinzoomen", hast aber das Problem, dass du für eine 24h-Zeitachse keine Daten zu "jeder" Stunde hast, korrekt?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

Ich will nicht reinzoomen. Sondern die Daten sauber nach X Achse angezeigt.

Du brauchst als Diabetiker einfache Infos, wo du in der Therapie ansetzt. Daher zum Beispiel ob es immer um eine Uhrzeit oder mit einem Tag eine Aufälligkeit gibt.

Beispiel immer am Sonntag, nach Omas Backwaren stimmt der Blutzucker nicht :mrgreen: Dann muss man halt, die Oma an verschiedenen Tagen besuchen um die Statistik auszugleich. :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 503
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von Zvoni »

Versteh ich noch immer nicht so ganz.

Ich hab mich halt auf dies hier bezogen
Ich bräuchte auf der X-Achse die Stunden (oder Wochentage) angezeigt - auch von den Stunden (Tagen) an denen es keine Daten gibt.
Erinnert mich stark an das Thema "Calendar-Table", was ich von Datenbanken her kenne
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

Das Kalendertage Problem habe ich hier nicht direkt, da man das alles sehr gut rechnen kann. Eine TList oder Collection ist gleich "on the fly" gerechnet.
Das Problem ist die extreme flexibilität von TAChart. Da ist soviel zur Design Zeit an 1000 stellen zu konfigurieren, das man ohne erste Anleitung oft "lost" ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
kupferstecher
Beiträge: 437
Registriert: Do 17. Nov 2016, 11:52

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von kupferstecher »

Das heißt du willst z.B. die Aufzeichnung von 10 Wochen in einem einwöchigen Diagramm übereinanderlegen, sodass man Systematiken sieht?

In dem Fall könntest du für jede Woche eine eigene Kurve in das gemeinsame Diagramm schreiben, dann wären sogar Linien zwischen den Punkten möglich. Ich vermute da geht es nicht ohne eigene Datenaufbereitung im Hintergrund.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

kupferstecher hat geschrieben: Mo 12. Jan 2026, 13:09 Das heißt du willst z.B. die Aufzeichnung von 10 Wochen in einem einwöchigen Diagramm übereinanderlegen, sodass man Systematiken sieht?

In dem Fall könntest du für jede Woche eine eigene Kurve in das gemeinsame Diagramm schreiben, dann wären sogar Linien zwischen den Punkten möglich. Ich vermute da geht es nicht ohne eigene Datenaufbereitung im Hintergrund.
Wie im Beispiel ist es besser mit Punkten zu arbeiten. Die Datenaufbereitung im Hintergrund ist NICHT das Problem. Nur die Darstellung im TAChart.

Und diese Grafiken sind nichts spezielles, was ich mir ausgedacht habe, sondern für die Insulintherapie/Diabetestherapie normal. Nur sind die vorhandenen Programme entweder für Android/iOS mit (verkaufbaren)Daten in der Cloud oder für Windows only.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 503
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von Zvoni »

Auf Basis von kupferstechers Antwort hab ich es jetzt verstanden.

Hmm...... ich glaube ich hab sowas in Excel.... müsste mal schauen, wie da die Achsenzuweisungen heissen.

Läuft im Prinzip darauf hinaus, dass deine X-Achsen-Beschriftung z.B. deine Wochentage sind.
Deine sequentiellen Daten musst du dann aber in ein "2D"-Format bringen (Spalten=Wochentage, Zeilen=Die "eigentliche" Woche).
Und das wäre der "Datenbereich"
Wenn ich mich recht erinner, ist dann so eine "Zeile" in den 2D-Daten eine "SeriesCollection" oder so ähnlich

EDIT: Ich glaub ich hab was gefunden:
https://wiki.freepascal.org/TAChart_doc ... ed_sources
Stichwort: Multi-Valued Sources
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von wp_xyz »

Ich verstehe das so, dass du alle vielen Datenpunkte nach Wochentagen (oder Stunden) gruppieren möchtest. Ein Chart würde dann 7 (bzw. 24) x-Werte enthalten.

Du speicherst deine Daten nicht im Chart, sondern in einer externen Collection, und verwendest eine UserDefinedChartSource, um diese externen Daten in den Chart zu übertragen. Das ist gut so, denn du musst nun nicht die Originaldaten manipulieren, und hast alle Freiheit, die Daten neu zu arrangieren.

Das Bindeglied zwischen Chart und externer Datenquelle ist wiegesagt die UserDefinedChartSource. Hier kannst du sagen, was X und Y sind.

Die Daten nach Wochentagen zu gruppieren, geht ganz einfach. Übergib an AItem.X (der x-Wert des Datenpunktes) nicht den volle Datum/Zeitwert, sondern die Nummer des Wochentags (oder der Stunde), und schon hast du alle Messwerte für alle Sonntage (oder für die Zeit zwischen 12:00 und 12:59:59) untereinander, und dein Chart hat nur noch 7 (bzw 24) Werte auf der x-Achse:

Code: Alles auswählen

procedure TFrameAnalyseDM.UDFCSGetChartDataItem(
  ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
var
  tmp: integer;
  tmpDT: TDateTime;
begin
  tmpDT := BL.Items[AIndex].DT;
  //AItem.X := tmpDT;                      // Datum/Zeit der Messung beibehalten
  AItem.X := DayOfWeek(tmpDT);             // Messwerte nach Wochentagen gruppieren
  // AItem.X := HourOf(tmpDT);             // Messerte nach Stunden gruppieren
  AItem.Y := BL.Items[AIndex].mgdl;
  if (AItem.Y < OG) and (AItem.Y > UG) then
    AItem.Color:= clGreen
  else
    AItem.Color:= clRed; 
end;
Du musst die DateTimeIntervalChartSource als Marks.Source von der x-Achse lösen. Beim Gruppieren nach Stunden kannst du die x-Einteilung so lassen, denn die Achsen-Ticks entsprechen dann genau den Stunden. Bei der Gruppierung nach Wochentagen hättest du wahrscheinlich den Namen der Wochentage an der Achse. Das, denke ich, geht am einfachsten, indem du eine TListChartSource hinzufügst und mit Marks.Source der x-Achse verbindest. In dieser ChartSource erzeugst du 7 Werte mit der Zuordnung der Wochentagsnummer zum Wochentagsnamen (ich besetze immer x und y gleichzeitig, damit man die richtigen Daten auch bei gedrehter Achse richtig hat):

Code: Alles auswählen

  with ListChartSource1 do
  begin
    Clear;
    Add(1, 1, 'So');     
    Add(2, 2, 'Mo');
    Add(3, 3, 'Di');
    Add(4, 4, 'Mi');
    Add(5, 5, 'Do');
    Add(6, 6, 'Fr');
    Add(7, 7, 'Sa');
  end;
  Chart1.BottomAxis.Marks.Source := ListChartSource1;
  Chart1.BottomAxis.Marks.Style := smsLabel;;
end;
Welche Datenmanipulation gerade zu verwenden ist, wird wahrscheinlich mit einer Combobox, Buttons, Checkboxes etc. festgelegt. Immer wenn sich diese ändern schaltest du im OnGetChartData der UserDefinedChartSource die entsprechende Gruppierung frei und aktivierst du zugehörige ChartSource für die Achsenbeschriftung.

Siehe beigefügtes modifiziertes Projekt.

Wahrscheinlich wird man an der großen Streuung der Daten keine systematischen Trends a la "Besuch bei Oma am Sonntag --> hoher Zuckerwert" erkennen können. Daher würde ich noch eine Mittelwertbildung einschalten. Entweder überträgst du dafür deine Daten in eine Datenbank und verwendest "GROUP BY" Anweisungen, oder du nimmst ein Array[WochenTage] bzw. Array[Stunden], in das du alle Messwerte einsortierst und dann am Ende den Mittelwert je Wochentag/Stunde bildest und erst diese plottest. Im Demo-Projekt ist das nicht enthalten
Dateianhänge
analyse_demo_wp.zip
(8.74 KiB) 193-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

Danke für das modifizierte Projekt, da habe ich jetzt etwas zum Durcharbeiten.
wp_xyz hat geschrieben: Mo 12. Jan 2026, 16:35 Wahrscheinlich wird man an der großen Streuung der Daten keine systematischen Trends a la "Besuch bei Oma am Sonntag --> hoher Zuckerwert" erkennen können. Daher würde ich noch eine Mittelwertbildung einschalten. Entweder überträgst du dafür deine Daten in eine Datenbank und verwendest "GROUP BY" Anweisungen, oder du nimmst ein Array[WochenTage] bzw. Array[Stunden], in das du alle Messwerte einsortierst und dann am Ende den Mittelwert je Wochentag/Stunde bildest und erst diese plottest. Im Demo-Projekt ist das nicht enthalten
Die Streung in den Daten ist klar, da ich gaussisch verteilte Zufallsdaten genommen habe. Im medizinischen Bereich tauchen die eher glockenfärmig auf, weil man ja einen Zielwert hat, den man erreichen möchte. Genaugenommen haben die Daten nach unten eine natürliche Grenze (=tödlich) und nach oben genaugenommen auch (delirium/tod), das ist einmal nicht berücksichtigt, aber die Demodaten sind in einem Bereich der so vorkommen kann.

Mittelwerte etc. sind bei den Detailgrafiken nicht wirklich Aussagekräftig - die Daten gehen ja nicht an Manager. Erfahrunggemäss brauchen nur Manager Mittelwerte, da sie mit diesen alles mögliche kaschiert sehen wollen (20 jahre Praxis erlebt).

Mein Ziel ist es, so nahe an diese Standardgrafiken heran zu kommen.

Als Beispiel reale Daten:
Screenshot 2026-01-12 175834.png
Screenshot 2026-01-12 175834.png (23.72 KiB) 182 mal betrachtet
Screenshot 2026-01-12 175910.png
Screenshot 2026-01-12 175910.png (33.96 KiB) 182 mal betrachtet
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von wp_xyz »

Diese Screenshots gehen noch einen Schritt weiter als mein Code: Hier ist im x-Wert die Uhrzeit beibehalten.

Für den Wochentags-Plot musst du damit im OnGetChartData-Event AItem.X := WeekDay(tmpDT) + frac(tmpDT) nehmen, und für den StundenPlot den Datumsanteil abtrennen und nur die Nachkomma-Stellen verwenden (das ist bei TDateTime ja die Uhrzeit).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

wp_xyz hat geschrieben: Mo 12. Jan 2026, 19:12 Diese Screenshots gehen noch einen Schritt weiter als mein Code: Hier ist im x-Wert die Uhrzeit beibehalten.

Für den Wochentags-Plot musst du damit im OnGetChartData-Event AItem.X := WeekDay(tmpDT) + frac(tmpDT) nehmen, und für den StundenPlot den Datumsanteil abtrennen und nur die Nachkomma-Stellen verwenden (das ist bei TDateTime ja die Uhrzeit).
Hab ich schon gemacht, nachdem ich es langsam verstehe.

Code: Alles auswählen

  
case cbGroupBy.ItemIndex of
    1: AItem.X := DayOfWeek(tmpDT)*1.0 + frac(tmpDT);
    2: begin
         DecodeTime(tmpDT,H,N,S,MS);
         AItem.X := H*1.0 + (N/60);
       end
  else
    AItem.X := tmpDT;
  end;
Bildschirmfoto vom 2026-01-12 20-09-54.png
Bildschirmfoto vom 2026-01-12 20-09-54.png (37.58 KiB) 165 mal betrachtet
Bei mir tun sich noch Fragen auf, kann man die Minor-Linien auch so wie im Beispiel definiert zeichnen ?
Bei der Hintergrundseinfärbung ist mir klar wie das geht, wenn ich alles einfärben will, wenn ich aber die 3 Bereiche extra einfärben will anhand der OG und UG, muss ich das rechnen oder bekomme ich die Koordinaten der Linien heraus und kann damit die Bereiche dynamisch ausfüllen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von wp_xyz »

Zu den eingefärbten Bereichen: Sowas macht man mit Hilfe der Marks.Stripes der Achse, von der die Bereiche ausgehen. Man setzt ein TChartStyles auf das Formular und verbindet es mit Axis.Marks.Stripes. Ein Klick auf den '...' neben der Styles-Property öffnet den Styles-Editor. Füge drei Styles hinzu: der erste ist zwischen -unendlich und dem 1.Marker (75), der zweite zwischen dem 1. und 2. Marker (135), und der dritte für darüber. Gib jedem Style.Brush die gewünschte Farbe, schalte Pen.Style auf psClear, weil deine Vorlage keine Umrandungslinien hat. Die anderen Properties brauchst du in dieser Anwendung nicht (normalerweise verwendet man Styles für Series mit mehreren y-Werten, um jeder y-Stufe ein eigenees Aussehen zu geben).

Ordne mal spaßeshalber diese ChartStyles der LeftAxis zu: Du erhältst eine sich wiederholende Abfolge der drei Farben jeweils zwischen zwei benachbarten Achsenmarkern.

Das ist so nicht gewünscht. Als erstes musst du die Schwellwerte definieren, bei denen die Bereiche wechseln (75 und 135). Nimm dafür wieder eine ChartListSource und verbinde sie mit LeftAxis.Marks.Source. Jetzt hast du die drei Farbbereiche allein, aber die normale Achsenbeschriftung wurde durch die Werte in der ListChartSource ersetzt.

Im letzten Schritt definierst du nun eine zweite y-Achse. Standardmäßig umfasst sie genau denselben Bereich wie die erste y-Achse. Entferne die ChartStyle und die ListSource von der ersten y-Achse und ordne sie der zweiten y-Achse zu --> voila!

Wenn du die Beschriftung der beiden Schwellwerte auf der rechten Seite haben willst, mache das Alignment der 2. y-Achse zu calRight. Oder, wenn du die Zahlen nicht angezeigt haben willst, lasse die 2. y-Achsle mit dem Alignment auf calLeft, aber setze Marks.Visible auf false und, damit auch die Ticks verschwinden, setzte TickLength und TickInnerLength auf 0.
Dateianhänge
stripes.zip
(2.38 KiB) 177-mal heruntergeladen

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

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von wp_xyz »

Hier nun auch noch ein Vorschlag für die Achsenbeschriftung. Nicht ganz trivial... Aber mit einer zweiten Achse und einer Minor-Achse klappt es so ungefähr. In dem Beispiel-Projekt sind die entsprechenden Änderungen im Code gemacht, so dass ich mir diesmal das "Tutorial" erspare.
Dateianhänge
Achsenbeschriftung.zip
(3.76 KiB) 178-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7062
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TAChart untypische X-Achse - wie umgehen ?

Beitrag von af0815 »

Danke, da habe ich einiges zum Verdauen und Verstehen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten