Ein schönes Diagramm mittels LaTeX und pgfplots aus Meßdaten unter besonderer Berücksichtigung der Datenmenge
Der Anlaß

Es soll ein Diagramm aus Meßdaten erstellt werden.

Damit die Schrift und die Strichstärken zum Rest des gesamten Dokumentes passen, soll das Diagramm direkt in LaTeX erstellt werden.

Das Mittel der Wahl ist pgfplots.

Die folgende Beschreibung bezieht sich auf ein Windows-System mit einer MiKTeX-Installation. Bei anderen Konfigurationen (anderes OS, andere LaTeX-Distribution) können Abweichungen auftreten.

Die Vorbereitung

Es soll eine arbeitsfähige aktuelle LaTeX-Installation – in diesem Beispiel MiKTeX 2.9 vom 2011-07-11 – vorhanden sein.

Außerdem muß die Datei mit den Meßdaten vorbereitet werden, indem das Dezimaltrennzeichen in einen Punkt und das Spaltentrennzeichen in einen Tabulator umgewandelt wird. Dazu wird die Datei entweder in einem Tabellenkalkulationsprogramm, z. B. Libre Office Calc, oder in einem Editor, z. B. Notepad ++, geöffnet. Im ersten Fall erfolgt die Umwandlung der Spaltentrennzeichen beim Einlesen resp. beim Speichern der Datei, im zweiten ebenso wie das Ersetzen des Dezimaltrennzeichens durch globales Suchen und Ersetzen.

Das Ergebnis sieht für die ersten Zeilen wie folgt aus:

0	-0.051319599
0.002426667	-0.052213669
0.004853333	-0.052630901
0.00728	-0.052630901
0.009706667	-0.052332878
0.012133333	-0.051736832

Für die spätere Beschriftung der Peaks wird die Datei nach lokalen Maximalwerten durchgesehen und die Wertepaare notiert.

Die LaTeX-Datei

Es sei hier aus Gründen der Übersichtlichkeit nur das Minimalbeispiel aufgeführt.

Zunächst wird das Grundgerüst erstellt mit Dokumentenklasse, den benötigten Stildateien und der Dokument- sowie einer tikzpicture-Umgebung:

\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[locale=DE]{siunitx}

\begin{document}

\begin{tikzpicture}
\end{tikzpicture}

\end{document}
Das siunitx-Paket ist hier nicht unbedingt nötig, findet aber im Gesamtdokument Anwendung und soll deshalb auch hier genutzt werden.

Dann wird der Diagrammrahmen erstellt: Die x-Achse unten, die y-Achse links und beide mit einer Beschriftung. Der Definitionsbereich läuft von 0 bis 21, der Wertebereich von -10 (damit der Graph nicht die x-Achse überdeckt) bis 650. Die Werte wurden aus der Meßwertdatei entnommen. Die Gesamtgröße soll die Linienbreite mal 10 cm sein:

\begin{axis}[axis x line=bottom,
	axis y line=left,
	xlabel= Retentionsvolumen $\lbrack{}$ \si{\milli\liter} $\rbrack$, 
	xmin=0,
	xmax=21,
	ylabel= Extinktion $\lbrack{}$ \si{mAU} $\rbrack$,
	ymin=-10,
	ymax=650,
	width=1\linewidth ,
	height=10cm]

Ein erster Testlauf bringt folgendes Ergebnis (Ausschnitt):

Der Diagrammrahmen

Alles ganz nett, aber ohne Daten nicht sehr nützlich. Da es sehr viele Daten sind, sollen sie als kleine Punkte dargestellt werden, ohne von einer Linie verbunden zu sein. Unter Umständen kann das eine Veranschaulichung der Abtastrate mit sich bringen.

\addplot+[only marks,color=blue,mark options={scale=0.08},mark=*] file {diagramm_mit_pgfplots_daten.txt};

Ein LaTeX-Lauf endet mit der Fehlermeldung

->\pgfplotstreamstart \pgfplots@stream@ {0}{0.0pt}{3.61052pt}\pgfplots@stream@ \ETC.
! TeX capacity exceeded, sorry [main memory size=3000000].
\pgfplotsapplistXXpushback@smallbufoverfl ...tokb
								  }\let \pgfplotsapplistXX@s...
l.44    \end{axis}

!  ==> Fatal error occurred, no output PDF file produced!

Die Zwischenbereitung

Zur Speichererweiterung wird ein Eingabefenster als Administrator geöffnet und für pdflatex neue Werte eingestellt:

initexmf --admin --edit-config-file=pdflatex
Im sich daraufhin öffnenden Editor werden neue Speicherwerte eingetragen:
main_memory=4000000
extra_mem_top=4000000
extra_mem_bot=4000000
font_mem_size=4000000
pool_size=4000000
und anschließend gespeichert. Nun muß die neue Datei – pdflatex.ini – dem LaTeX-System bekannt gemacht und neue dump-files angelegt werden:
initexmf --admin --update-fndb --dump=pdflatex

Die LaTeX-Datei II

Ein erneuter Kompeileraufruf ergibt ein verbessertes Bild (Ausschnitt):

Ein erster Graph
Da der Pfeil der x-Achse und das Ende des Graphen unschön übereinander liegen, wird der xmax-Wert auf 21.9 erhöht.

Nun sollen noch die Peaks beschriftet werden. Dazu werden nodes eingefügt, rotiert und mit Text versehen:

\node[coordinate,pin = {[rotate=90]right: Text}] at (axis cs:7.7532,100) {};
Die x-Koordinate wurde aus der Meßwertdatei entnommen, die y-Koordinate willkürlich festgelegt.

Die komplette LaTeX-Datei sieht dann so aus:

\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[locale=DE]{siunitx}

\begin{document}

\begin{tikzpicture}
	\begin{axis}[axis x line=bottom,
		axis y line=left,
		xlabel= Retentionsvolumen $\lbrack{}$ \si{\milli\liter} $\rbrack$, 
		xmin=0,
		xmax=21.9,
		ylabel= Extinktion $\lbrack{}$ \si{mAU} $\rbrack$,
		ymin=-10,
		ymax=650,
		width=1\linewidth ,
		height=10cm]
	\addplot+[only marks,color=blue,mark options={scale=0.08},mark=*] file {diagramm_mit_pgfplots_daten.txt};
	%%%Peaks beschriften:
	\node[coordinate,pin = {[rotate=90]right:\SI{7,75}{\milli\liter} Aprotinin}] at (axis cs:7.7532,100) { };
	\node[coordinate,pin = {[rotate=90]right:\SI{11,93}{\milli\liter} Aprotinin}] at (axis cs:11.92949333,100) { };
	\node[coordinate,pin = {[rotate=90]right:\SI{16,40}{\milli\liter} Vitamin B12}] at (axis cs:16.39213333,300) { };
	\node[coordinate,pin = {[rotate=90]right:\SI{17,39}{\milli\liter} Glutathion}] at (axis cs:17.38706667,300) { };
	\node[coordinate,pin = {[rotate=90]right:\SI{18,52}{\milli\liter} Methionin}] at (axis cs:18.52032,300) { };
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	\end{axis}
\end{tikzpicture}

\end{document}

und liefert das Diagramm

Ein erster Graph

Wer es gern ausprobieren möchte: Hier ist die Meßwerttabelle.

 
LaTeX | projekte | © suedraum, 19. Juli 2011