\documentclass[ngerman]{dtk}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
%\usepackage{pslatex}
\usepackage{tabularx}
\usepackage{url}
\usepackage{graphicx}
\usepackage{cite}
%\makeatletter
%\newcommand{\La}%
%   {L\kern-.36em
%        {\setbox0\hbox{T}%
%         \vbox to\ht0{\hbox{$\m@th$%
%                \csname S@\f@size\endcsname
%                \fontsize\sf@size\z@
%                \math@fontsfalse\selectfont
%                A}%
%            \vss}%
%        }}
%\makeatother
%\def\AllTeX{(\La\kern-.075em)\kern-.075em\TeX}

\begin{document}
\NeedPackage{tabularx}
\NeedPackage{url}
\NeedPackage{graphicx}
\NeedPackage{cite}


\title{Die Plot-Funktionen von \texttt{pst-plot}}
\author{Laura E. Jackson\and Herbert Voß}
\maketitle
\begin{abstract}
  Im letzten Heft wurden die mathematischen Funktionen von \PS~im
  Zusammenhang mit dem \LaTeX-Paket \texttt{pst-plot} zum Zeichnen von
  Funktionen beschrieben und durch Beispiele erläutert. In diesem Teil
  werden die bislang nur erwähnten Plot-Funktionen für externe Daten
  behandelt.
\end{abstract}

\section{Einführung}
Die graphische Darstellung externer Datensätze gehört zu den
Standardproblemen von technisch-wissenschaftlichen Veröffentlichungen.
Sehr häufig werden diese mit \texttt{gnuplot} eingelesen, dargestellt,
mit Koordinatenachsen und weiteren Hinweisen versehen und dann
abschließend nach \LaTeX\ exportiert. Im Folgenden werden Wege
aufgezeigt, die den Umweg über \texttt{gnuplot} oder entsprechende
Programme überflüssig machen können.

Die Geschichte und die Bedeutung von \PS\ wurden hinreichend im
letzten Heft \cite{dtk02.1:voss:mathematischen} behandelt, ebenso wie
das benötigte Paket \texttt{pst-plot}
(\url{CTAN:/graphics/pstricks/latex/pst-plot.sty}), welches Teil des
Pakets \texttt{pstricks} ist und mit der Anweisung
\texttt{\textbackslash{}usepackage\{pst-plot\}} einzubinden ist. Daher
braucht an dieser Stelle nicht weiter auf diese spezifischen Dinge
eingegangen zu werden.

Das Paket \texttt{pst-plot} stellt die folgenden drei Plot-Funktionen
für die Darstellung externer Daten mit folgender Syntax zur Verfügung:

\begin{verbatim}
\fileplot*[<Parameter>]{<Dateiname>}
\dataplot*[<Parameter>]{<Befehle>}
\listplot*[<Parameter>]{<Liste>}
\end{verbatim}

Die Sternversionen stehen hierbei wie für alle Objekte von
\texttt{PSTricks} jeweils für die inverse Darstellung der Daten,
d.\,h. für eine standardmäßige Schwarz-Weiß-Grafik erhält man mit der
Sternversion das Negativ. Im Folgenden wird nur die normale
Darstellung berücksichtigt, da dies keine Einschränkung der
Allgemeinheit bedeutet.

Im Zusammenhang mit den Plot-Funktionen sind noch folgende Befehle
interessant, die ebenfalls durch das Paket \texttt{pst-plot} definiert
sind:

\begin{verbatim}
\readdata{<Objectname>}{<Dateiname>}
\savedata{<Objectname>}{<Dateiname>}
\end{verbatim}

Weitere Informationen kann man der Dokumentation zu \texttt{pstricks}
entneh\-men\cite{pstricks} oder der umfangreichen Beschreibung in
\cite{companion,girou:01:,girou:02:}, die jedoch alle nicht die
wesentlichen Unterschiede zwischen den drei Plot-Funktionen
herausarbeiten. Für alle Beispiele wird jeweils die komplette
\texttt{pspicture}-Umgebung angegeben, so dass eine direkte Übernahme
der Beispiele möglich ist. Eine Dokumentation des
\texttt{multido}-Befehls findet man unter \url{CTAN:
  /macros/latex209/contrib/multido/multido.doc}, alle anderen hier
nicht weiter erwähnten in der Dokumenation zu
\texttt{pstricks} \cite{pstricks}.

\section{Plot-Stile}

Insbesondere der Plot-Stil ist als Parameter von Bedeutung und kann
folgende Werte annehmen:

\noindent\begin{tabularx}{1.0\linewidth}{rX}\toprule
  \emph{Stilparameter}	  & \emph{Bedeutung}\\\midrule
%  \hline
  \texttt{plotstyle=dots} & Wertepaare als einzelne Punkte setzen\\
  \texttt{=line}	  & Wertepaare durch eine Gerade verbinden\\
  \texttt{=polygon}	  & Wie \texttt{line}, nur mit geschlossenem
			    Linienzug\\
  \texttt{=curve}	  & Interpolation zwischen den Wertepaaren,
			    wobei die Kurve über den Anfangs-/Endpunkt
			    hinausgehen kann\\
  \texttt{=ecurve}	  & Wie \texttt{curve}, nur beginnt/endet die
			    Kurve bei dem Anfangs-/Endwertepaar.\\
  \texttt{=ccurve}	  & Wie \texttt{curve}, nur mit geschlossenem
			    Kurvenzug\\\bottomrule
\end{tabularx}

Bei einer fehlenden Angabe wird grundsätzlich die \texttt{line}-Option
gewählt.


\section{Beispiele für \texttt{\textbackslash{}fileplot}}

\texttt{fileplot} ist immer dann angebracht, wenn in einer Datei
gespeicherte Zahlenpaare $(x|y)$ geplottet werden sollen. Diese sind
als reine Zahlenwerte paarweise in einer oder mehreren Zeilen
anzuordnen und dürfen nur auf vier verschiedene Arten getrennt sein
(Leerschritt, Komma oder runde bzw. geschweifte Klammern):

\verb#x y       x,y       (x,y)       {x,y}#

Der als Trenner häufig benutzte Tabulator (\texttt{\textbackslash{}t}
bzw. \texttt{\textbackslash{}009}) ist demnach nicht zulässig, kann
aber leicht durch Texteditoren oder für Unix mit

\texttt{tr '\textbackslash{}t' ' ' < inFile > outFile}

ersetzt werden. Diese Datendateien dürfen bis auf das \TeX-übliche
Kommentarzeichen "`\%"' keine anderen Zeichen außer den
Zahlenwerten selbst enthalten.

Das erste Beispiel zeigt ein UV/VIS-Absorptionsspektrum ($A=\lg
\frac{I_{0}}{I}$ als Funktion der Wellenlänge), während das zweite
eine Populationsentwicklung in Abhängigkeit des Brutfaktors darstellt
(Feigenbaum-Diagramm). Aus dem jeweils angegebenen Quellcode ergibt
sich die Art des Plot-Stils.

\begin{minipage}[c]{0.45\linewidth}%
  \centering\includegraphics{plot-pdf-fig1}
\end{minipage}%
\hfill\begin{minipage}[c]{0.52\linewidth}%
  \scriptsize
\begin{verbatim}
\psset{xunit=0.003cm,yunit=1.5cm}
\begin{pspicture}(-0.25,-0.25)(1950,4)
  \fileplot[plotstyle=line, linewidth=1.5pt]{%
    fileplot.data}
  \psaxes[dx=400,Dx=400]{->}(1900,4)
  \multido{\n=200+200}{9}{%
    \psline[linestyle=dotted](\n,0)(\n,4)
  }
  \multido{\n=+1}{5}{%
    \psline[linestyle=dotted](0,\n)(1800,\n)
  }
\end{pspicture}
\end{verbatim}
\end{minipage}%

\begin{minipage}[c]{0.48\linewidth}%
\centering\includegraphics{plot-pdf-fig2}
\end{minipage}%
\hfill{}\begin{minipage}[c]{0.48\linewidth}%
\scriptsize\begin{center}
\begin{verbatim}
\psset{xunit=1.5cm,yunit=6cm}
\begin{pspicture}(-0.25,-.25)(4.25,1)
  \fileplot[plotstyle=dots]{feigenbaum.data}
  \psaxes{->}(0,0)(4.05,1)
  \rput(4,-0.05){$x$}
  \rput(0.2,1.05){$y$}
  \rput[l](0.2,3.5){Feigenbaum-Diagramm}
\end{pspicture}
\end{verbatim}
\end{center}
\end{minipage}%


\texttt{fileplot} hat den Vorteil der einfachen Anwendung, aber den
wesentlichen Nachteil, extrem speicherintensiv zu sein, denn \TeX{}
muss erst alle Zahlenpaare vor einer weiteren Verarbeitung laden. Man
kann davon ausgehen, dass man bei mehr als 1000 Punkten
Schwierigkeiten mit der standardmäßig eingestellten
\TeX-Speicherkapazität bekommen kann. Weiterhin erhöht sich durch das
Laden der Zahlenpaare die Zeit eines Kompilationsvorgangs ganz
erheblich.

Eine Möglichkeit, Speicherproblemen aus dem Weg zu gehen, ist die
Anwendung der \texttt{\textbackslash{}PSTtoEPS}-Funktion des Pakets
\texttt{pst-eps}, auf die hier jedoch nicht weiter eingegangen wird
(siehe dazu \cite{pstricks}).


\section{Beispiel für \texttt{\textbackslash{}dataplot}}

Ebenso wie \texttt{\textbackslash{}fileplot} benötigt
\texttt{\textbackslash{}dataplot} einen externen Datensatz, der durch
eine andere Anwendung erstellt wurde. Im Gegensatz dazu kann dieser
externe Datensatz jedoch nicht mit \texttt{\textbackslash{}dataplot}
selbst geladen werden. Dies erfolgt mit dem oben angegebenen
Befehl \texttt{\textbackslash{}readdata}, beispielsweise

\texttt{\textbackslash{}readdata\{\textbackslash{}feigenbaum\}\{feigenbaum.data\}}

\texttt{\textbackslash{}feigenbaum} ist dann der Name des
Grafikobjekts. Die Zahl der eingelesenen Dateien ist nur durch den
Speicher bestimmt, d.\,h. dass mit \texttt{\textbackslash{}dataplot}
einfache Overlays möglich sind. Die Ausgabe dieser Daten erfolgt mit
\texttt{\textbackslash{}dataplot\{<Objektname>\}}, beispielsweise
\texttt{\textbackslash{}dataplot\{\textbackslash{}feigenbaum\}}.

Das angegebene Beispiel zeigt zwei getrennte Datendateien, die in
einem Koordinatensystem dargestellt werden. Es handelt sich um die
Sortierzeiten der Verfahren "`Bubble-Sort"' und "`Select-Sort"' in
Abhängigkeit der Anzahl der zu sortierenden Elemente, wobei das
Verfahren der Parameter ist. Die Anordnung der Elemente war zu Beginn
jeweils zufällig verteilt.

\begin{minipage}[c]{0.55\linewidth}%
  \centering\includegraphics{plot-pdf-fig3}
\end{minipage}%
\hfill{}\begin{minipage}[c]{0.42\linewidth}%
  \scriptsize\begin{center}
\begin{verbatim}
\psset{xunit=0.0005cm,yunit=0.005cm}
\begin{pspicture}(0,0)(10000,1000)
  \readdata{\bubble}{bubble.data}
  \readdata{\select}{select.data}
  \dataplot[plotstyle=line]{\bubble}
  \dataplot[plotstyle=line]{\select}
  \psline{->}(0,0)(10000,0)
  \psline{->}(0,0)(0,1000)
  \rput[l](40,920){Zeit}
  \rput[r](9990,-30){Elemente}
  \rput[l](4500,800){Bubble-Sort}
  \rput[l](7500,200){Select-Sort}
\end{pspicture}
\end{verbatim}
\end{center}
\end{minipage}%


Grundsätzlich bleibt festzustellen, dass für den reinen Anwender zwischen
\texttt{dataplot} und \texttt{fileplot} formal kein wesentlicher Unterschied
besteht. Bei größeren Datenmengen bringt \texttt{dataplot} den Vorteil
der schnelleren Verarbeitung und Darstellung, wobei es dafür aber
noch speicherplatzintensiver als \texttt{fileplot} ist.

Weiterhin benutzt \texttt{\textbackslash{}dataplot} intern die im
nächsten Abschnitt beschriebene Funktion
\texttt{\textbackslash{}listplot}, wenn Parameter angegeben werden.
Daraus folgt, dass \texttt{\textbackslash{}dataplot} letztlich nur
Sinn macht, wenn Polygonzüge gezeichnet werden sollen. In diesem Fall
zeichnet sich diese Funktion durch eine größere Plot-Geschwindigkeit
aus, macht aber andererseits nichts anderes als die
\texttt{pspolygon}-Funktion.


\section{Beispiel für \texttt{\textbackslash{}listplot}}

Im Gegensatz zu den vorhergehenden Plot-Funktionen wird das Argument
von \texttt{\textbackslash{}listplot} zuerst von \TeX{} expandiert,
wenn es sich um einen \TeX-Befehl handelt, andernfalls wird es
unverändert an \PS\ durchgereicht. Daraus folgt, dass man komplette
\PS-Programme im Argument von \texttt{\textbackslash{}listplot}
ablegen kann. Diese Möglichkeit der Kombination von \TeX{} und
\PS\ bleibt jedoch in der gesamten Literatur zu \texttt{PSTricks}
faktisch unberücksichtigt. Dies liegt wohl auch daran, dass
\texttt{PSTricks} sehr \PS-nah programmiert wurde, sodass sich
letztlich für jede Anwendung entsprechende \texttt{PSTricks}-Befehle
finden lassen.

Das angegebene Beispiel zeigt in der Originaldarstellung die
Entwicklung eines Hènon-Attraktors. Die rechte Grafik enthält
zusätzlich zum normalen Datensatz einen durch erweiterten \PS-Code
erzwungenen "`Draft"'-Hinweis. Hierbei ist zum Verständnis allerdings
eine Kenntnis der \PS-Befehle unabdingbar, wenn dies fehlerfrei
erfolgen soll. Der angegebene Source\-code enthält aus Platzgründen
nicht die eigentlichen Daten, die lediglich aus einer Folge von
Zahlenpaaren bestehen, die durch "`space"' voneinander zu trennen
sind.

\begin{minipage}[c]{0.48\linewidth}%
\centering\includegraphics{plot-pdf-fig4}
\end{minipage}%
\hfill{}\begin{minipage}[c]{0.48\linewidth}%
\centering\includegraphics{plot-pdf-fig5}
\end{minipage}

\begin{minipage}[t]{0.48\linewidth}%
\scriptsize\begin{verbatim}
\readdata{\henon}{henon.dat}
\psset{xunit=1.5cm, yunit=3cm}
\begin{pspicture}(-2,-0.75)(2.25,1.5)
  \psaxes{->}(0,0)(-2,-0.5)(1.5,1.25)
  \listplot[%
    showpoints=true,%
    plotstyle=curve]{\henon}
\end{pspicture}
\end{verbatim}
\end{minipage}%
\hfill{}\begin{minipage}[t]{0.48\linewidth}%
\scriptsize\begin{center}\begin{verbatim}
\newcommand{\DataB}{%
  [ ... Daten ... ]
  gsave          % speichere Grafikstatus
  /Helvetica findfont 40 scalefont setfont
  45 rotate      % Rotiere um 45 Grad
  0.9 setgray    % 1 entspricht Weiß
  -60 10 moveto (DRAFT) show
  grestore
}
\psset{xunit=1.5cm, yunit=3cm}
\begin{pspicture}(-3,-0.75)(2.25,1.5)
  \psaxes{->}(0,0)(-2,-0.5)(1.5,1.25)
  \listplot[%
    showpoints=true,%
    plotstyle=curve]{\dataB}
\end{pspicture}
\end{verbatim}
\end{center}
\end{minipage}%


Zum Manipulieren des Datensatzes von \texttt{\textbackslash{}listplot}
kann alternativ auch die entsprechende Funktion aus \texttt{pst-plot}
verändert werden. Möchte man beispielsweise, aus welchen Gründen auch
immer, die $x|y$-Werte vertauschen und den Graphen um 45° rotieren
lassen (was einer Rotation um die x-Achse mit anschließender Drehung
entspricht), so kann dies einfach durch Neudefinition von
\texttt{\textbackslash{}pst@def} erfolgen, was dann zur folgenden
Abbildung führt:

\begin{minipage}{0.48\linewidth}
\scriptsize\begin{center}\begin{verbatim}
\makeatletter
\pst@def{ScalePoints}<%
%----------------------------------------
  45 rotate % rotiere alle Objekte
%----------------------------------------
  /y ED /x ED
  counttomark dup dup cvi eq 
  not { exch pop } if
  /m exch def /n m 2 div cvi def
  n {
%----------------------------------------
     exch % tausche oberste Stackelemente
%----------------------------------------
     y mul m 1 roll
     x mul m 1 roll
     /m m 2 sub
     def } repeat>
\makeatother
\end{verbatim}
\end{center}\end{minipage}%
\hfill
\begin{minipage}{0.48\linewidth}
  \centering\includegraphics{plot-pdf-fig6}
\end{minipage}


\bibliography{plot}

\address{Herbert}{Voß}{Wasgenstr. 21\\14129 Berlin\\voss@perce.de}
\address{Laura Elizabeth}{Jackson}{Raleigh, North Carolina (USA)\\
 lejacks2@unity.ncsu.edu }
\end{document}
