Observação
Clique aqui para baixar o código de exemplo completo
Renderização de texto com XeLaTeX/LuaLaTeX via pgf
backend #
Usando o back- pgf
end, 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- pgf
end
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
.
rcParams
que 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-math
por 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, o
PATH
A 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-math
ambiente 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
.pgf
arquivo se não tiver certeza sobre as fontes que o Matplotlib usou para o layout.As imagens vetoriais e, portanto,
.pgf
os 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.pdf
imagem conforme discutido em tex.stackexchange.com . Outra maneira seria "rasterizar" partes do gráfico causando problemas usando a palavra-rasterized=True
chave 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, olmodern
pacote deve ser carregado.Se ainda precisar de ajuda, consulte Como obter ajuda