Representación de texto con XeLaTeX/LuaLaTeX a través del pgfbackend #

Usando el pgfbackend, Matplotlib puede exportar figuras como comandos de dibujo pgf que se pueden procesar con pdflatex, xelatex o lualatex. XeLaTeX y LuaLaTeX tienen compatibilidad total con Unicode y pueden usar cualquier fuente que esté instalada en el sistema operativo, haciendo uso de funciones tipográficas avanzadas de OpenType, AAT y Graphite. Las imágenes pgf creadas por plt.savefig('figure.pgf') se pueden incrustar como comandos sin procesar en documentos LaTeX. Las figuras también se pueden compilar y guardar directamente en PDF plt.savefig('figure.pdf')cambiando el backend

matplotlib.use('pgf')

o solicitando explícitamente el uso del pgfbackend

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

o registrándolo para manejar la salida de pdf

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

El último método le permite seguir usando backends interactivos regulares y guardar archivos PDF compilados xelatex, lualatex o pdflatex desde la interfaz gráfica de usuario.

El soporte pgf de Matplotlib requiere una instalación reciente de LaTeX que incluya los paquetes TikZ/PGF (como TeXLive ), preferiblemente con XeLaTeX o LuaLaTeX instalado. Si pdftocairo o ghostscript están presentes en su sistema, las figuras también se pueden guardar opcionalmente en imágenes PNG. Los ejecutables de todas las aplicaciones deben estar ubicados en suPATH.

rcParamsque controlan el comportamiento del backend pgf:

Parámetro

Documentación

pgf.preámbulo

Líneas que se incluirán en el preámbulo de LaTeX

pgf.rcfonts

Configurar fuentes desde rc params usando el paquete fontspec

pgf.texsystem

Ya sea "xelatex" (predeterminado), "lualatex" o "pdflatex"

Nota

TeX define un conjunto de caracteres especiales, como:

# $ % & ~ _ ^ \ { }

Generalmente, estos caracteres se deben escapar correctamente. Por comodidad, algunos caracteres (_, ^, %) se escapan automáticamente fuera de los entornos matemáticos. Otros caracteres no se escapan, ya que normalmente se necesitan en las expresiones TeX reales. Sin embargo, se puede configurar TeX para tratarlos como caracteres "normales" (conocidos como "catcode 12" en TeX) a través de un preámbulo personalizado, como:

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

Archivos PDF de varias páginas #

El backend pgf también admite archivos pdf de varias páginas usando 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)

Especificación de fuente #

Las fuentes utilizadas para obtener el tamaño de los elementos de texto o al compilar figuras a PDF generalmente se definen en el archivo rcParams. También puede utilizar las fuentes Computer Modern predeterminadas de LaTeX borrando las listas de rcParams["font.serif"](predeterminado: ), (predeterminado: ) o (predeterminado: ). Tenga en cuenta que la cobertura de glifos de estas fuentes es muy limitada. Si desea mantener la fuente Computer Modern pero necesita soporte Unicode extendido, considere instalar las fuentes 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']

Al guardar en .pgf, la configuración de fuentes que Matplotlib usó para el diseño de la figura se incluye en el encabezado del archivo de texto.

"""
=========
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)

Preámbulo personalizado #

La personalización completa es posible agregando sus propios comandos al preámbulo. Use rcParams["pgf.preamble"](predeterminado: '') si desea configurar las fuentes matemáticas, usando unicode-mathpor ejemplo, o para cargar paquetes adicionales. Además, si desea realizar la configuración de fuentes usted mismo en lugar de utilizar las fuentes especificadas en los parámetros rc, asegúrese de desactivar rcParams["pgf.rcfonts"](predeterminado: 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)

Elegir el sistema TeX #

El sistema TeX que utilizará Matplotlib se elige mediante rcParams["pgf.texsystem"](predeterminado: 'xelatex'). Los valores posibles son 'xelatex'(predeterminado) 'lualatex'y 'pdflatex'. Tenga en cuenta que al seleccionar pdflatex, las fuentes y el manejo de Unicode deben configurarse en el preámbulo.

"""
=============
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)

Solución de problemas #

  • Tenga en cuenta que los paquetes de TeX que se encuentran en algunas distribuciones de Linux e instalaciones de MiKTeX están muy desactualizados. Asegúrese de actualizar su catálogo de paquetes y actualice o instale una distribución TeX reciente.

  • En Windows, elPATHEs posible que sea necesario modificar la variable de entorno para incluir los directorios que contienen los ejecutables latex, dvipng y ghostscript. Consulte Variables de entorno y Configuración de variables de entorno en Windows para obtener más detalles.

  • A veces, la representación de fuentes en figuras que se guardan en imágenes png es muy mala. Esto sucede cuando la herramienta pdftocairo no está disponible y se usa ghostscript para la conversión de pdf a png.

  • Asegúrese de que lo que está tratando de hacer sea posible en un documento LaTeX, que su sintaxis LaTeX sea válida y que esté utilizando cadenas sin procesar si es necesario para evitar secuencias de escape no deseadas.

  • rcParams["pgf.preamble"](predeterminado: '') proporciona mucha flexibilidad y muchas maneras de causar problemas. Cuando experimente problemas, intente minimizar o deshabilitar el preámbulo personalizado.

  • Configurar un unicode-mathentorno puede ser un poco complicado. La distribución de TeXLive, por ejemplo, proporciona un conjunto de fuentes matemáticas que normalmente no se instalan en todo el sistema. XeTeX, a diferencia de LuaLatex, no puede encontrar estas fuentes por su nombre, por lo que es posible que deba especificar \setmathfont{xits-math.otf}en lugar de , o alternativamente, hacer que las fuentes estén disponibles para su sistema operativo. Consulte esta pregunta de tex.stackexchange.com para obtener más detalles.\setmathfont{XITS Math}

  • Si la configuración de fuente utilizada por Matplotlib difiere de la configuración de fuente en su documento LaTeX, la alineación de los elementos de texto en las figuras importadas puede estar desactivada. Verifique el encabezado de su .pgfarchivo si no está seguro acerca de las fuentes que Matplotlib usó para el diseño.

  • Las imágenes vectoriales y, por lo tanto .pgf, los archivos pueden hincharse si hay muchos objetos en el gráfico. Este puede ser el caso del procesamiento de imágenes o gráficos de dispersión muy grandes. En un caso extremo, esto puede causar que TeX se quede sin memoria: "Se excedió la capacidad de TeX, lo siento". Puede configurar Latex para aumentar la cantidad de memoria disponible para generar la .pdfimagen, como se explica en tex.stackexchange.com . Otra forma sería "rasterizar" partes del gráfico que causan problemas usando la rasterized=Truepalabra clave o .set_rasterized(True)según este ejemplo .

  • Varias fuentes matemáticas se compilan y representan solo si se cargan los paquetes de fuentes correspondientes. Específicamente, cuando se usa \mathbf{}en letras griegas, es posible que la fuente moderna predeterminada de la computadora no las contenga, en cuyo caso la letra no se representa. En tales escenarios, el lmodernpaquete debe cargarse.

  • Si aún necesita ayuda, consulte Obtención de ayuda

Galería generada por Sphinx-Gallery