Noter
Cliquez ici pour télécharger l'exemple de code complet
Rendu de texte avec XeLaTeX/LuaLaTeX via le pgf
backend #
En utilisant le pgf
backend, Matplotlib peut exporter des figures sous forme de commandes de dessin pgf qui peuvent être traitées avec pdflatex, xelatex ou lualatex. XeLaTeX et LuaLaTeX prennent entièrement en charge Unicode et peuvent utiliser n'importe quelle police installée dans le système d'exploitation, en utilisant les fonctionnalités typographiques avancées d'OpenType, AAT et Graphite. Les images Pgf créées par plt.savefig('figure.pgf')
peuvent être intégrées en tant que commandes brutes dans des documents LaTeX. Les figures peuvent également être directement compilées et enregistrées au format PDF plt.savefig('figure.pdf')
en changeant de backend
matplotlib.use('pgf')
ou en demandant explicitement l'utilisation du pgf
backend
plt.savefig('figure.pdf', backend='pgf')
ou en l'enregistrant pour gérer la sortie pdf
from matplotlib.backends.backend_pgf import FigureCanvasPgf
matplotlib.backend_bases.register_backend('pdf', FigureCanvasPgf)
La dernière méthode vous permet de continuer à utiliser des backends interactifs réguliers et d'enregistrer des fichiers PDF compilés xelatex, lualatex ou pdflatex à partir de l'interface utilisateur graphique.
Le support pgf de Matplotlib nécessite une installation LaTeX récente qui inclut les packages TikZ/PGF (tels que TeXLive ), de préférence avec XeLaTeX ou LuaLaTeX installé. Si pdftocairo ou ghostscript est présent sur votre système, les figures peuvent éventuellement être également enregistrées dans des images PNG. Les exécutables de toutes les applications doivent se trouver sur votrePATH
.
rcParams
qui contrôlent le comportement du backend pgf :
Paramètre
Documentation
pgf.préambule
Lignes à inclure dans le préambule LaTeX
pgf.rcfonts
Configurer les polices à partir des paramètres rc à l'aide du package fontspec
pgf.texsystem
Soit "xelatex" (par défaut), "lualatex" ou "pdflatex"
Noter
TeX définit un ensemble de caractères spéciaux, tels que :
# $ % & ~ _ ^ \ { }
Généralement, ces caractères doivent être échappés correctement. Pour plus de commodité, certains caractères (_, ^, %) sont automatiquement échappés en dehors des environnements mathématiques. Les autres caractères ne sont pas échappés car ils sont couramment nécessaires dans les expressions TeX réelles. Cependant, on peut configurer TeX pour les traiter comme des caractères "normaux" (appelés "catcode 12" pour TeX) via un préambule personnalisé, tel que :
plt.rcParams["pgf.preamble"] = (
r"\AtBeginDocument{\catcode`\&=12\catcode`\#=12}")
Fichiers PDF multi-pages #
Le backend pgf prend également en charge les fichiers pdf multipages en utilisant
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)
Spécification de la police #
Les polices utilisées pour obtenir la taille des éléments de texte ou lors de la compilation des figures au format PDF sont généralement définies dans le fichier rcParams
. Vous pouvez également utiliser les polices Computer Modern par défaut de LaTeX en effaçant les listes pour rcParams["font.serif"]
(par défaut : ),
(par défaut : ) ou (par défaut : ). Veuillez noter que la couverture des glyphes de ces polices est très limitée. Si vous souhaitez conserver la police Computer Modern mais que vous avez besoin d'une prise en charge étendue d'Unicode, envisagez d'installer les
polices Computer Modern Unicode CMU Serif , CMU Sans Serif , etc.['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"]
['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']
rcParams["font.monospace"]
['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace']
Lors de l'enregistrement dans .pgf
, la configuration de police Matplotlib utilisée pour la mise en page de la figure est incluse dans l'en-tête du fichier texte.
"""
=========
PGF fonts
=========
"""
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$")
fig.tight_layout(pad=.5)
Préambule personnalisé #
Une personnalisation complète est possible en ajoutant vos propres commandes au préambule. Utilisez rcParams["pgf.preamble"]
(par défaut : ''
) si vous souhaitez configurer les polices mathématiques, en utilisant unicode-math
par exemple, ou pour charger des packages supplémentaires. Aussi, si vous voulez faire la configuration des polices vous-même au lieu d'utiliser les polices spécifiées dans les paramètres rc, assurez-vous de désactiver rcParams["pgf.rcfonts"]
(par défaut : True
).
"""
============
PGF preamble
============
"""
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.org}")
ax.legend(["unicode math: $λ=∑_i^∞ μ_i^2$"])
fig.tight_layout(pad=.5)
Choisir le système TeX #
Le système TeX à utiliser par Matplotlib est choisi par rcParams["pgf.texsystem"]
(par défaut : 'xelatex'
). Les valeurs possibles sont 'xelatex'
(par défaut) 'lualatex'
et 'pdflatex'
. Veuillez noter que lors de la sélection de pdflatex, les polices et la gestion Unicode doivent être configurées dans le préambule.
"""
=============
PGF texsystem
=============
"""
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$")
fig.tight_layout(pad=.5)
Dépannage #
Veuillez noter que les packages TeX trouvés dans certaines distributions Linux et installations MiKTeX sont considérablement obsolètes. Assurez-vous de mettre à jour votre catalogue de packages et de mettre à niveau ou d'installer une distribution TeX récente.
Sous Windows, le
PATH
Il peut être nécessaire de modifier la variable d'environnement pour inclure les répertoires contenant les exécutables latex, dvipng et ghostscript. Voir Variables d'environnement et Définition des variables d'environnement dans Windows pour plus de détails.Parfois, le rendu des polices dans les figures enregistrées dans des images png est très mauvais. Cela se produit lorsque l'outil pdftocairo n'est pas disponible et que ghostscript est utilisé pour la conversion pdf en png.
Assurez-vous que ce que vous essayez de faire est possible dans un document LaTeX, que votre syntaxe LaTeX est valide et que vous utilisez des chaînes brutes si nécessaire pour éviter les séquences d'échappement involontaires.
rcParams["pgf.preamble"]
(par défaut :''
) offre une grande flexibilité et de nombreuses façons de causer des problèmes. Lorsque vous rencontrez des problèmes, essayez de minimiser ou de désactiver le préambule personnalisé.Configurer un
unicode-math
environnement peut être un peu délicat. La distribution TeXLive, par exemple, fournit un ensemble de polices mathématiques qui ne sont généralement pas installées à l'échelle du système. XeTeX, contrairement à LuaLatex, ne peut pas trouver ces polices par leur nom, c'est pourquoi vous devrez peut-être spécifier à la\setmathfont{xits-math.otf}
place ou rendre les polices disponibles pour votre système d'exploitation. Voir cette question tex.stackexchange.com pour plus de détails.\setmathfont{XITS Math}
Si la configuration de police utilisée par Matplotlib diffère du paramètre de police de votre document LaTeX, l'alignement des éléments de texte dans les figures importées peut être désactivé. Vérifiez l'en-tête de votre
.pgf
fichier si vous n'êtes pas sûr des polices utilisées par Matplotlib pour la mise en page.Les images vectorielles et donc
.pgf
les fichiers peuvent devenir gonflés s'il y a beaucoup d'objets dans le graphique. Cela peut être le cas pour le traitement d'image ou les très gros nuages de points. Dans un cas extrême, cela peut entraîner un manque de mémoire pour TeX : "Capacité TeX dépassée, désolé" Vous pouvez configurer latex pour augmenter la quantité de mémoire disponible pour générer l'.pdf
image, comme indiqué sur tex.stackexchange.com . Une autre façon serait de "rastériser" les parties du graphique causant des problèmes en utilisant soit le mot-rasterized=True
clé, soit.set_rasterized(True)
selon cet exemple .Diverses polices mathématiques sont compilées et rendues uniquement si les packages de polices correspondants sont chargés. Plus précisément, lors de l'utilisation
\mathbf{}
sur des lettres grecques, la police moderne de l'ordinateur par défaut peut ne pas les contenir, auquel cas la lettre n'est pas rendue. Dans de tels scénarios, lelmodern
package doit être chargé.Si vous avez encore besoin d'aide, veuillez consulter Obtenir de l'aide