Einzelnen Beitrag anzeigen

Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#1

Histogramm Einteilungsprobleme

  Alt 22. Mai 2009, 11:15
Hallo ich versuche gerade ein Histogramm zu machen mit einer automatischen Y-Achseneinteilung, aber irgendwie klappt es nicht so wie ich es will, bis auf die X-Achse. Vielleicht hat jemand ein paar Tipps, wäre super.
Hier ist der Quelltext:
Delphi-Quellcode:
procedure Histogramm(Px_werte,Panzahl_werte : TStringList; Py_max : Integer);
var i,j,z,z2,z3,Py_laenge,y_einteilung,y_beschriftung : Integer;
begin
  Py_laenge := 300;

  //y-Achse einteilen
  z3:=1;
  while Py_laenge mod Py_max <> 0 do
    begin
      Inc(Py_max);
      Inc(z3);
    end;

  y_einteilung := round(Py_laenge/Py_max);
  SetRoundMode(rmUp);
  y_beschriftung := round(Py_max/y_einteilung);
  SetRoundMode(rmNearest);

  //X-Achse mit Beschriftung zeichnen
  Form1.image1.Canvas.MoveTo(50,350); //x-Achsen Startpunkt
  i := 100;
  z := 0;
  repeat
    Form1.image1.Canvas.LineTo(i,350); //x-Achse
    if z < Px_werte.Count then
      begin
//Histokramm positive Flanke
        Form1.image1.Canvas.LineTo(i,y_einteilung*(Py_max+z3-StrToInt(Panzahl_werte[z])));
//Waagerechte verbindung zw Flanken
        Form1.image1.Canvas.LineTo(i+51,y_einteilung*(Py_max+z3-StrToInt(Panzahl_werte[z])));
        Form1.image1.Canvas.LineTo(i+51,350); //Histokramm negative Flanke
        Form1.image1.Canvas.TextOut(i,355,Px_werte[z]);
      end;
    Form1.image1.Canvas.MoveTo(i,350);
    Inc(i,50);
    inc(z);
  until z = Px_werte.Count+2;


  //Y-Achse mit Beschriftung zeichnen
  Form1.image1.Canvas.TextOut(25,350,'0');
  Form1.image1.Canvas.MoveTo(50,350);//y-Achsen Startpunkt
  Form1.image1.Canvas.LineTo(50,350-Py_laenge);//y-Achse

  z2 := 1;
  i := 350;
  repeat
    if i<350 then
      begin
        Form1.image1.Canvas.TextOut(25,i,IntToStr(y_beschriftung*z2));
        Form1.image1.Canvas.MoveTo(50,i);
        Form1.image1.Canvas.Pen.Style := psDot;
        Form1.image1.Canvas.LineTo(50+300,i);
        Inc(z2);
      end;
    dec(i,y_einteilung)
  until i < 350-Py_laenge;

end;

Beispiel Stringlisten zum testen:

Delphi-Quellcode:
var x_werte,anzahl_werte : TStringList;
begin
  x_werte := TStringList.Create;
  anzahl_werte:= TStringList.Create;

  x_werte.Add('1,322');
  anzahl_werte.Add('2');
  x_werte.Add('3,23');
  anzahl_werte.Add('4');
  x_werte.Add('5,888');
  anzahl_werte.Add('5');
  x_werte.Add('7,785');
  anzahl_werte.Add('16');
  x_werte.Add('8,785');
  anzahl_werte.Add('3');
  x_werte.Add('9,788');
  anzahl_werte.Add('1');

  Histogramm(x_werte,anzahl_werte,16);

    x_werte.Free;
    anzahl_werte.Free;
end;
  Mit Zitat antworten Zitat