Sign in Join
Wiki copytemporary

TAChart Tutorial: BarSeries/de: what changed

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

OldNewLine
11## Einführung
22
33![](/wiki-images/b/b1/BarSeries_finished.png%E2%80%8E)
44
55Die `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:
66
77- Nebeneinander angeordnete Balken
88- Gestapelte Balken
99- Gestapelte Balken, auf 100 % normiert
1010- Vertikale Balken
1111- Horizontale Balken
1212
1313In 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.
1414
1515Neben Balkenserien stellt dieses Tutorial auch `TRandomChartSource` vor, eine praktische Datenquelle zum Entwerfen und Testen eines Diagramms, ohne die Anwendung kompilieren zu müssen.
1616
1717Du 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.
1818
1919## Vorbereitung
2020
2121### Einrichten des Diagramms
2222
2323Erstelle 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.
2424
2525### Daten zum Plotten
2626
2727Bevor 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 ...
2828
2929Gehen 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.
3030
3131Wie 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:
3232
3333![](/wiki-images/8/8b/TChart_Palette_RandomChartSource.png)
3434
3535Fü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.)
3636
3737Zuvor 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`.
3838
3939## Balkenserie
4040
4141### Serie hinzufügen
4242
4343Nachdem 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.
4444
4545Klicke 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.
4646
4747Wiederhole das mit den anderen beiden Serien entsprechend.
4848
4949![](/wiki-images/2/28/AllBarSeries.png)
5050
5151Jetzt 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.
5252
5353### Nebeneinander angeordnete Balken
5454
5555Um 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:
5656
5757- `BarWidthPercent`
5858- `BarOffsetPercent`
5959
6060Beide 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`.)
6161
6262Die 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.
6363
6464Setzen 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.
6565
6666Derzeit 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.
6767
6868Zusammenfassend verwenden wir die folgenden Werte:
6969
7070- `RedBarSeries: BarOffsetPercent = -25, BarWidthPercent = 25`
7171- `BlueBarSeries: BarOffsetPercent = 0, BarWidthPercent = 25`
7272- `YellowBarSeries: BarOffsetPercent = 25, BarWidthPercent = 25`
7373
7474![](/wiki-images/0/09/AllBarSeries-side-by-side.png)
7575
7676## Achse
7777
7878### Achsenbeschriftung
7979
8080Das 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.
8181
8282Der 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`.
8383
8484Die `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:
8585
8686![](/wiki-images/3/36/LabelsSource_DataPoints_Editor.png)
8787
8888In 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.
8989
9090Um 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.
9191
9292Voila - und unser Chart sieht nun so aus:
9393
9494![](/wiki-images/a/a5/BarSeries_with_Axis_Marks.png%E2%80%8E)
9595
9696### Rasterlinien und Unterteilungsstriche zwischen den Gruppen anzeigen
9797
9898Ein 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.
9999
100100Zuerst 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.
101101
102102Aber 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.
103103
104104Dies 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.
105105
106106![](/wiki-images/3/3a/BarSeries_no_bottom_margins.png)
107107
108108## Horizontale Balkenserie
109109
110110Bevor 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.
111111
112112`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.
113113
114114Und natürlich muss diesmal die `LabelsChartSource` mit der `Marks.Source` der `LeftAxis` verknüpft werden. Und die Sekundärachse muss entsprechend gehandhabt werden.
115115
116116Im Grunde ist das alles, was du brauchst, um ein Diagramm mit horizontalen Balken zu erstellen.
117117
118118![](/wiki-images/9/9b/Horizontal_BarSeries.png%E2%80%8E)
119119
120120## Zusammenfassung
121121
122122Schritte zum Erstellen eines Balkendiagramms mit nebeneinander angeordneten Balken:
123123
124124- Für jeden Balken ist eine eigene `BarSeries`-Komponente erforderlich.
125125- 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.
126126- 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`).
127127
128128## Quellcode
129129
130130Der Quellcode dieses Tutorials ist im Ordner `components/tachart/tutorials/bar_series` deiner *TAChart*-Installation neuerer Lazarus-Versionen verfügbar.
131131
132132### Projektdatei
133133
134134``` pascal
135135program project1;
136136
137137{$mode objfpc}{$H+}
138138
139139uses
140140 {$IFDEF UNIX}{$IFDEF UseCThreads}
141141 cthreads,
142142 {$ENDIF}{$ENDIF}
143143 Interfaces, // this includes the LCL widgetset
144144 Forms, tachartlazaruspkg, Unit1
145145 { you can add units after this };
146146
147147{$R *.res}
148148
149149begin
150150 RequireDerivedFormResource := True;
151151 Application.Initialize;
152152 Application.CreateForm(TForm1, Form1);
153153 Application.Run;
154154end.
155155```
156156
157157### Unit1.pas
158158
159159``` pascal
160160unit Unit1;
161161
162162{$mode objfpc}{$H+}
163163
164164interface
165165
166166uses
167167 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, TAGraph,
168168 TASeries, TASources;
169169
170170type
171171
172172 { TForm1 }
173173
174174 TForm1 = class(TForm)
175175 Chart1: TChart;
176176 LabelsChartSource: TListChartSource;
177177 RedBarSeries: TBarSeries;
178178 BlueBarSeries: TBarSeries;
179179 YellowBarSeries: TBarSeries;
180180 RedChartSource: TRandomChartSource;
181181 BlueChartSource: TRandomChartSource;
182182 YellowChartSource: TRandomChartSource;
183183 private
184184 { private declarations }
185185 public
186186 { public declarations }
187187 end;
188188
189189var
190190 Form1: TForm1;
191191
192192implementation
193193
194194{$R *.lfm}
195195
196196end.
197197```
198198
199199### Unit1.lfm (vertikale Balken)
200200
201-``` pascal
201+``` lfm
202202object Form1: TForm1
203203 Left = 381
204204 Height = 272
205205 Top = 444
206206 Width = 429
207207 Caption = 'Form1'
208208 ClientHeight = 272
209209 ClientWidth = 429
210210 LCLVersion = '1.3'
211211 object Chart1: TChart
212212 Left = 0
213213 Height = 272
214214 Top = 0
215215 Width = 384
216216 AxisList = <
217217 item
218218 Minors = <>
219219 Title.LabelFont.Orientation = 900
220220 end
221221 item
222222 Grid.Visible = False
223223 TickLength = 0
224224 Alignment = calBottom
225225 Marks.Format = '%2:s'
226226 Marks.Source = LabelsChartSource
227227 Marks.Style = smsLabel
228228 Minors = <
229229 item
230230 Intervals.Count = 1
231231 Intervals.MinLength = 5
232232 Intervals.Options = [aipUseCount, aipUseMinLength]
233233 TickLength = 4
234234 end>
235235 end>
236236 Foot.Brush.Color = clBtnFace
237237 Foot.Font.Color = clBlue
238238 Legend.Visible = True
239239 Margins.Bottom = 0
240240 Title.Brush.Color = clBtnFace
241241 Title.Font.Color = clBlue
242242 Title.Text.Strings = (
243243 'TAChart'
244244 )
245245 ParentColor = False
246246 object RedBarSeries: TBarSeries
247247 Title = 'red'
248248 BarBrush.Color = clRed
249249 BarOffsetPercent = -25
250250 BarWidthPercent = 25
251251 Source = RedChartSource
252252 end
253253 object BlueBarSeries: TBarSeries
254254 Title = 'blue'
255255 BarBrush.Color = clBlue
256256 BarWidthPercent = 25
257257 Source = BlueChartSource
258258 end
259259 object YellowBarSeries: TBarSeries
260260 Title = 'yellow'
261261 BarBrush.Color = clYellow
262262 BarOffsetPercent = 25
263263 BarWidthPercent = 25
264264 Source = YellowChartSource
265265 end
266266 end
267267 object RedChartSource: TRandomChartSource
268268 PointsNumber = 4
269269 RandSeed = 1
270270 XMax = 4
271271 XMin = 1
272272 YMax = 100
273273 YMin = 0
274274 left = 360
275275 top = 72
276276 end
277277 object BlueChartSource: TRandomChartSource
278278 PointsNumber = 4
279279 RandSeed = 2
280280 XMax = 4
281281 XMin = 1
282282 YMax = 100
283283 YMin = 0
284284 left = 360
285285 top = 120
286286 end
287287 object YellowChartSource: TRandomChartSource
288288 PointsNumber = 4
289289 RandSeed = 3
290290 XMax = 4
291291 XMin = 1
292292 YMax = 100
293293 YMin = 0
294294 left = 360
295295 top = 168
296296 end
297297 object LabelsChartSource: TListChartSource
298298 DataPoints.Strings = (
299299 '1|1|?|Q1'
300300 '2|2|?|Q2'
301301 '3|3|?|Q3'
302302 '4|4|?|Q4'
303303 )
304304 left = 361
305305 top = 220
306306 end
307307end
308308```
309309
310310### Unit1.lfm (horizontale Balken)
311311
312-``` pascal
312+``` lfm
313313object Form1: TForm1
314314 Left = 381
315315 Height = 272
316316 Top = 444
317317 Width = 429
318318 Caption = 'Form1'
319319 ClientHeight = 272
320320 ClientWidth = 429
321321 LCLVersion = '1.3'
322322 object Chart1: TChart
323323 Left = 0
324324 Height = 272
325325 Top = 0
326326 Width = 384
327327 AxisList = <
328328 item
329329 Grid.Visible = False
330330 TickLength = 0
331331 Marks.Format = '%2:s'
332332 Marks.Source = LabelsChartSource
333333 Marks.Style = smsLabel
334334 Minors = <
335335 item
336336 Intervals.Count = 1
337337 Intervals.MinLength = 5
338338 Intervals.Options = [aipUseCount, aipUseMinLength]
339339 TickLength = 4
340340 end>
341341 Title.LabelFont.Orientation = 900
342342 end
343343 item
344344 Alignment = calBottom
345345 Minors = <>
346346 end>
347347 Foot.Brush.Color = clBtnFace
348348 Foot.Font.Color = clBlue
349349 Legend.Visible = True
350350 Margins.Bottom = 0
351351 Title.Brush.Color = clBtnFace
352352 Title.Font.Color = clBlue
353353 Title.Text.Strings = (
354354 'TAChart'
355355 )
356356 ParentColor = False
357357 object RedBarSeries: TBarSeries
358358 Title = 'red'
359359 AxisIndexX = 0
360360 AxisIndexY = 1
361361 BarBrush.Color = clRed
362362 BarOffsetPercent = -25
363363 BarWidthPercent = 25
364364 Source = RedChartSource
365365 end
366366 object BlueBarSeries: TBarSeries
367367 Title = 'blue'
368368 AxisIndexX = 0
369369 AxisIndexY = 1
370370 BarBrush.Color = clBlue
371371 BarWidthPercent = 25
372372 Source = BlueChartSource
373373 end
374374 object YellowBarSeries: TBarSeries
375375 Title = 'yellow'
376376 AxisIndexX = 0
377377 AxisIndexY = 1
378378 BarBrush.Color = clYellow
379379 BarOffsetPercent = 25
380380 BarWidthPercent = 25
381381 Source = YellowChartSource
382382 end
383383 end
384384 object RedChartSource: TRandomChartSource
385385 PointsNumber = 4
386386 RandSeed = 1
387387 XMax = 4
388388 XMin = 1
389389 YMax = 100
390390 YMin = 0
391391 left = 360
392392 top = 72
393393 end
394394 object BlueChartSource: TRandomChartSource
395395 PointsNumber = 4
396396 RandSeed = 2
397397 XMax = 4
398398 XMin = 1
399399 YMax = 100
400400 YMin = 0
401401 left = 360
402402 top = 120
403403 end
404404 object YellowChartSource: TRandomChartSource
405405 PointsNumber = 4
406406 RandSeed = 3
407407 XMax = 4
408408 XMin = 1
409409 YMax = 100
410410 YMin = 0
411411 left = 360
412412 top = 168
413413 end
414414 object LabelsChartSource: TListChartSource
415415 DataPoints.Strings = (
416416 '1|1|?|Q1'
417417 '2|2|?|Q2'
418418 '3|3|?|Q3'
419419 '4|4|?|Q4'
420420 )
421421 left = 361
422422 top = 220
423423 end
424424end
425425```
426426
427427---
428428*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