Plots

Daten oder Funktionen erst in einem externen Plotprogramm zeichnen und dann als Bild einfügen müssen Sie nicht. LaTeX kann Plots direkt im Dokument aus Daten aufbauen. Die Hauptrolle spielt pgfplots, auf TikZ/PGF aufgebaut. Aus Funktionen, Koordinaten oder Datendateien zeichnet es Linien- und Streudiagramme, Balkendiagramme und sogar 3D-Flächen, mit denselben Schriften und Strichstärken wie der umgebende Text. Diese Seite konzentriert sich auf die pgfplots-Umgebung axis und \addplot, behandelt dann den Aufruf von gnuplot als Rechner und den Import von in R oder Python (matplotlib) gezeichneten Plots als TikZ-Code.

Warum Plots im Dokument setzen

Ein PNG aus Tabellenkalkulation oder Zeichenprogramm passt meist nicht zum Dokument: Achsenbeschriftungen haben eine andere Schrift als der Text, Gleichungen werden unscharfe Rasterbilder, und Linien werden beim Vergrößern gezackt. Ändern sich Daten, muss die Abbildung neu erstellt und eingefügt werden. pgfplots dreht das um und lässt LaTeX den Plot selbst setzen. Achsenzahlen und Legende nutzen dieselbe Schrift wie der Text, Kurven sind Vektoren und bleiben bei jedem Zoom glatt, und Labels können echte Mathematik wie $\sin x$ enthalten.

Ein zweiter Vorteil ist die Trennung von den Daten. Statt Koordinaten im Text fest zu verdrahten, verweisen Sie pgfplots auf eine .dat- oder .csv-Datei; danach reichen Datenaktualisierung und erneutes Kompilieren, damit der Plot folgt. Dieselben Zahlen lassen sich in Aufsatz, Folien und Anhang ohne Abschreibfehler wiederverwenden. Das ist genau die Idee hinter Tabellen aus Daten (siehe Verweise), und pgfplots bringt mit pgfplotstable ein Schwesterpaket für Tabellen mit.

pgfplots ist auf TikZ/PGF aufgebaut, daher liegt die ganze Abbildung in einer tikzpicture-Umgebung, und TikZ-eigene Koordinaten, Nodes und Dekorationen lassen sich frei beimischen. Die Grundlagen von TikZ selbst (\draw, Koordinatensystem, Nodes) behandelt die Seite „TikZ basics“; hier konzentrieren wir uns auf das Plotten.

Das Gerüst von pgfplotsaxis und \addplot

Zuerst laden Sie es im Vorspann und deklarieren eine Kompatibilitätsstufe. \pgfplotsset{compat=1.18} fixiert das Standardverhalten dieser Version, etwa Aussehen der Achsen und Platzierung der Ticks, damit ein künftiges pgfplots-Update Ihre Abbildungen nicht still verändert. Für neue Dokumente setzt man üblicherweise die neueste Nummer, die die installierte Version erlaubt.

latex
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

Im Dokument setzen Sie eine axis-Umgebung in ein tikzpicture; jeder Aufruf von \addplot darin legt eine weitere Kurve ab. Achsen, Ticks, Gitter und Legende werden über Optionen von axis gesetzt, Farbe und Marker jeder Kurve über Optionen von \addplot. Hier ist ein minimales Beispiel.

latex
\begin{tikzpicture}
  \begin{axis}[
    xlabel = {$x$},
    ylabel = {$f(x)$},
    title  = {A parabola},
    grid   = major,
  ]
    \addplot[blue, domain=-3:3, samples=100] {x^2};
    \addlegendentry{$x^2$}
  \end{axis}
\end{tikzpicture}

Dies tastet die Parabel y = x² mit 100 Punkten über −3 ≤ x ≤ 3 ab und zeichnet sie als glatte blaue Kurve. Die Achsen tragen die Labels x und f(x), oben steht der Titel „A parabola“, grid=major legt ein feines Gitter entlang der Hauptticks, und \addlegendentry fügt den Legendeneintrag „x²“ hinzu. Sehen wir uns die Kernpunkte der Reihe nach an.

  • Labels und Titel in Klammern setzen. Mit xlabel={$x$} in {...} können Mathematik oder Kommata sicher enthalten sein.
  • ^ ist Potenz; trigonometrische Funktionen nutzen standardmäßig Grad. Der Ausdruck in \addplot {x^2} wird vom internen pgf-Parser ausgewertet. Funktionen wie \sin erwarten ihr Argument in Grad; für Bogenmaß schreiben Sie sin(deg(x)) mit deg().
  • domain und samples. Ein Funktionsplot tastet das Intervall domain=a:b mit samples=N Punkten ab. Die Standardwerte liegen ungefähr bei −5:5 und 25 Punkten. Wirkt eine Kurve eckig, erhöhen Sie samples.
  • Zwei Arten von Legenden. Entweder nach jeder Kurve \addlegendentry{…} setzen oder in den axis-Optionen gesammelt legend entries={A,B,...} schreiben. Die Position steuern Sie etwa mit legend pos=north west.

Die meistgenutzten axis-Optionen sind unten gesammelt. Sie stehen kommagetrennt im [...] von axis.

OptionWirkung
xlabel= / ylabel=Achsenlabels für x und y; wie xlabel={$x$} in Klammern setzen, Mathematik erlaubt
title=Ein Titel oberhalb des Plots
xmin= xmax= ymin= ymax=Sichtbaren Bereich festlegen (Achsenlimits)
grid=Gitterlinien zeichnen: grid=major an Hauptticks, grid=both auch an Nebenticks
legend pos=Legendenposition: north west usw.; outer north east setzt sie außerhalb der Achsen
xtick=Tickpositionen angeben (z. B. xtick={0,1,2}); xtick=data richtet sie an Datenpunkten aus
width= / height=Abmessungen der Abbildung festlegen
ybarEin vertikales Balkendiagramm erzeugen (unten); xbar für horizontal

Drei Arten, Daten zu liefern — Funktion, Koordinaten, Datei

\addplot nimmt Daten grob auf drei Arten entgegen. Die erste, oben gesehen, ist aus einer Funktion: Ein Ausdruck in {...} wird von pgfplots über domain abgetastet und zur Kurve gemacht.

latex
\addplot[red, domain=0:2*pi, samples=200] {sin(deg(x))};

Dies zeichnet eine Sinuskurve von 0 bis 2π. Da x im Bogenmaß vorliegt, ist der entscheidende Punkt die Hülle deg(), die den Wert in Grad umwandelt, bevor er bei \sin ankommt, das in Grad arbeitet.

Die zweite ist aus Inline-Koordinaten: Listen Sie (x,y)-Paare in coordinates {...} auf, und pgfplots verbindet die Punkte der Reihe nach als Linie oder, nur mit Markern, als Streudiagramm. Praktisch bei wenigen Messwerten.

latex
\addplot[mark=*, blue] coordinates {
  (0,0) (1,1) (2,4) (3,9) (4,16)
};

Hier werden fünf Punkte durch eine blaue Linie verbunden, jeweils mit einem gefüllten Kreismarker (mark=*). Soll die Linie wegfallen und nur die Punkte bleiben, verwenden Sie only marks; den Linienstil ändern Sie etwa mit dashed.

Die dritte und in der Praxis wichtigste Art ist aus einer Datendatei. table {filename} liest eine durch Leerraum getrennte Textdatei. Die erste Zeile benennt die Spalten (Header), und standardmäßig plottet pgfplots Spalte 1 als x und Spalte 2 als y. Angenommen, Sie haben dieses data.dat.

data.dat
x   y
0   0.0
1   0.8
2   0.9
3   0.1
4  -0.8
5  -1.0
latex
\begin{tikzpicture}
  \begin{axis}[xlabel={$x$}, ylabel={$y$}, grid=major]
    \addplot[mark=square, teal] table {data.dat};
    % 列名で明示するなら:
    % \addplot table[x=x, y=y] {data.dat};
  \end{axis}
\end{tikzpicture}

Für explizite Angabe benennen Sie die Spalten, etwa table[x=x, y=y] {data.dat}. Namen sind groß-/kleinschreibungssensitiv. Für CSV mit Kommas verwenden Sie table[col sep=comma]{...}; Zeilen, die mit # oder % beginnen, werden als Kommentare übersprungen. Wenn Daten umgeformt oder berechnete Spalten abgeleitet werden sollen, hilft das Schwesterpaket pgfplotstable (siehe „Tables from data“).

Balkendiagramme, Log-Achsen und 3D

Derselbe Rahmen aus axis und \addplot kann die Darstellung der Daten ändern. Für ein Balkendiagramm geben Sie axis einfach die Option ybar für vertikale Balken. Mehrere \addplot-Aufrufe werden automatisch seitlich versetzt zu gruppierten Balken.

latex
\begin{tikzpicture}
  \begin{axis}[
    ybar,
    xlabel = {Year}, ylabel = {Count},
    symbolic x coords = {2023, 2024, 2025},
    xtick = data,
  ]
    \addplot coordinates {(2023,40) (2024,55) (2025,72)};
  \end{axis}
\end{tikzpicture}

Hier werden die Jahre als Zeichenketten mit symbolic x coords als x-Achsenlabels genutzt; xtick=data richtet die Ticks an den Datenpunkten aus. Für horizontale Balken verwenden Sie xbar.

Logarithmische Achsen entstehen einfach durch Austausch von axis gegen einen anderen Umgebungsnamen: loglogaxis für log-log, semilogxaxis nur für eine logarithmische x-Achse und semilogyaxis nur für y. Am inneren \addplot ändert sich nichts.

latex
\begin{tikzpicture}
  \begin{loglogaxis}[xlabel={$x$}, ylabel={$y$}]
    \addplot[domain=1:1000, samples=50] {1/x};
  \end{loglogaxis}
\end{tikzpicture}

Für 3D verwenden Sie \addplot3, und axis wird automatisch dreidimensional. Geben Sie surf für eine Fläche oder mesh für ein Drahtgitter an und schreiben Sie die Funktion in den zwei Variablen x und y. 3D aus Koordinaten oder einer Datendatei läuft ebenso über \addplot3.

latex
\begin{tikzpicture}
  \begin{axis}[xlabel={$x$}, ylabel={$y$}, zlabel={$z$}]
    \addplot3[surf, samples=30, domain=-3:3]
      {exp(-x^2 - y^2)};
  \end{axis}
\end{tikzpicture}

Dies zeichnet die glockenförmige Gaußfläche z = e^(−x²−y²) auf einem 30×30-Gitter als farbige Fläche. Den Blickwinkel drehen Sie mit view={azimuth}{elevation}.

gnuplot als Rechner verwenden

Der eigene Parser von pgfplots ist praktisch, kann bei komplizierten Ausdrücken oder vielen Samples aber schwach sein. Mit \addplot gnuplot {...} übergeben Sie die numerische Arbeit an das externe Programm gnuplot, das die Koordinaten berechnet; pgfplots liest sie anschließend zurück und zeichnet. Im Effekt dient gnuplot als „Taschenrechner“.

latex
\begin{tikzpicture}
  \begin{axis}[xlabel={$x$}, ylabel={$y$}]
    \addplot[blue] gnuplot[domain=0:10] {sin(x)};
  \end{axis}
\end{tikzpicture}

Zwei Hinweise sind wichtig. Erstens ist --shell-escape erforderlich: Weil LaTeX ein externes Kommando (gnuplot) startet, müssen Sie mit aktivierter Ausführung externer Befehle kompilieren, etwa pdflatex --shell-escape document (auch -write18 genannt). Sonst läuft es nicht. Während der Verarbeitung entstehen Zwischendateien für gnuplot; die Ergebnisse werden dort geschrieben und zurückgelesen.

Zweitens unterscheidet sich die Syntax: Ausdrücke, die an gnuplot gehen, werden von gnuplots eigener Mathematik-Engine ausgewertet. Der Potenzoperator ist daher gnuplots `** statt pgfplots^, und trigonometrische Funktionen arbeiten standardmäßig im **Bogenmaß**. Dieselbe Sinuskurve schreiben Sie also mit dem eingebauten Parser als {sin(deg(x))}, über gnuplot aber als {sin(x)}. Da --shell-escape` aus Sicherheitsgründen standardmäßig deaktiviert ist, aktivieren Sie es nur bei Bedarf.

Plots aus R und Python importieren

Wenn die Analyse bereits in R oder Python erfolgt ist und Sie die Plots wiederverwenden möchten, aber ohne die Schwächen eingefügter Bilder wie falsche Schriften oder unscharfe Gleichungen, lassen Sie das jeweilige Werkzeug TikZ/pgfplots-Code ausgeben. Dann wird der Plot als Teil des Dokuments gesetzt, mit Schriften und Mathematik passend zum Text.

In R stellt das Paket tikzDevice ein „Graphics Device“ bereit, das R-Standardgrafik, einschließlich Base-Plots und ggplot2, als TikZ-Code schreibt. Öffnen Sie das Device mit tikz(), führen Sie Ihren gewohnten Plotcode aus und schließen Sie mit dev.off(), um eine .tex-Datei zu erhalten. Weil es LaTeX beim Platzieren von Text nach Zeichenkettenbreiten und Schriftmetriken fragt, passt die Ausgabe exakt zur Textschrift, und Achsenlabels können LaTeX-Mathematik enthalten. Mit standAlone=TRUE entsteht ein vollständiges, separat kompilierbares Dokument.

R
library(tikzDevice)
tikz("plot.tex", width = 4, height = 3)
plot(cars$speed, cars$dist,
     xlab = "Speed", ylab = "Distance")
dev.off()

In Python (matplotlib) wandelt tikzplotlib (früher matplotlib2tikz) eine mit matplotlib.pyplot erstellte Abbildung in pgfplots-Code um. Schreiben Sie sie mit tikzplotlib.save("figure.tex") aus und binden Sie sie in LaTeX mit \input{figure.tex} ein. Beachten Sie, dass tikzplotlib nicht mehr gepflegt wird; ein Fork, matplot2tikz, wird als Nachfolger entwickelt. Für neue Arbeiten sollten Sie matplot2tikz erwägen; die API ist fast gleich.

python
import matplotlib.pyplot as plt
import tikzplotlib  # or: import matplot2tikz

plt.plot([0, 1, 2, 3], [0, 1, 4, 9])
plt.xlabel("$x$")
plt.ylabel("$x^2$")
tikzplotlib.save("figure.tex")

Beide Wege erzeugen eine .tex-Datei, die intern pgfplots nutzt; das Dokument braucht also ebenfalls \usepackage{pgfplots} und \pgfplotsset{compat=...}. Dass der erzeugte Code von Hand nachjustiert werden kann, ist ein weiterer Vorteil gegenüber Bilddateien.

Leistung und Externalisierung

pgfplots ist schön, aber bei großen Datenmengen langsam und speicherhungrig. Ein Streudiagramm mit Zehntausenden Punkten kann die Kompilierung verlängern oder TeXs Speichergrenzen erreichen. Es gibt mehrere Gegenmaßnahmen.

  • Punkte ausdünnen. Zeichnen Sie mit each nth point=k nur jeden k-ten Punkt oder verwerfen Sie Daten außerhalb des Bereichs mit Filtern wie filter discard if not.
  • Externalisierung. Mit \usepgfplotslibrary{external} und \tikzexternalize wird jede Abbildung einmal in ein eigenes PDF kompiliert und danach nur noch eingebunden; Neukompilierungen des Textes werden leicht (benötigt --shell-escape).
  • Eine Engine mit mehr Speicher. LuaLaTeX hat lockerere Speichergrenzen und eignet sich für große Abbildungen.
  • Vorher extern rendern. Bleibt ein Plot zu schwer, ist der Import eines in R, Python oder gnuplot gezeichneten Ergebnisses (voriger Abschnitt) oft praktischer.

Funktionen, die --shell-escape benötigen, etwa Externalisierung oder gnuplot, müssen beim Build in CI oder Container aktiviert werden. Siehe dazu die verwandte Seite zu Docker / CI setup.