Textdarstellung mit XeLaTeX/LuaLaTeX über das pgf-Backend#

Mit dem pgf-Backend kann Matplotlib Grafiken als pgf-Zeichenbefehle exportieren, die mit pdflatex, xelatex oder lualatex verarbeitet werden können. XeLaTeX und LuaLaTeX verfügen über vollständige Unicode-Unterstützung und können jede im Betriebssystem installierte Schriftart verwenden, wodurch fortgeschrittene typografische Funktionen von OpenType, AAT und Graphite genutzt werden können. Pgf-Bilder, die mit plt.savefig('figure.pgf') erstellt wurden, können als Rohbefehle in LaTeX-Dokumente eingebettet werden. Grafiken können auch direkt kompiliert und als PDF mit plt.savefig('figure.pdf') gespeichert werden, indem das Backend gewechselt wird.

matplotlib.use('pgf')

oder indem das pgf-Backend explizit angefordert wird.

plt.savefig('figure.pdf', backend='pgf')

oder indem es für die Verarbeitung von PDF-Ausgaben registriert wird.

from matplotlib.backends.backend_pgf import FigureCanvasPgf
matplotlib.backend_bases.register_backend('pdf', FigureCanvasPgf)

Die letzte Methode ermöglicht es Ihnen, reguläre interaktive Backends weiter zu verwenden und von der grafischen Benutzeroberfläche aus per xelatex, lualatex oder pdflatex kompilierte PDF-Dateien zu speichern. Beachten Sie, dass in diesem Fall die interaktive Anzeige weiterhin die Standard-Interaktiv-Backends (z. B. QtAgg) verwendet und insbesondere LaTeX zum Kompilieren relevanter Textausschnitte verwendet.

Die pgf-Unterstützung von Matplotlib erfordert eine aktuelle LaTeX-Installation, die die TikZ/PGF-Pakete (wie z. B. TeXLive) enthält, vorzugsweise mit installiertem XeLaTeX oder LuaLaTeX. Wenn entweder pdftocairo oder ghostscript auf Ihrem System vorhanden ist, können Grafiken optional auch als PNG-Bilder gespeichert werden. Die ausführbaren Dateien für alle Anwendungen müssen sich in Ihrer PATH befinden.

rcParams, die das Verhalten des pgf-Backends steuern.

Parameter

Dokumentation

pgf.preamble

Zeilen, die in die LaTeX-Präambel aufgenommen werden sollen.

pgf.rcfonts

Schriftarten aus rc-Parametern mithilfe des fontspec-Pakets einrichten.

pgf.texsystem

Entweder "xelatex" (Standard), "lualatex" oder "pdflatex".

Hinweis

TeX definiert eine Reihe von Sonderzeichen, wie z. B.

# $ % & ~ _ ^ \ { }

Im Allgemeinen müssen diese Zeichen korrekt maskiert werden. Zur Bequemlichkeit werden einige Zeichen (_, ^, %) außerhalb von Mathe-Umgebungen automatisch maskiert. Andere Zeichen werden nicht maskiert, da sie häufig in tatsächlichen TeX-Ausdrücken benötigt werden. Man kann TeX jedoch über eine benutzerdefinierte Präambel dazu bringen, sie als "normale" Zeichen zu behandeln (für TeX bekannt als "catcode 12"), wie z. B.:

plt.rcParams["pgf.preamble"] = (
    r"\AtBeginDocument{\catcode`\&=12\catcode`\#=12}")

Mehrseitige PDF-Dateien#

Das pgf-Backend unterstützt auch mehrseitige PDF-Dateien mit PdfPages.

from matplotlib.backends.backend_pgf import PdfPages
import matplotlib.pyplot as plt

with PdfPages('multipage.pdf', metadata={'author': 'Me'}) as pdf:

    fig1, ax1 = plt.subplots()
    ax1.plot([1, 5, 3])
    pdf.savefig(fig1)

    fig2, ax2 = plt.subplots()
    ax2.plot([1, 5, 3])
    pdf.savefig(fig2)

Schriftartspezifikation#

Die Schriftarten, die zur Ermittlung der Größe von Textelementen oder beim Kompilieren von Grafiken zu PDF verwendet werden, sind normalerweise in den rcParams definiert. Sie können auch die Standard-Computer Modern-Schriftarten von LaTeX verwenden, indem Sie die Listen für rcParams["font.serif"] (Standard: ['DejaVu Serif', 'Bitstream Vera Serif', 'Computer Modern Roman', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', 'Nimbus Roman No9 L', 'Times New Roman', 'Times', 'Palatino', 'Charter', 'serif']), rcParams["font.sans-serif"] (Standard: ['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']) oder rcParams["font.monospace"] (Standard: ['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace']) löschen. Bitte beachten Sie, dass die Glyphenabdeckung dieser Schriftarten sehr begrenzt ist. Wenn Sie das Schriftgesicht von Computer Modern beibehalten möchten, aber eine erweiterte Unicode-Unterstützung benötigen, sollten Sie die Computer Modern Unicode-Schriftarten installieren, wie z. B. CMU Serif, CMU Sans Serif usw.

Beim Speichern in .pgf wird die von Matplotlib für das Layout der Grafik verwendete Schriftartkonfiguration in den Header der Textdatei aufgenommen.

import matplotlib.pyplot as plt

plt.rcParams.update({
    "font.family": "serif",
    # Use LaTeX default serif font.
    "font.serif": [],
    # Use specific cursive fonts.
    "font.cursive": ["Comic Neue", "Comic Sans MS"],
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.text(0.5, 3., "serif")
ax.text(0.5, 2., "monospace", family="monospace")
ax.text(2.5, 2., "sans-serif", family="DejaVu Sans")  # Use specific sans font.
ax.text(2.5, 1., "comic", family="cursive")
ax.set_xlabel("µ is not $\\mu$")

Benutzerdefinierte Präambel#

Eine vollständige Anpassung ist durch Hinzufügen eigener Befehle zur Präambel möglich. Verwenden Sie rcParams["pgf.preamble"] (Standard: ''), wenn Sie die Mathe-Schriftarten konfigurieren möchten, z. B. mit unicode-math, oder um zusätzliche Pakete zu laden. Wenn Sie die Schriftartkonfiguration selbst vornehmen möchten, anstatt die in den rc-Parametern angegebenen Schriftarten zu verwenden, stellen Sie sicher, dass rcParams["pgf.rcfonts"] (Standard: True) deaktiviert ist.

import matplotlib as mpl

mpl.use("pgf")
import matplotlib.pyplot as plt

plt.rcParams.update({
    "font.family": "serif",  # use serif/main font for text elements
    "text.usetex": True,     # use inline math for ticks
    "pgf.rcfonts": False,    # don't setup fonts from rc parameters
    "pgf.preamble": "\n".join([
         r"\usepackage{url}",            # load additional packages
         r"\usepackage{unicode-math}",   # unicode math setup
         r"\setmainfont{DejaVu Serif}",  # serif font via preamble
    ])
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.set_xlabel("unicode text: я, ψ, €, ü")
ax.set_ylabel(r"\url{https://matplotlib.de}")
ax.legend(["unicode math: $λ=∑_i^∞ μ_i^2$"])

Auswahl des TeX-Systems#

Das von Matplotlib zu verwendende TeX-System wird durch rcParams["pgf.texsystem"] (Standard: 'xelatex') ausgewählt. Mögliche Werte sind 'xelatex' (Standard), 'lualatex' und 'pdflatex'. Bitte beachten Sie, dass bei der Auswahl von pdflatex die Schriftarten und die Unicode-Verarbeitung in der Präambel konfiguriert werden müssen.

import matplotlib.pyplot as plt

plt.rcParams.update({
    "pgf.texsystem": "pdflatex",
    "pgf.preamble": "\n".join([
         r"\usepackage[utf8x]{inputenc}",
         r"\usepackage[T1]{fontenc}",
         r"\usepackage{cmbright}",
    ]),
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.text(0.5, 3., "serif", family="serif")
ax.text(0.5, 2., "monospace", family="monospace")
ax.text(2.5, 2., "sans-serif", family="sans-serif")
ax.set_xlabel(r"µ is not $\mu$")

Fehlerbehebung#

  • Unter Windows muss die Umgebungsvariable PATH möglicherweise geändert werden, um die Verzeichnisse aufzunehmen, die die ausführbaren Dateien von latex, dvipng und ghostscript enthalten. Weitere Details finden Sie unter Umgebungsvariablen und Festlegen von Umgebungsvariablen unter Windows.

  • Manchmal ist die Schriftartendarstellung in Grafiken, die als PNG-Bilder gespeichert werden, sehr schlecht. Dies geschieht, wenn das pdftocairo-Tool nicht verfügbar ist und ghostscript für die Konvertierung von PDF in PNG verwendet wird.

  • Stellen Sie sicher, dass das, was Sie versuchen zu tun, in einem LaTeX-Dokument möglich ist, dass Ihre LaTeX-Syntax gültig ist und dass Sie Rohzeichenketten verwenden, falls erforderlich, um unbeabsichtigte Escape-Sequenzen zu vermeiden.

  • rcParams["pgf.preamble"] (Standard: '') bietet viel Flexibilität und viele Möglichkeiten, Probleme zu verursachen. Wenn Probleme auftreten, versuchen Sie, die benutzerdefinierte Präambel zu minimieren oder zu deaktivieren.

  • Die Konfiguration einer unicode-math-Umgebung kann etwas knifflig sein. Die TeXLive-Distribution stellt beispielsweise eine Reihe von Mathe-Schriftarten zur Verfügung, die normalerweise nicht systemweit installiert sind. XeLaTeX kann diese Schriftarten im Gegensatz zu LuaLaTeX nicht anhand ihres Namens finden. Daher müssen Sie möglicherweise \setmathfont{xits-math.otf} anstelle von \setmathfont{XITS Math} angeben oder alternativ die Schriftarten für Ihr Betriebssystem verfügbar machen. Weitere Details finden Sie in dieser tex.stackexchange.com-Frage.

  • Wenn die von Matplotlib verwendete Schriftartkonfiguration von der Schriftarteinstellung in Ihrem LaTeX-Dokument abweicht, kann die Ausrichtung von Textelementen in importierten Grafiken falsch sein. Überprüfen Sie den Header Ihrer .pgf-Datei, wenn Sie sich über die von Matplotlib für das Layout verwendeten Schriftarten unsicher sind.

  • Vektorgrafiken und damit auch .pgf-Dateien können aufgebläht werden, wenn viele Objekte im Diagramm vorhanden sind. Dies kann bei Bildverarbeitung oder sehr großen Streudiagrammen der Fall sein. Im Extremfall kann dies dazu führen, dass TeX den Speicher überschreitet: "TeX capacity exceeded, sorry". Sie können LaTeX konfigurieren, um den verfügbaren Arbeitsspeicher für die Generierung des .pdf-Bildes zu erhöhen, wie auf tex.stackexchange.com diskutiert. Eine andere Möglichkeit wäre, Teile des problematischen Diagramms zu "rasterisieren", entweder mit dem Schlüsselwort rasterized=True oder mit .set_rasterized(True), wie in diesem Beispiel gezeigt.

  • Verschiedene Mathe-Schriftarten werden nur kompiliert und gerendert, wenn die entsprechenden Schriftpakete geladen sind. Insbesondere bei der Verwendung von \mathbf{} für griechische Buchstaben enthält die Standard-Computermodern-Schriftart diese möglicherweise nicht, in welchem Fall der Buchstabe nicht gerendert wird. In solchen Szenarien sollte das Paket lmodern geladen werden.

  • Wenn Sie weiterhin Hilfe benötigen, siehe Hilfe erhalten.

Galerie generiert von Sphinx-Gallery