Balkendiagramm

Für Fragen von Einsteigern und Programmieranfängern...
Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Balkendiagramm

Beitrag von Foxi1896 »

Hallo,
ich möchte ein ganz simples Balkendiagramm habe 13 Werte die nebeneinander dargestellt werden sollen. Und sich nur in der Höhe unterscheiden.
TChart und Chart1BarSeries1 habe ich aber ich verstehe nicht was für eine funktion ich nehmen muss.
Habe es so versucht:

Code: Alles auswählen

Chart1BarSeries1.AddX(EditR1.Text,'',clRed);
Chart1BarSeries2.AddX(EditR2.Text,'',clRed);
 
und so:

Code: Alles auswählen

Chart1BarSeries1.AddXY(1, EditR1.Text,'',clRed);
Chart1BarSeries2.AddXY(2, EditR2.Text,'',clRed);
Gruß Foxi

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

Re: Balkendiagramm

Beitrag von wp_xyz »

TChartSeries, Vorfahre von TBarSeries, hat mehrere Methoden, um Daten hinzuzufügen.
  • AddXY ist die allgemeinste, hier kann man sowohl x als auch y Koordinate angeben.
  • Add (bzw. AddY) nimmt für X den Datenpunkt-Index an, so dass nur y angegeben werden muss - wahrscheinlich ist das das richtige für dich, weil dann die Balken äquidistant sind, und oft gar kein numerischer Wert für x vorhanden ist. y wird aber als double-Zahl erwartet, du kannst also nicht direkt EditR1.Text eintragen, da das ein String ist. Richtig wäre (vorausgesetzt: EditR1 ist als Zahl darstellbar)

Code: Alles auswählen

 
  Chart1BarSeries1.Add(StrToFloat(EditR1.Text), 'Punkt-Label, clRed);
 
Das "Punkt-Label" kann als Info-Text zumBalken eingeblendet werden, kann aber entfallen, ebenso wie die individuelle Balken-Farbe.

Ansonsten sollte ich noch erwähnen, dass es zu TAChart inzwischen eine recht umfangreiche Dokumentation sowie einige Tutorials gibt - vielleicht hilft das über die Hürden des Einstiegs (alles verlinkt unter "Documentation" auf http://wiki.lazarus.freepascal.org/TAChart)

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

auf dem Link war ich schon ... bin aber nicht wirklich durchgestiegen =/

ahh ok habe das StrToFloat vergessen. Aber nun zeigt er mir die Balken irgendwie komisch an... hinter/übereinander.
Wie mach ich es wenn ich alle schon gleichmässig nebeneinander haben möchte.

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

Re: Balkendiagramm

Beitrag von wp_xyz »

Die Voreinstellungen der BarSeries sind nicht für mehrere Datenreihen im Chart optimiert. Jede BarSeries hat Eigenschaft BarOffsetPercent und BarWidthPercent, mit denen man die räumliche Aufteilung entlang der Achse beeinflussen kann. Derr Defaultwert von BarOffsetPercent ist ist 0 -- deshalb liegen die Balken der beiden Serien bei dir hintereinander (nicht übereinander - was dir so erscheint, liegt daran, dass der hintere Balken länger ist als der vordere).

Spiele mit diesen Parametern herum, um den von dir gewünschten Effekt zu erhalten (z.B. direkt nebeinander liegende Balken, teilweise hintereinander liegende Balken etc). Eine guter Satz von Startparametern für zwei Datenreihen wäre
- jeweils BarWidthPercent = 40
- BarOffsetPercent = -20 bei der ersten, +20 bei der zweiten Datenreihe

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

hab es hinbekommen.

Nun würde ich gerne unter jedem Balken eine Beschriftung haben, anstatt der Skalla.

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

Re: Balkendiagramm

Beitrag von wp_xyz »

Ok, hab mir gedacht, dass das noch kommt: Damit die x-Achse nicht die Skalenwerte zeigt, sondern die Beschriftungen, muss man BottomAxis.Marks.Source mit der ChartSource belegen, in der die Beschriftungen stehen. Wenn du die Daten, so wie weiter oben beschrieben, mit "Series.Add" o.ä. eingefügt hast, stehen die Daten in der internen ChartSource der Series, auf die man über "Series.Source" zugreifen kann. Leider kann man die interne ChartSource einer Series nicht zur Designzeit bei der Achse einhängen, aber zur Laufzeit geht das z.B., nachdem du die Daten festgelegt hast, mit folgendem Befehl:

Code: Alles auswählen

 
  Chart1.BottomAxis.Marks.Source := Chart1BarSeries1.Source;
 
Ein Datensatz einer Chartsource enthält verschiedene Größen: den x, y Wert, die Beschriftung, die Farbe. Ich bin jetzt nicht ganz sicher, wie die Defaults eingestellt sind, aber wahrscheinlich musst du BottomAxis.Marks.Style noch auf smsLabel setzen, andernfalls erscheint etwas anderes. Style bietet noch weitere Auswahlmöglichkeiten, wie smsLabelPercent (d.h. Beschriftung und prozentualer Anteil des Wertes).

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

Ah Danke, genau das meinte ich gut zu wissen wo man das Einstellen (auch für die anderen möglichkeiten die da sind).

Aber ein Problem hab ich noch. Er gibt mir immer nur das Label vom letzten Balken?


habe schon probiert es an verschiedene Stellen einzusetzen:

Code: Alles auswählen

if RadioButton1.Checked=true then  {Schleife 6-Teil}
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries1.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries2.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries3.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries4.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries5.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries6.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries7.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries8.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries9.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries10.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries11.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries12.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries13.Source;
 
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1.BottomAxis.Marks.Source := Chart1BarSeries1.Source;
         Chart1BarSeries2.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
           Chart1.BottomAxis.Marks.Source := Chart1BarSeries2.Source;
         Chart1BarSeries3.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries4.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries5.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries6.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries7.AddXY(7,StrToFloat(EditRA.Text), 'RA', clBlue);
 
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries3.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries4.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries5.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries6.Source;
      Chart1.BottomAxis.Marks.Source := Chart1BarSeries7.Source;
       end;                                                  

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

Re: Balkendiagramm

Beitrag von wp_xyz »

(1) Die einzelnen Datenreihen müssen natürlich dieselben Labels jeweils an denselben Balken haben. Alternativ kannst du auch eine ListChartSource verwenden, in der du die Labels für die Achse definierst.
(2) Deinen code verstehe ich nicht: Das "if" gilt nur für die erste Zuweisung, weil das "begin" erst am Ende nach den Chart.BottomAxis.Mark.Source Anweisungen steht - ich glaube nicht, dass du das so beabsichtigst. Außerdem überschreibt jede Zuweisung immer die der vorigen Zeile. Letztendlich ist nur die letzte Anweisung Chart1.BottomAxis.Marks.Source := ChartBarSeries12.Source aktiv. Seltsam...

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

Also so sieht der Code aus ohne das die Source..

Code: Alles auswählen

      if RadioButton1.Checked=true then  {Schleife 6-Teil}
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1BarSeries2.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
         Chart1BarSeries3.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries4.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries5.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries6.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries7.AddXY(7,StrToFloat(EditRA.Text), 'RA', clBlue);
       end;
 
    if RadioButton2.Checked=true then  {Schleife 8-Teil}
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1BarSeries2.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
         Chart1BarSeries3.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries4.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries5.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries6.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries7.AddXY(7,StrToFloat(EditR7.Text), 'R7', clRed);
         Chart1BarSeries8.AddXY(8,StrToFloat(EditR8.Text), 'R8', clRed);
         Chart1BarSeries9.AddXY(9,StrToFloat(EditRA.Text), 'RA', clBlue);
       end;
 
    if RadioButton3.Checked=true then  {Schleife 12-Teil}
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1BarSeries2.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
         Chart1BarSeries3.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries4.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries5.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries6.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries7.AddXY(7,StrToFloat(EditR7.Text), 'R7', clRed);
         Chart1BarSeries8.AddXY(8,StrToFloat(EditR8.Text), 'R8', clRed);
         Chart1BarSeries9.AddXY(9,StrToFloat(EditR9.Text), 'R9', clRed);
         Chart1BarSeries10.AddXY(10,StrToFloat(EditR10.Text), 'R10', clRed);
         Chart1BarSeries11.AddXY(11,StrToFloat(EditR11.Text), 'R11', clRed);
         Chart1BarSeries12.AddXY(12,StrToFloat(EditR12.Text), 'R12', clRed);
         Chart1BarSeries13.AddXY(13,StrToFloat(EditRA.Text), 'RA', clBlue);
 
       end; 
Wie bzw. Wo muss ich das jetzt eintragen damit ich die Labels angezeigt bekomme.
Der Code eben sollte zeigen wo ich es überall versucht habe.
Habe auch schon das mit einer ListChartSource versucht... Habe es eingefügt (auch bei bottom wo es hingehört) aber es passiert nix.

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

Re: Balkendiagramm

Beitrag von wp_xyz »

Ich versteh's immer noch nicht: Warum hast du für jeden Balken eine eigene Series? Du kannst doch alle Balken in dieselbe Series packen. Falls nötig kannst du sie mit Hilfe des optionalen Color-Parameters beim Add-Aufruf auch unterschiedlich einfärben.

Code: Alles auswählen

 
  Chart1BarSeries1.Clear;
   if RadioButton1.Checked=true then  {Schleife 6-Teil}
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1BarSeries1.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
         Chart1BarSeries1.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries1.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries1.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries1.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries1.AddXY(7,StrToFloat(EditRA.Text), 'RA', clBlue);
       end;
 
    if RadioButton2.Checked=true then  {Schleife 8-Teil}
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1BarSeries1.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
         Chart1BarSeries1.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries1.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries1.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries1.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries1.AddXY(7,StrToFloat(EditR7.Text), 'R7', clRed);
         Chart1BarSeries1.AddXY(8,StrToFloat(EditR8.Text), 'R8', clRed);
         Chart1BarSeries1.AddXY(9,StrToFloat(EditRA.Text), 'RA', clBlue);
       end;
 
    if RadioButton3.Checked=true then  {Schleife 12-Teil}
       begin
         Chart1BarSeries1.AddXY(1,StrToFloat(EditR1.Text), 'R1', clRed);
         Chart1BarSeries1.AddXY(2,StrToFloat(EditR2.Text), 'R2', clRed);
         Chart1BarSeries1.AddXY(3,StrToFloat(EditR3.Text), 'R3', clRed);
         Chart1BarSeries1.AddXY(4,StrToFloat(EditR4.Text), 'R4', clRed);
         Chart1BarSeries1.AddXY(5,StrToFloat(EditR5.Text), 'R5', clRed);
         Chart1BarSeries1.AddXY(6,StrToFloat(EditR6.Text), 'R6', clRed);
         Chart1BarSeries1.AddXY(7,StrToFloat(EditR7.Text), 'R7', clRed);
         Chart1BarSeries1.AddXY(8,StrToFloat(EditR8.Text), 'R8', clRed);
         Chart1BarSeries1.AddXY(9,StrToFloat(EditR9.Text), 'R9', clRed);
         Chart1BarSeries1.AddXY(10,StrToFloat(EditR10.Text), 'R10', clRed);
         Chart1BarSeries1.AddXY(11,StrToFloat(EditR11.Text), 'R11', clRed);
         Chart1BarSeries1.AddXY(12,StrToFloat(EditR12.Text), 'R12', clRed);
         Chart1BarSeries1.AddXY(13,StrToFloat(EditRA.Text), 'RA', clBlue);
       end;
  Chart1.BottomAxis.Marks.Source := Chart1BarSeries1.Source;
  Chart1.BottomAxis.Marks.Style := smsLabel;
 

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

Wie kann ich den die Edit Werte alle in eine Series packen?

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

Re: Balkendiagramm

Beitrag von wp_xyz »

So wie's oben im letzten Posting steht.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

wp_xyz hat geschrieben:Ich versteh's immer noch nicht: Warum hast du für jeden Balken eine eigene Series? Du kannst doch alle Balken in dieselbe Series packen. Falls nötig kannst du sie mit Hilfe des optionalen Color-Parameters beim Add-Aufruf auch unterschiedlich einfärben.
 [/code]
Versteh ich nicht ... wie muss ich das eingeben?

Code: Alles auswählen

Chart1BarSeries1.AddXY(
         StrToFloat(EditR1.Text), 'R1',StrToFloat(EditR2.Text), 'R2',
         StrToFloat(EditR3.Text), 'R3',StrToFloat(EditR4.Text), 'R4',
         StrToFloat(EditR5.Text), 'R5',StrToFloat(EditR6.Text), 'R6',
         StrToFloat(EditR7.Text), 'RA'); 

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

Re: Balkendiagramm

Beitrag von wp_xyz »

Na, in dem von mir editierten Code von dir, drei Postings höher, steht es direkt zum Kopieren...

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Balkendiagramm

Beitrag von Foxi1896 »

Code: Alles auswählen

  Chart1BarSeries1.Clear;  
Chart1.BottomAxis.Marks.Source := Chart1BarSeries1.Source;  
Chart1.BottomAxis.Marks.Style := smsLabel;
das meinst du oder?
Das habe ich eingefügt ... und dann beschwert er sich über das Label. Und wenn ich das lösche und Manuel im Objektinspektor einstelle schreibt er mir nur R1 vom ersten Balken und die anderen lässt er leer.

Antworten