Autor Beitrag
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Di 25.09.07 10:59 
Hallo Leute,

ich benutze die TeeChart Komponenten um Daten auszuwerten.

An dieses Post angehängt findet ihr das Chart wie es aussehen soll.

Ich bin momenten schon soweit dass alle Daten angezeigt werden.

Das Linien Diagramm in Prozent zeigt den prozentualen Anteil an den jeweiligen Balken. In diesem Screenshot sind die einzelnen Punkte direkt über dem dazugehörigen Bar zentriert.

Im Diagramm befinden sich also 4 Bars die jeweils 6 verschiedene Werte tragen. Und eine Linie die die Prozentwerte anzeigt (die kleinen bunten Linien sind hier nicht relevant).

Wie bekomme ich jetzt die X Koordinate der ganz linken Bar (Eigentlich ist es ja nur eine auf Position eins, die mehrere Daten enthält).

Mit diesem Codeschnipsel erhalte ich jediglich die X Koordinate der gesamten ersten Bar (hier also nur 1, 2, 3, oder 4) nicht aber die der einzelnen:

ausblenden Delphi-Quelltext
1:
lBarSeries.XValues.Value[0];					


Ohne diese genaue Angabe kann ich die Prozentwerte ja nicht über den einzelnen Bars zentrieren..

Hat jemand eine Idee? Vielen Dank schonmal :)
Einloggen, um Attachments anzusehen!
_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Di 25.09.07 14:23 
Bin nicht sicher, ob ich dein Problem richtig verstehe.

Jede Balkengruppe enthält einen Balken aus einer bestimmten BarSeries, die üblicherweise als Series1, Series2 etc. benannt werden. Die erste BarSeries hast du offenbar umbenannt zu lBarSeries. Daher weiß ich nicht, wie die anderen Reihen heißen. Angenommen, die Namen wären nicht verändert worden, dann sprichst du den x-Wert des zweiten, dritten und vierten Balkens der 1. Gruppe an als

Series2.XValues.Value[0]
Series3.XValues.Value[0]
Series4.XValues.Value[0]

Falls du die 2. Balkengruppe brauchts, muss der Arrayindex in [1] umgetauscht werden, etc.
Mit YValues statt XValues kommt man entsprechend an die y-Werte.
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Di 25.09.07 14:44 
Vielen Dank für deine Antwort, aber das ist es nicht.. Ich versuchs noch mal zu erklären.

Der Chart wird dynamisch kreiert.

Für die X-Achse werden soviele Series angelegt wie Jahre (bei 4 Jahre werden 4 Series angelegt).

Allerdings werden die 4 Jahre gruppiert angezeigt in meinen Beispiel hier nach einer Produktsionsstraße (Eine Serie wird gruppiert in dem der Bezeichner beim Adden gleich ist).

Das heisst also:

ausblenden Quelltext
1:
2:
Jahr1 Jahr2 Jahr3 Jahr4     Jahr1 Jahr2 Jahr3 Jahr4     Jahr1 Jahr2 Jahr3 Jahr4
       Straße 1                       Straße 2                  Straße 3


Ich würde jetzt gerne wissen welche X Koordinate das Jahr 1 der Straße 1 hat. Ich bekomme aber nur die Koordninate der Straße 1.

Das benötige ich dafür damit ich über diesen Balken ein Liniendiagramm zeichnen kann (wie im Bild) das zeigt die Auslastung. Die Auslastung hat ingesammt nur eine Series mit vielen Punkten die jeweils auf die zugehörigen Balken zeigen soll. Damit das funktioniert benötige ich aber die X Koordinate des Balkens, da er mir das sonst irgendwo anzeigt nur nicht da wos hingehört ;)

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Di 25.09.07 16:45 
Wie machst du denn die Gruppierung? Ich wusste gar nicht, dass das mit TeeChart geht. Oder hast du die Profi-Version?

Falls dir hier niemand hilft, stelle deine Frage direkt bei steema (www.teechart.net/support/index.php)
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mi 26.09.07 13:03 
Ich benutze die TeeChart Standard Edition, so wie sie bei Delphi mit dabei ist (benutze bei diesem Projekt D6). Danke für den Link werde versuchen da mal nachzufragen, wäre aber natürlich über eine Antwort hier im Forum auch erfreut ;)

user profile iconwp_xxyyzz hat folgendes geschrieben:
Wie machst du denn die Gruppierung? Ich wusste gar nicht, dass das mit TeeChart geht.


Lege 5 Bar Series an und fülle das Chart so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  Series1.AddXY(112500'Gleiche Bezeichnung');

  Series2.AddXY(114000'Gleiche Bezeichnung');

  Series3.AddXY(113500'Gleiche Bezeichnung');

  Series4.AddXY(115500'Gleiche Bezeichnung');

  Series5.AddXY(114500'Gleiche Bezeichnung');


Hoffe das hilft dir weiter.


Kann mir sonst noch jemand weiterhelfen?
Vielen Dank.

EDIT:
Weisst du zufällig wie ich mich bei dem Forum registrieren kann? Da steht immer nur das man registriert sein soll.. nur nicht wo man das tut, sieht mir doch sehr danach aus, dass man erst das Produkt kaufen muss.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Mi 26.09.07 13:48 
Achso, das ist aber Standard. Dann verstehe ich nicht, wieso das von mir früher vorgeschlagene Vorgehen nicht funktioniert.

Irgendwie verstehe ich's immer noch nicht... Kannst du nicht hier mal ein paar Dummy-Daten zusammen mit dem Code, mit dem das Diagramm gefüllt wird, posten?
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mi 26.09.07 15:52 
OK anbei mein Beispiel Projekt :)

Du musst dir vorstellen das die einzelnen Bar Series Jahre repräsentieren, die Anzahl ist hierbei dynamisch. Auch die Anzahl der Straßen ist komplett dynamisch. Soll aber hier im Beispiel erstmal nicht stören.

Die Daten kommen aus einer Datenbank. Ich bekomme die Daten pro Jahr muss also in einem Zug die Jahres Bar für eine bestimmte Straße erstellen und gleich darauf dazu die Auslastung in Prozent.
Das Problem ist, dass sich natürlich pro Jahr der X-Wert der Achse verändert (da ja die Jahresanzahl dynamisch ist).

In meinem Beispiel Projekt findest du in der MainUnit.pas im Create der Form den Code.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  
  // 2010
  Series1.AddXY(110000'Straße 18');
  Series5.AddXY(Series1.XValues.Value[0], 100'');


Wenn ich nun versuche einen Auslastungspunkt hineinzuzeichnen, zeichnet er mir bei 0 genau in die Mitte der Bars der ersten Straße, bei 1 bringt er mir eine Exception (ok das ist klar).

Was mir nicht klar ist, ist welchen Wert ich beim markierten Bereich hineinschreiben muss damit der erste Auslastungspunkt auch dem ersten Balken entspricht.

Dann soll es einfach so weitergehen.. zweite Bar zweiter Auslastungspunkt. Zwischen den Straßen wird die Auslastungslinie abgeschnitten und wieder neu angefangen, dann wieder erste Bar der zweiten Straße mit erstem Auslastungspunkt dieser Straße, usw.

Vielen Dank für die Hilfe!
Einloggen, um Attachments anzusehen!
_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Mi 26.09.07 18:07 
ok, falls ich es jetzt verstanden habe, müsste es folgendermaßen funktionieren:

Zunächst darfst du die Prozentreihe (Series5) in deinem Beispiel nicht so verwenden, da beim Design des Chart die Position der Balken noch überhaupt nicht bekannt ist. Vielmehr musst du die Prozentreihe selbst zeichen, und zwar im AfterDraw-Ereignis von TChart:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.Chart1AfterDraw(Sender: TObject);
const
 y0 = 180;
var
  x,y : double;
  u, v : integer;
  i : integer;
  R : TRect;
begin
  RandSeed := 12345;
  R := Series1.BarBounds;
  with Chart1 do begin
    Canvas.Pen.Color := clBlack;
    Canvas.Pen.Style := psSolid;
    y := y0;
    u := Series1.CalcXPos(0) + (R.Right - R.Left) div 2 ;
    v := RightAxis.CalcYPosValue(y);
    Canvas.MoveTo(u, v);
    Canvas.Ellipse(u-3,v-3, u+3,v+3);
    for i:=1 to SeriesCount-2 do begin
      u := Series[i].CalcXPos(0) + (R.Right - R.Left) div 2;
      y := y0 + random * 10;
      v := RightAxis.CalcYPosValue(y);
      Canvas.LineTo(u,v);
      Canvas.Ellipse(u-3,v-3, u+3,v+3);
    end;
  end;
end;


Ich zeichne hier die Prozent-Reihe nur über der 1. Balkengruppe, die anderen gehen analog (ersetzte die 0 in CalcXPos durch den entsprechenden Index der Gruppe.

Zur Erläuterung:
- Mit Series1.BarBounds bestimme ich die Pixelbreite eines Balkens, um später den Datenpunkt über den Balken zentrieren zu können.
- CalcXPos einer Series ermittelt die Bildschirm-x-Koordinate eines Datenpunktes. Bei TBarSeries wird der linke Rand des Balkens genommen
- CalcYPosValue einer Achse rechnet einen Punkt von Welt-Koordinaten auf Bildschirm-Pixel um. Ich verwende die RightAxis, da deine Prozentwerte auf der rechten Achse aufgetragen sind.
- Schließlich wird auf dem Canvas des Chart die Linie gezogen, sowie ein kleiner Kreis gezeichnet.

Wegen der Legende musst du etwas schummeln. Vielleicht definierst du, wie in deinem Beispiel, die 5.Reihe mit denselben Farben etc. wie die manuell gezeichnete Reihe, fügst aber einen Punkt so hinzu, dass er außerhalb der Zeichenfläche liegt.

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 01.10.07 08:02 
Vielen Dank! Der Code funktioniert einwandfrei.

Nur denke ich mal ist das für mich nicht die Lösung, da dass doch zu sehr einer Bastellösung ähnelt und das Chart später noch erweitert wird.

In Excel ist das ausrichten nach den Balken möglich, da muss es doch bei TeeChart auch eine Möglichkeit geben das einfach zu lösen.

So sieht das Ganze manuell für die erste Straße aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  Series5.AddXY(Series4.XValues.Value[0]-0.2180'');
  Series5.AddXY(Series4.XValues.Value[0]-0.1220'');
  Series5.AddXY(Series4.XValues.Value[0], 200'');
  Series5.AddXY(Series4.XValues.Value[0]+0.1190'');

So sind sie zwar nicht perfekt in der Mitte.. aber das bisschen kann man verschmerzen. So oder so ähnlich müsste es jetzt natürlich total dynamisch laufen..

Hat da jemand eine Idee wie ich das realiseren könnte, bzw, gibt es einen anderen Weg?

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Di 02.10.07 09:10 
Push...

Hoffe es kann mir jemand helfen :)

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Do 04.10.07 07:42 
Push...

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Fr 05.10.07 10:35 
Habe nun support von Steema erhalten und warte auf eine Antwort.. hoffe dennoch das sich hier jemand findet :)

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Di 09.10.07 13:16 
Wie wär's mit folgendem Gedanken:

Die Balkengruppen haben in deinem Beispiel intern als x-Werte 1, 2, 3, ... etc, d.h. der Abstand einer Balkengruppe zur nächsten ist 1 x-Einheit. Wenn du nun probeweise die Spaltenbreite jeder Barseries auf 100% setzt (z.B. im Chart-Editor, Seite "Reihen", Feld "Spaltenbreite %", oder mit Property SeriesX.BarwidthPercent), wird das Diagramm komplett mit Balken aufgefüllt, nimmst du 50%, ist die Hälfte der x-Achse mit Balken belegt, dazwischen ist ein gleich großer Zwischenraum.

Das bedeutet, dass jede Balkengruppe insgesamt BarwidthPercent/100 x-Achseneinheiten breit ist. Jeder einzelne Balken ist dann BarwidthPercent/(n*100) Einheiten breit (n ist die Anzahl der Balken jeder Gruppe, bei dir n=4). Die ganze Gruppe muss auf der x-Achse nun noch zentriert werden, also 0.5 subtrahieren. Falls du mit Series.OffsetPercent die Balken gegenüber ihrer Normallage verschiebst, müsste noch eine entsprechende Korrektur in die Formel, aber das will ich jetzt mal ignorieren.

Die Mitte des 1.Balkens der 1.Gruppe sollte damit bei x = 1 + (0.5/n - 0.5)*BW, die des 2. Balkens bei x = 1 + (1.5/n - 0.5)*BW liegen (BW = BarwidthPercent aller Reihen, * 0.01), etc.
Die 2.Gruppe liegt um 1 höher etc.

Allgemein sollte sich die Mitte des i-ten Balken der j-ten Balkengruppe folgendermaßen berechnen lassen (j = 1,..., i=0..n-1):

ausblenden Quelltext
1:
 xij := j + ((i+0.5)/n - 0.5)*BW;					


Diesen x-Wert müsstest du für Series5.AddXY als x-Koordinate verwenden können.