Rendering del testo con XeLaTeX/LuaLaTeX tramite il pgfbackend #

Utilizzando il pgfbackend, Matplotlib può esportare figure come comandi di disegno pgf che possono essere elaborati con pdflatex, xelatex o lualatex. XeLaTeX e LuaLaTeX hanno il pieno supporto Unicode e possono utilizzare qualsiasi font installato nel sistema operativo, sfruttando le funzionalità tipografiche avanzate di OpenType, AAT e Graphite. Le immagini Pgf create da plt.savefig('figure.pgf') possono essere incorporate come comandi raw nei documenti LaTeX. Le figure possono anche essere compilate direttamente e salvate in PDF plt.savefig('figure.pdf')cambiando il back-end

matplotlib.use('pgf')

oppure richiedendo esplicitamente l'utilizzo del pgfbackend

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

o registrandolo per la gestione dell'output pdf

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

L'ultimo metodo consente di continuare a utilizzare normali backend interattivi e di salvare file PDF compilati xelatex, lualatex o pdflatex dall'interfaccia utente grafica.

Il supporto pgf di Matplotlib richiede una recente installazione di LaTeX che includa i pacchetti TikZ/PGF (come TeXLive ), preferibilmente con XeLaTeX o LuaLaTeX installato. Se sul tuo sistema è presente pdftocairo o ghostscript, le figure possono facoltativamente essere salvate anche in immagini PNG. Gli eseguibili per tutte le applicazioni devono trovarsi sul tuoPATH.

rcParamsche controllano il comportamento del backend pgf:

Parametro

Documentazione

pgf.preambolo

Righe da includere nel preambolo LaTeX

pgf.rcfonts

Imposta i font da rc params usando il pacchetto fontspec

pgf.texsystem

O "xelatex" (predefinito), "lualatex" o "pdflatex"

Nota

TeX definisce un insieme di caratteri speciali, come:

# $ % & ~ _ ^ \ { }

In genere, questi caratteri devono essere sfuggiti correttamente. Per comodità, alcuni caratteri (_, ^, %) vengono automaticamente sfuggiti al di fuori degli ambienti matematici. Altri caratteri non sono sfuggiti in quanto sono comunemente necessari nelle effettive espressioni TeX. Tuttavia, è possibile configurare TeX in modo che li tratti come caratteri "normali" (noti come "catcode 12" in TeX) tramite un preambolo personalizzato, ad esempio:

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

File PDF multipagina #

Il backend pgf supporta anche file pdf multipagina utilizzando 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)

Specifica dei caratteri #

I caratteri utilizzati per ottenere la dimensione degli elementi di testo o quando si compilano le figure in PDF sono generalmente definiti nel file rcParams. Puoi anche usare i caratteri Computer Modern predefiniti di LaTeX cancellando gli elenchi per rcParams["font.serif"](predefinito: ), (predefinito: ) o (predefinito: ). Si prega di notare che la copertura dei glifi di questi font è molto limitata. Se vuoi mantenere il carattere Computer Modern ma richiedi il supporto Unicode esteso, prendi in considerazione l'installazione dei caratteri Computer Modern Unicode CMU Serif , CMU Sans Serif , ecc.['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']

Quando si salva in .pgf, la configurazione dei caratteri Matplotlib utilizzata per il layout della figura è inclusa nell'intestazione del file di testo.

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

Preambolo personalizzato #

La personalizzazione completa è possibile aggiungendo i propri comandi al preambolo. Usa rcParams["pgf.preamble"](predefinito: '') se vuoi configurare i caratteri matematici, usando unicode-mathper esempio, o per caricare pacchetti aggiuntivi. Inoltre, se vuoi eseguire tu stesso la configurazione dei font invece di usare i font specificati nei parametri rc, assicurati di disabilitare rcParams["pgf.rcfonts"](default: 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)

Scegliere il sistema TeX #

Il sistema TeX utilizzato da Matplotlib è scelto da rcParams["pgf.texsystem"](predefinito: 'xelatex'). I valori possibili sono 'xelatex'(predefinito) 'lualatex'e 'pdflatex'. Si noti che quando si seleziona pdflatex, i caratteri e la gestione Unicode devono essere configurati nel preambolo.

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

Risoluzione dei problemi #

  • Tieni presente che i pacchetti TeX trovati in alcune distribuzioni Linux e installazioni MiKTeX sono notevolmente obsoleti. Assicurati di aggiornare il catalogo dei pacchetti e aggiornare o installare una distribuzione TeX recente.

  • Su Windows, ilPATHpotrebbe essere necessario modificare la variabile d'ambiente per includere le directory contenenti gli eseguibili latex, dvipng e ghostscript. Vedere Variabili d'ambiente e Impostazione delle variabili d'ambiente in Windows per i dettagli.

  • A volte il rendering dei caratteri nelle figure salvate in immagini png è pessimo. Questo accade quando lo strumento pdftocairo non è disponibile e ghostscript viene utilizzato per la conversione da pdf a png.

  • Assicurati che ciò che stai cercando di fare sia possibile in un documento LaTeX, che la tua sintassi LaTeX sia valida e che tu stia usando stringhe non elaborate se necessario per evitare sequenze di escape indesiderate.

  • rcParams["pgf.preamble"](predefinito: '') offre molta flessibilità e molti modi per causare problemi. In caso di problemi, provare a ridurre al minimo o disabilitare il preambolo personalizzato.

  • La configurazione di un unicode-mathambiente può essere un po' complicata. La distribuzione TeXLive, ad esempio, fornisce una serie di caratteri matematici che di solito non sono installati a livello di sistema. XeTeX, a differenza di LuaLatex, non riesce a trovare questi caratteri in base al loro nome, motivo per cui potresti dover specificare \setmathfont{xits-math.otf}invece o in alternativa rendere i caratteri disponibili per il tuo sistema operativo. Vedi questa domanda su tex.stackexchange.com per maggiori dettagli.\setmathfont{XITS Math}

  • Se la configurazione del carattere utilizzata da Matplotlib differisce dall'impostazione del carattere nel documento LaTeX, l'allineamento degli elementi di testo nelle figure importate potrebbe essere disattivato. Controlla l'intestazione del .pgffile se non sei sicuro dei caratteri utilizzati da Matplotlib per il layout.

  • Le immagini vettoriali e quindi .pgfi file possono gonfiarsi se ci sono molti oggetti nel grafico. Questo può essere il caso dell'elaborazione delle immagini o di grafici a dispersione molto grandi. In un caso estremo ciò può causare l'esaurimento della memoria di TeX: "Capacità di TeX superata, scusa" Puoi configurare latex per aumentare la quantità di memoria disponibile per generare l' .pdfimmagine come discusso su tex.stackexchange.com . Un altro modo sarebbe quello di "rasterizzare" parti del grafico che causano problemi utilizzando la rasterized=Trueparola chiave o .set_rasterized(True)come in questo esempio .

  • Vari font matematici vengono compilati e resi solo se vengono caricati i pacchetti di font corrispondenti. In particolare, quando si utilizza \mathbf{}su lettere greche, il carattere moderno predefinito del computer potrebbe non contenerle, nel qual caso la lettera non viene resa. In tali scenari, il lmodernpacchetto dovrebbe essere caricato.

  • Se hai ancora bisogno di aiuto, consulta Ottenere aiuto

Galleria generata da Sphinx-Gallery