\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*[]{} \dataplot*[]{} \listplot*[]{} \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{}{} \savedata{}{} \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\{\}}, 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}