Renderização de texto com XeLaTeX/LuaLaTeX via pgfbackend #

Usando o back- pgfend, o Matplotlib pode exportar figuras como comandos de desenho pgf que podem ser processados ​​com pdflatex, xelatex ou lualatex. XeLaTeX e LuaLaTeX têm suporte total a Unicode e podem usar qualquer fonte instalada no sistema operacional, fazendo uso de recursos tipográficos avançados de OpenType, AAT e Graphite. Imagens Pgf criadas por plt.savefig('figure.pgf') podem ser incorporadas como comandos brutos em documentos LaTeX. As figuras também podem ser compiladas diretamente e salvas em PDF plt.savefig('figure.pdf'), alternando o back-end

matplotlib.use('pgf')

ou solicitando explicitamente o uso do back- pgfend

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

ou registrando-o para lidar com a saída de pdf

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

O último método permite que você continue usando back-ends interativos regulares e salve arquivos PDF compilados xelatex, lualatex ou pdflatex a partir da interface gráfica do usuário.

O suporte pgf do Matplotlib requer uma instalação LaTeX recente que inclua os pacotes TikZ/PGF (como TeXLive ), preferencialmente com XeLaTeX ou LuaLaTeX instalado. Se o pdftocairo ou o ghostscript estiver presente em seu sistema, as figuras podem opcionalmente ser salvas em imagens PNG também. Os executáveis ​​de todos os aplicativos devem estar localizados em seuPATH.

rcParamsque controlam o comportamento do back-end pgf:

Parâmetro

Documentação

pgf.preâmbulo

Linhas a serem incluídas no preâmbulo do LaTeX

pgf.rcfonts

Configurar fontes de parâmetros rc usando o pacote fontspec

pgf.texsystem

Ou "xelatex" (padrão), "lualatex" ou "pdflatex"

Observação

O TeX define um conjunto de caracteres especiais, como:

# $ % & ~ _ ^ \ { }

Geralmente, esses caracteres devem ser escapados corretamente. Por conveniência, alguns caracteres (_, ^, %) são automaticamente escapados fora dos ambientes matemáticos. Outros caracteres não são escapados, pois são comumente necessários em expressões reais do TeX. No entanto, pode-se configurar o TeX para tratá-los como caracteres "normais" (conhecidos como "catcode 12" para o TeX) por meio de um preâmbulo personalizado, como:

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

Arquivos PDF de várias páginas #

O back-end pgf também oferece suporte a arquivos PDF de várias 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)

Especificação da fonte #

As fontes usadas para obter o tamanho dos elementos de texto ou ao compilar figuras para PDF geralmente são definidas no arquivo rcParams. Você também pode usar as fontes Computer Modern padrão do LaTeX limpando as listas para rcParams["font.serif"](padrão: ), (padrão: ) ou (padrão: ). Observe que a cobertura de glifos dessas fontes é muito limitada. Se você quiser manter a face da fonte Computer Modern, mas precisar de suporte Unicode estendido, considere instalar as fontes 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']

Ao salvar em .pgf, a configuração da fonte Matplotlib usada para o layout da figura é incluída no cabeçalho do arquivo 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 #

A personalização completa é possível adicionando seus próprios comandos ao preâmbulo. Use rcParams["pgf.preamble"](padrão: '') se quiser configurar as fontes matemáticas, usando, unicode-mathpor exemplo, ou para carregar pacotes adicionais. Além disso, se você mesmo quiser fazer a configuração da fonte em vez de usar as fontes especificadas nos parâmetros rc, certifique-se de desabilitar rcParams["pgf.rcfonts"](padrão: 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)

Escolhendo o sistema TeX #

O sistema TeX a ser usado pelo Matplotlib é escolhido por rcParams["pgf.texsystem"](padrão: 'xelatex'). Os valores possíveis são 'xelatex'(padrão) 'lualatex'e 'pdflatex'. Observe que ao selecionar pdflatex, as fontes e a manipulação de Unicode devem ser configuradas no 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)

Solução de problemas #

  • Observe que os pacotes TeX encontrados em algumas distribuições Linux e instalações MiKTeX estão drasticamente desatualizados. Certifique-se de atualizar seu catálogo de pacotes e atualizar ou instalar uma distribuição TeX recente.

  • No Windows, oPATHA variável de ambiente pode precisar ser modificada para incluir os diretórios que contêm os executáveis ​​latex, dvipng e ghostscript. Consulte Variáveis ​​de ambiente e Definindo variáveis ​​de ambiente no Windows para obter detalhes.

  • Às vezes, a renderização da fonte nas figuras salvas em imagens png é muito ruim. Isso acontece quando a ferramenta pdftocairo não está disponível e o ghostscript é usado para a conversão de pdf para png.

  • Certifique-se de que o que você está tentando fazer é possível em um documento LaTeX, que sua sintaxe LaTeX é válida e que você está usando strings brutas, se necessário, para evitar sequências de escape não intencionais.

  • rcParams["pgf.preamble"](padrão: '') fornece muita flexibilidade e muitas maneiras de causar problemas. Ao enfrentar problemas, tente minimizar ou desativar o preâmbulo personalizado.

  • Configurar um unicode-mathambiente pode ser um pouco complicado. A distribuição TeXLive, por exemplo, fornece um conjunto de fontes matemáticas que geralmente não são instaladas em todo o sistema. O XeTeX, ao contrário do LuaLatex, não pode encontrar essas fontes pelo nome, e é por isso que você pode especificar \setmathfont{xits-math.otf}em vez de, ou alternativamente, disponibilizar as fontes para o seu sistema operacional. Consulte esta pergunta tex.stackexchange.com para obter mais detalhes.\setmathfont{XITS Math}

  • Se a configuração da fonte usada pelo Matplotlib for diferente da configuração da fonte no seu documento LaTeX, o alinhamento dos elementos de texto nas figuras importadas pode estar desativado. Verifique o cabeçalho do seu .pgfarquivo se não tiver certeza sobre as fontes que o Matplotlib usou para o layout.

  • As imagens vetoriais e, portanto, .pgfos arquivos podem ficar inchados se houver muitos objetos no gráfico. Este pode ser o caso de processamento de imagem ou gráficos de dispersão muito grandes. Em um caso extremo, isso pode fazer com que o TeX fique sem memória: "Capacidade do TeX excedida, desculpe" Você pode configurar o latex para aumentar a quantidade de memória disponível para gerar a .pdfimagem conforme discutido em tex.stackexchange.com . Outra maneira seria "rasterizar" partes do gráfico causando problemas usando a palavra- rasterized=Truechave ou .set_rasterized(True)conforme este exemplo .

  • Várias fontes matemáticas são compiladas e renderizadas apenas se os pacotes de fontes correspondentes forem carregados. Especificamente, ao usar \mathbf{}letras gregas, a fonte moderna do computador padrão pode não contê-las, caso em que a letra não é renderizada. Em tais cenários, o lmodernpacote deve ser carregado.

  • Se ainda precisar de ajuda, consulte Como obter ajuda

Galeria gerada por Sphinx-Gallery