Sign in Join
Wiki copytemporary

TAChart Tutorial: BarSeries/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: TAChart Tutorial: BarSeries/de

OldNewLine
1+## Einführung
2+
3+![](/wiki-images/b/b1/BarSeries_finished.png%E2%80%8E)
4+
5+Die `TAChart`-Bibliothek kann eine Vielzahl von Diagrammen in Lazarus erstellen. Aber im Vergleich zu anderen Serientypen scheinen Balken-Plots schwieriger zu sein, vor allem, weil es eine Vielzahl von Möglichkeiten gibt:
6+
7+- Nebeneinander angeordnete Balken
8+- Gestapelte Balken
9+- Gestapelte Balken, auf 100 % normiert
10+- Vertikale Balken
11+- Horizontale Balken
12+
13+In diesem Tutorial möchten wir dir die Grundidee zeigen, wie du ein Diagramm mit mehreren nebeneinander angeordneten Balkenreihen erstellen kannst. In einem [[TAChart Tutorial: Stacked BarSeries|Nachfolge-Tutorial]] lernst du, wie man die Balken übereinander stapeln kann.
14+
15+Neben Balkenserien stellt dieses Tutorial auch `TRandomChartSource` vor, eine praktische Datenquelle zum Entwerfen und Testen eines Diagramms, ohne die Anwendung kompilieren zu müssen.
16+
17+Du benötigst Grundkenntnisse in Pascal und Lazarus. Wirf einen Blick auf das [[TAChart Tutorial: Getting started/de|TAChart Tutorial: Getting started]], um einige grundlegende Fähigkeiten für die Arbeit mit `TAChart` zu erlernen, wenn diese Bibliothek neu für dich ist. Wir empfehlen auch, die [[TAChart documentation|TAChart-Dokumentation]] zu studieren.
18+
19+## Vorbereitung
20+
21+### Einrichten des Diagramms
22+
23+Erstelle ein neues Projekt und speichere es. Platziere eine `TChart`-Komponente aus der Lazarus-Komponentenpalette auf dem Formular `Form1` und ziehe ihre Größe soweit auf, dass sie den gewünschten Bereich des Formulars ausfüllt.
24+
25+### Daten zum Plotten
26+
27+Bevor wir fortfahren, müssen wir uns überlegen, welche Daten wir darstellen wollen. Vielleicht könntest du das Guthaben deiner Giro- und Sparkonten verwenden, oder die Geschäftsergebnisse großer Unternehmen, die irgendwo im Internet zu finden sind, oder etwas ganz anderes ...
28+
29+Gehen wir dieses Mal einen anderen Weg: Warum zeichnen wir nicht einfach zufällige Daten? Natürlich haben diese keine Bedeutung, aber sie sind einfach und sehr bequem zum Üben. Insbesondere enthält `TAChart` die Komponente [[TAChart documentation|TRandomChartSource]], die Zufallsdaten bereitstellt, die zur Entwurfszeit nahtlos in einer Datenreihe eingefügt werden können. Das bedeutet, dass du diesem Tutorial folgen kannst, ohne eine Codezeile schreiben zu müssen und ohne die Demo-Anwendung kompilieren zu müssen. Später, wenn die Layoutarbeiten abgeschlossen sind, kannst du die `RandomChartSources` entfernen und durch ChartSources mit "echten" Daten ersetzen.
30+
31+Wie wir gleich sehen werden, gibt es im Chart drei Serien, jede davon mit – sagen wir – vier Balken. Für jede Serie benötigst du eine Datenquelle. Wiegesagt, wir nehmen eine `TRandomChartSource`. Um diese verfügbar zu machen, wirf einen Blick auf die "Chart"-Komponentenpalette - es ist das vierte Symbol in der Palette und im folgenden Screenshot rot hervorgehoben:
32+
33+![](/wiki-images/8/8b/TChart_Palette_RandomChartSource.png)
34+
35+Füge dem Formular drei RandomChartSources hinzu – eine pro Serie. Benenne sie um in `RedChartSource`, `BlueChartSource` und `YellowChartSource` um, da sie mit "roten", "blauen" und "gelben" Balkenreihen verknüpft werden sollen (man sollte immer lieber "sprechende" Variablennamen verwenden.)
36+
37+Zuvor müssen wir die RandomChartSources einrichten, da sie standardmäßig keine Daten liefern. Wir wollen vier Balken pro Serie haben. Setze daher die Eigenschaft `PointsNumber` auf 4. Damit die Achsenbeschriftungen mit den Balken synchron sind, muss die `x`-Achse zwischen 1 und 4 liegen (oder zwischen 0 und 3, oder zwischen 0 und 39, was auch immer du möchtest - wir werden später genauer auf die Achsenbeschriftungen eingehen): `XMin = 1, XMax = 4`. Und schließlich müssen wir auch den `y`-Achsenbereich angeben, vielleicht wählst du `YMin = 0` und `YMax = 100`.
38+
39+## Balkenserie
40+
41+### Serie hinzufügen
42+
43+Nachdem alle Vorbereitungen abgeschlossen sind, können wir die Balkenserie zum Diagramm hinzufügen. Klicke doppelt auf dem Diagramm, um den Reiheneditor zu öffnen, dann auf „Hinzufügen“ und wähle aus der Liste den Eintrag „Balkenserie“ aus. Dasselbe zweimal wiederholen, so dass wir am Ende drei Balkenserien im Chart haben. Wir sehen sie im Diagramm noch nicht, weil sie noch nicht mit unseren Daten verknüpft sind. Im Objektbaum des Objektinspektors erscheinen die Serien jedoch als Unterknoten des "Chart"-Knotens.
44+
45+Klicke auf die erste Reihe im Objektbaum und gehe im Objektinspektor zur Eigenschaft `Source`; wähle den Eintrag `RedChartSource` aus der Liste aus. Jetzt wird die Reihe im Diagramm sichtbar. Um sie "rot" zu machen, gehe Sie zur Eigenschaft `SeriesColor` und wählen die Farbe `clRed`. Benenne Sie die Datenreihe um nach „RedBarSeries“ und ändere ihren Titel zu „red“. Letzteres ist für die Legende, die wir aktivieren, indem wir `Legend.Visible` des Chart auf `true` setzen.
46+
47+Wiederhole das mit den anderen beiden Serien entsprechend.
48+
49+![](/wiki-images/2/28/AllBarSeries.png)
50+
51+Jetzt zeigt der Chart die Balkenserien an. Die Balken befinden sich jedoch jeweils auf demselben Wert der `x`-Achse, die gelben Balken werden teilweise von den anderen Balken verdeckt. Das wollen wir jetzt beheben.
52+
53+### Nebeneinander angeordnete Balken
54+
55+Um die Balken jeder Gruppe (d. h. Balken, die demselben `x`-Wert zugeordnet sind) nebeneinander anzuordnen, müssen wir sie horizontal verschieben. `TBarSeries` bietet zu diesem Zweck zwei Eigenschaften:
56+
57+- `BarWidthPercent`
58+- `BarOffsetPercent`
59+
60+Beide Zahlen werden in Prozent des Abstands zur nächsten Balkengruppe ausgedrückt. (In manchen Diagrammen sind die Balken nicht äquidistant und erhalten daher unterschiedliche Balkenbreiten. Um in einem solchen Fall eine konstante Balkendicke zu erreichen, setze die Eigenschaft `BarWidthStyle` auf `bwPercentMin`.)
61+
62+Die Grundidee ist, dass der Raum zwischen den Balkengruppen (100%) durch die Balken und etwas Leerraum zur nächsten Gruppe geteilt wird. Wenn wir zwischen den Gruppen eine Lücke von beispielsweise einer Balkenbreite lassen wollen, müssen wir 100 % durch 4 teilen (3 Balken plus Lücke), d. h. jeder Balken kann eine Breite von 25 % einnehmen.
63+
64+Setzen wir also `BarWidthPercent` auf 25 und sehen, was passiert. Oh - nicht ganz das, was wir wollten: Die Balken sind zwar schmaler geworden, aber sie überlappen sich immer noch. Dies geschieht natürlich, weil wir den Parameter `BarOffsetPercent` nicht geändert haben.
65+
66+Derzeit ist `BarOffsetPercent` null, was bedeutet, dass sich die Mitte jedes Balkens genau an der Position des Achsenstrichs befindet. Wir müssen die roten Balken nach links und die gelben Balken nach rechts so verschieben, dass sie die in der Mitte verbleibenden blauen Balken berühren. Die Verschiebungsdifferenz beträgt eine Balkenbreite, also 25 %. Um die roten Balken nach links zu verschieben, muss ihr `BarOffsetPercent` negativ sein.
67+
68+Zusammenfassend verwenden wir die folgenden Werte:
69+
70+- `RedBarSeries: BarOffsetPercent = -25, BarWidthPercent = 25`
71+- `BlueBarSeries: BarOffsetPercent = 0, BarWidthPercent = 25`
72+- `YellowBarSeries: BarOffsetPercent = 25, BarWidthPercent = 25`
73+
74+![](/wiki-images/0/09/AllBarSeries-side-by-side.png)
75+
76+## Achse
77+
78+### Achsenbeschriftung
79+
80+Das nächste zu behandelnde Problem ist die `x`-Achse. Normalerweise stellen Balkendiagramme die Kategorien von Datensätzen dar, was häufig Textbeschriftungen unter jeder Balkengruppe erfordert. Aber bisher haben wir hier nur numerische Bezeichnungen. Außerdem sind die Zwischenbeschriftungen bei halben Zahlen unschön.
81+
82+Der beste Weg, dies richtig zu machen, ist, eine zusätzliche ChartSource für die Zuordnung der Zeichenketten zu den Achsenwerten zu verwenden. Es ist diesmal eine `TListChartSource`, die als zweites Symbol in der Palette der Diagrammkomponenten zu finden ist. Klicke sie auf das Formular und nenne sie in `LabelsChartSource`.
83+
84+Die `ListChartSource` hat einen eingebauten Datenpunkt-Editor, der es ermöglicht, Daten zur Entwurfszeit einzugeben. Wählen die `LabelsChartSource` an und gehe im Objekt-Inspektor zur Eigenschaft `DataPoints`. Klicke rechts auf "...", um den Datenpunkt-Editor zu öffnen, und gib folgende Daten ein:
85+
86+![](/wiki-images/3/36/LabelsSource_DataPoints_Editor.png)
87+
88+In der Spalte "X" tragen wir die Werte der `x`-Koordinaten jeder Balkengruppe ein. Wir könnten die "Y"-Spalte weglassen, aber wie wir später bei dem horizontalen Balkendiagramm sehen werden, ist es praktisch, die gleichen Daten auch in dieser Spalte zu haben, damit die Beschriftungen nach dem Drehen der Balken erhalten bleiben. In der Spalte „Text“ legen wir die Texte fest, die für jede Balkengruppe entlang der Achse als Achsenmarkierungen erscheinen sollen. Nehmen wir an, dass unsere Daten saisonale Werte darstellen und verwenden die Abkürzungen „Q1“, „Q2“, „Q3“ und „Q4“ für „Quartal 1“ usw. Die Spalte „Farbe“ kann leer bleiben.
89+
90+Um diese Beschriftungen zu aktivieren, müssen wir diese ChartSource der Eigenschaft `Source` der `Marks` der unteren Achse zuweisen. Weiterhin muss die Eigenschaft `Style` von `Marks` auf `smsLabel` geschaltet werden, denn das wählt für die Beschriftungen den oben unter „Text“ eingegebenen Daten aus.
91+
92+Voila - und unser Chart sieht nun so aus:
93+
94+![](/wiki-images/a/a5/BarSeries_with_Axis_Marks.png%E2%80%8E)
95+
96+### Rasterlinien und Unterteilungsstriche zwischen den Gruppen anzeigen
97+
98+Ein kleines Problem kann verbessert werden: Das Diagramm wäre verständlicher, wenn sich die Achsenmarkierungen und Gitterlinien nicht in der Mitte der Balkengruppen, sondern direkt zwischen ihnen befinden würden.
99+
100+Zuerst schalten wir das Raster der unteren Achse aus: `BottomAxis.Grid.Visible = false`. Um die Unterteilungsstriche ("Ticks") zu entfernen, können wir `TickLength` und `TickInnerLength` auf `0` setzen.
101+
102+Aber wie erzeugt man die Gitterlinien zwischen den Diagrammgruppen? Dies kann durch Erstellen einer "Sekundär-Achse" zur unteren Achse erfolgen. Dies ist ein weiterer Satz von Ticks und Gitterlinien zusätzlich zur "Haupt"-Achse. Gehe zur unteren Achse und klicke auf `Minors`, um den entsprechenden Editor zu öffnen. Klicke nun auf "Hinzufügen" und wähle den Eintrag `0 - M` in der Liste aus. Zurück im normalen Objektinspektor, aktiviere `Visible`, erhöhe `TickLength` auf 4 und setze schließlich `Intervals.Count` auf `1` - Wir wollen nur 1 kleinen Tick zwischen den großen Ticks. Überprüfe Sie die `Grid`-Einstellungen der Sekundär-Achse - `Visible` sollte auf `true` eingestellt sein.
103+
104+Dies führt zum Endergebnis. Fertig? Nicht ganz! Unter den Balken ist ein störender kleiner Spalt. Dies rührt von der Eigenschaft `Margins` des Diagramms her, die einen gewissen Abstand zwischen der Reihe und den Achsen lässt. Setze einfach `Chart.Margins.Bottom` auf `0`, um die Lücke zu entfernen.
105+
106+![](/wiki-images/3/3a/BarSeries_no_bottom_margins.png)
107+
108+## Horizontale Balkenserie
109+
110+Bevor wir diese Lektion schließen, möchten wir dieses Projekt schnell ändern und ein Diagramm mit horizontalen Balken erstellen. Diese Art von Diagramm wird häufig bevorzugt, wenn die Achsenbeschriftungen aus langen Texten bestehen und das Diagramm im Querformat ausgerichtet ist.
111+
112+`TAChart` bietet keine spezielle "`THorizontalBarSeries`", aber die standardmäßige `TBarSeries` kann leicht modifiziert werden, um horizontale Balken zu bekommen. Wie bei jedem andere Nachfahren von `TChartSeries` gibt es auch hier die Eigenschaften `AxisIndexX` und `AxisIndexY`, um anzugeben, welche Achse für die `x` und `y` Koordinaten verantwortlich ist. Setze einfach `AxisIndexX` auf den Index der `LeftAxis` (normalerweise `0`) und `AxisIndexY` auf den Index der `BottomAxis`; das vertauscht die x- und y-Achsen, und die Balkenrichtung wird gedreht.
113+
114+Und natürlich muss diesmal die `LabelsChartSource` mit der `Marks.Source` der `LeftAxis` verknüpft werden. Und die Sekundärachse muss entsprechend gehandhabt werden.
115+
116+Im Grunde ist das alles, was du brauchst, um ein Diagramm mit horizontalen Balken zu erstellen.
117+
118+![](/wiki-images/9/9b/Horizontal_BarSeries.png%E2%80%8E)
119+
120+## Zusammenfassung
121+
122+Schritte zum Erstellen eines Balkendiagramms mit nebeneinander angeordneten Balken:
123+
124+- Für jeden Balken ist eine eigene `BarSeries`-Komponente erforderlich.
125+- Verwende die BarSeries-Eigenschaften `BarWidthPercent` und `BarOffsetPercent`, um die Balken nebeneinander mit oder ohne Überlappung anzuordnen. Die Prozentangaben beziehen sich auf den Abstand zwischen den Mittelpunkten der Balkengruppen.
126+- Setze für horizontale Balkenreihen den `AxisIndexX` der Reihe auf den Index der `LeftAxis` des Diagramms (normalerweise `0`) und `AxisIndexY` code\> auf den Index der `BottomAxis` (normalerweise `1`).
127+
128+## Quellcode
129+
130+Der Quellcode dieses Tutorials ist im Ordner `components/tachart/tutorials/bar_series` deiner *TAChart*-Installation neuerer Lazarus-Versionen verfügbar.
131+
132+### Projektdatei
133+
134+``` pascal
135+program project1;
136+
137+{$mode objfpc}{$H+}
138+
139+uses
140+ {$IFDEF UNIX}{$IFDEF UseCThreads}
141+ cthreads,
142+ {$ENDIF}{$ENDIF}
143+ Interfaces, // this includes the LCL widgetset
144+ Forms, tachartlazaruspkg, Unit1
145+ { you can add units after this };
146+
147+{$R *.res}
148+
149+begin
150+ RequireDerivedFormResource := True;
151+ Application.Initialize;
152+ Application.CreateForm(TForm1, Form1);
153+ Application.Run;
154+end.
155+```
156+
157+### Unit1.pas
158+
159+``` pascal
160+unit Unit1;
161+
162+{$mode objfpc}{$H+}
163+
164+interface
165+
166+uses
167+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, TAGraph,
168+ TASeries, TASources;
169+
170+type
171+
172+ { TForm1 }
173+
174+ TForm1 = class(TForm)
175+ Chart1: TChart;
176+ LabelsChartSource: TListChartSource;
177+ RedBarSeries: TBarSeries;
178+ BlueBarSeries: TBarSeries;
179+ YellowBarSeries: TBarSeries;
180+ RedChartSource: TRandomChartSource;
181+ BlueChartSource: TRandomChartSource;
182+ YellowChartSource: TRandomChartSource;
183+ private
184+ { private declarations }
185+ public
186+ { public declarations }
187+ end;
188+
189+var
190+ Form1: TForm1;
191+
192+implementation
193+
194+{$R *.lfm}
195+
196+end.
197+```
198+
199+### Unit1.lfm (vertikale Balken)
200+
201+``` pascal
202+object Form1: TForm1
203+ Left = 381
204+ Height = 272
205+ Top = 444
206+ Width = 429
207+ Caption = 'Form1'
208+ ClientHeight = 272
209+ ClientWidth = 429
210+ LCLVersion = '1.3'
211+ object Chart1: TChart
212+ Left = 0
213+ Height = 272
214+ Top = 0
215+ Width = 384
216+ AxisList = <
217+ item
218+ Minors = <>
219+ Title.LabelFont.Orientation = 900
220+ end
221+ item
222+ Grid.Visible = False
223+ TickLength = 0
224+ Alignment = calBottom
225+ Marks.Format = '%2:s'
226+ Marks.Source = LabelsChartSource
227+ Marks.Style = smsLabel
228+ Minors = <
229+ item
230+ Intervals.Count = 1
231+ Intervals.MinLength = 5
232+ Intervals.Options = [aipUseCount, aipUseMinLength]
233+ TickLength = 4
234+ end>
235+ end>
236+ Foot.Brush.Color = clBtnFace
237+ Foot.Font.Color = clBlue
238+ Legend.Visible = True
239+ Margins.Bottom = 0
240+ Title.Brush.Color = clBtnFace
241+ Title.Font.Color = clBlue
242+ Title.Text.Strings = (
243+ 'TAChart'
244+ )
245+ ParentColor = False
246+ object RedBarSeries: TBarSeries
247+ Title = 'red'
248+ BarBrush.Color = clRed
249+ BarOffsetPercent = -25
250+ BarWidthPercent = 25
251+ Source = RedChartSource
252+ end
253+ object BlueBarSeries: TBarSeries
254+ Title = 'blue'
255+ BarBrush.Color = clBlue
256+ BarWidthPercent = 25
257+ Source = BlueChartSource
258+ end
259+ object YellowBarSeries: TBarSeries
260+ Title = 'yellow'
261+ BarBrush.Color = clYellow
262+ BarOffsetPercent = 25
263+ BarWidthPercent = 25
264+ Source = YellowChartSource
265+ end
266+ end
267+ object RedChartSource: TRandomChartSource
268+ PointsNumber = 4
269+ RandSeed = 1
270+ XMax = 4
271+ XMin = 1
272+ YMax = 100
273+ YMin = 0
274+ left = 360
275+ top = 72
276+ end
277+ object BlueChartSource: TRandomChartSource
278+ PointsNumber = 4
279+ RandSeed = 2
280+ XMax = 4
281+ XMin = 1
282+ YMax = 100
283+ YMin = 0
284+ left = 360
285+ top = 120
286+ end
287+ object YellowChartSource: TRandomChartSource
288+ PointsNumber = 4
289+ RandSeed = 3
290+ XMax = 4
291+ XMin = 1
292+ YMax = 100
293+ YMin = 0
294+ left = 360
295+ top = 168
296+ end
297+ object LabelsChartSource: TListChartSource
298+ DataPoints.Strings = (
299+ '1|1|?|Q1'
300+ '2|2|?|Q2'
301+ '3|3|?|Q3'
302+ '4|4|?|Q4'
303+ )
304+ left = 361
305+ top = 220
306+ end
307+end
308+```
309+
310+### Unit1.lfm (horizontale Balken)
311+
312+``` pascal
313+object Form1: TForm1
314+ Left = 381
315+ Height = 272
316+ Top = 444
317+ Width = 429
318+ Caption = 'Form1'
319+ ClientHeight = 272
320+ ClientWidth = 429
321+ LCLVersion = '1.3'
322+ object Chart1: TChart
323+ Left = 0
324+ Height = 272
325+ Top = 0
326+ Width = 384
327+ AxisList = <
328+ item
329+ Grid.Visible = False
330+ TickLength = 0
331+ Marks.Format = '%2:s'
332+ Marks.Source = LabelsChartSource
333+ Marks.Style = smsLabel
334+ Minors = <
335+ item
336+ Intervals.Count = 1
337+ Intervals.MinLength = 5
338+ Intervals.Options = [aipUseCount, aipUseMinLength]
339+ TickLength = 4
340+ end>
341+ Title.LabelFont.Orientation = 900
342+ end
343+ item
344+ Alignment = calBottom
345+ Minors = <>
346+ end>
347+ Foot.Brush.Color = clBtnFace
348+ Foot.Font.Color = clBlue
349+ Legend.Visible = True
350+ Margins.Bottom = 0
351+ Title.Brush.Color = clBtnFace
352+ Title.Font.Color = clBlue
353+ Title.Text.Strings = (
354+ 'TAChart'
355+ )
356+ ParentColor = False
357+ object RedBarSeries: TBarSeries
358+ Title = 'red'
359+ AxisIndexX = 0
360+ AxisIndexY = 1
361+ BarBrush.Color = clRed
362+ BarOffsetPercent = -25
363+ BarWidthPercent = 25
364+ Source = RedChartSource
365+ end
366+ object BlueBarSeries: TBarSeries
367+ Title = 'blue'
368+ AxisIndexX = 0
369+ AxisIndexY = 1
370+ BarBrush.Color = clBlue
371+ BarWidthPercent = 25
372+ Source = BlueChartSource
373+ end
374+ object YellowBarSeries: TBarSeries
375+ Title = 'yellow'
376+ AxisIndexX = 0
377+ AxisIndexY = 1
378+ BarBrush.Color = clYellow
379+ BarOffsetPercent = 25
380+ BarWidthPercent = 25
381+ Source = YellowChartSource
382+ end
383+ end
384+ object RedChartSource: TRandomChartSource
385+ PointsNumber = 4
386+ RandSeed = 1
387+ XMax = 4
388+ XMin = 1
389+ YMax = 100
390+ YMin = 0
391+ left = 360
392+ top = 72
393+ end
394+ object BlueChartSource: TRandomChartSource
395+ PointsNumber = 4
396+ RandSeed = 2
397+ XMax = 4
398+ XMin = 1
399+ YMax = 100
400+ YMin = 0
401+ left = 360
402+ top = 120
403+ end
404+ object YellowChartSource: TRandomChartSource
405+ PointsNumber = 4
406+ RandSeed = 3
407+ XMax = 4
408+ XMin = 1
409+ YMax = 100
410+ YMin = 0
411+ left = 360
412+ top = 168
413+ end
414+ object LabelsChartSource: TListChartSource
415+ DataPoints.Strings = (
416+ '1|1|?|Q1'
417+ '2|2|?|Q2'
418+ '3|3|?|Q3'
419+ '4|4|?|Q4'
420+ )
421+ left = 361
422+ top = 220
423+ end
424+end
425+```
426+
427+---
428+*From the Free Pascal wiki, page "TAChart Tutorial: BarSeries/de", as it stood on 2022-12-30 after a change by Wp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history