Kreisdiagramm


%!PS-Adobe-1.0
%%Creator: Holger Gehringer
%%Title: Beispiel fuer Kreisdiagramm
%%CreationDate: Mo, 23.11.1998
%%DocumentMedia: A4 595 842 0 () ()
%%Orientation: Portrait
%%Pages: (atend)
%%DocumentFonts: Times-Roman Helvetica
%%EndComments

% Das Programm zeichnet ein Kreisdiagramm aus verschiedenen Werten

/PieDict 24 dict def          % Lokaler Speicher fuer DrawPieChart

PieDict begin
  /DrawSlice                  % zeichnet einzelnes Kreissegment; benoetigt
                              % folgende vier Parameter:
  { /Grayshade exch def       % Grauwert fuer die Einfaerbung
    /Endangle exch def        % Endwinkel des Kreissegments
    /Startangle exch def      % Startwinkel des Kreissegments
    /TheLabel exch def        % Beschriftung
    newpath
    0 0 moveto
    0 0 Radius Startangle     % Umriss des Segments konstruieren
    Endangle arc
    closepath
    1.415 setmiterlimit       % Um Spitzen zu vermeiden, werden Winkel unter
                              % 90 Grad abgeschnitten.
    gsave
    Grayshade setgray fill    % Das Kreissegment wird gefuellt
    grestore stroke           % Umriss einzeichnen
    gsave
    Startangle Endangle add   % Position des Markierungsstriches berechnen.
    2 div rotate
    Radius 0 translate
    newpath
    0 0 moveto
    LabelPS .8 mul            % Die Strichlaenge soll 80% der Schriftgroesse
    0 lineto stroke           % betragen.
    LabelPS 0 translate       % Startpunkt fuer die Beschriftung etwas aus-
                              % serhalb des Kreises anlegen.
    0 0 transform             % Da Beschriftung waagrecht sein soll, muss zum
    grestore                  % alten Koord.s. zurueckgekehrt werden. Aktuel-
    itransform                % le Position merken, indem sie in absolute Ko-
                              % ordinaten des Ausgabegeraetes umgerechnet
                              % (transform) und nach grestore wieder zurueck-
                              % transformiert (itransform) wird.
    /y exch def /x exch def
    x y moveto
    x 0 lt                    % Die Position fuer die Beschriftung wird noch
    { TheLabel stringwidth    % korrigiert, abhaengig davon, ob sich diese
      pop neg 0 rmoveto       % links oder rechts, unten oder oben befindet.
    } if
    y 0 lt
    { 0 LabelPS neg rmoveto } if
    TheLabel show             % Beschriftung ausgeben
  } def
  
  /FindGray                   % ermittelt geeigneten Grauwert fuer K.segment
  { /i exch def               % i-tes Segment (1. .n)
    /n exch def               % Segmente insgesamt
    i 2 mod 0 eq              % Damit aehnliche Grauwerte nicht direkt neben-
    { i  2 div n 2 div        % einanderliegen, werden helle und dunkle Seg-
      round add n div         % mente abwechselnd gezeigt.
    }
    { 1 1 add 2 div n div
    } ifelse
  } def
end

/DrawPieChart                 % zeichnet komplettes Kreisdiagramm; benoetigt
{ PieDict begin               % sieben Parameter:
    /Radius exch def          % Radius des Kreises
    /YCenter exch def         % Mittelpunkt des Kreises
    /XCenter exch def
    /PieArray exch def        % Ein Array mit Werten
    /LabelPS exch def         % Schriftgroesse der Beschriftungen
    /TitlePS exch def         % Schriftgroesse des Titels
    /Title exch def           % Titeltext
    
    gsave
    XCenter YCenter translate
    /Helvetica findfont
    TitlePS scalefont setfont
    Title stringwidth         % Der Titel wird unter dem Kreis zentriert
    pop 2 div neg
    Radius neg                % Abstand vom Kreis betraegt das 3-fache der
    TitlePS 3 mul sub moveto  % Schriftgroesse
    Title show                % Titel ausgeben
    
    /Helvetica findfont       % Font fuer die Beschriftungen
    LabelPS scalefont setfont
    /NumSlices
    PieArray length def
    /SliceCount 0 def
    /CurAngle 0 def           % 'Schleifenvariable', die den Startwinkel des
                              % jeweiligen Segments festhaelt.
    PieArray                  % Alle Elemente werden nacheinander abgearbeit.
    { /SliceArray exch def
      SliceArray aload pop
      /Percent exch def
      /Label exch def
      /PerAngle               % Der Prozentwert wird in den entsprechenden
      Percent 360 mul def     % Winkel umgerechnet
      /SliceCount
      SliceCount 1 add def
      Label CurAngle CurAngle PerAngle add
      NumSlices SliceCount FindGray
      DrawSlice
      /CurAngle               % Startwinkel fuer naechstes Segment errechnen.
      CurAngle PerAngle
      add def
    } forall
    grestore
  end
} def

%%EndProlog

%%Page: 1 1
(Eisverkauf August)           % Titel
24 12                         % Schriftgroessen
[ [(Vanille) .12]             % PieArray ist ein Array aus Paaren Beschrif-
  [(Schokolade) .16]          % tung/Prozentwert.
  [(Erdbeer) .25]
  [(Rum-Traube) .08]
  [(Stracciatella) .19]       % (Es ist darauf zu achten, dass die Summe der
  [(Sonstige) .20]            % Prozentwerte genau 1 ergibt.)
] 300 400 140 DrawPieChart

showpage

%%Trailer
%%Pages: 1


Vorschau:

Download PostScript-File

© Holger Gehringer, Dezember 1998