Por que meu xlabel é cortado no meu gráfico matplotlib?

303

Estou plotando um conjunto de dados usando matplotlibonde tenho um xlabel que é bastante "alto" (é uma fórmula renderizada em TeX que contém uma fração e, portanto, tem a altura equivalente a algumas linhas de texto).

De qualquer forma, a parte inferior da fórmula é sempre cortada quando desenho as figuras. Alterar o tamanho da figura não parece ajudar nisso, e eu não consegui descobrir como mudar o eixo x "para cima" para abrir espaço para o xlabel. Algo assim seria uma solução temporária razoável, mas o que seria bom seria ter uma maneira de fazer o matplotlib reconhecer automaticamente que o rótulo foi cortado e redimensionado de acordo.

Aqui está um exemplo do que quero dizer:

import matplotlib.pyplot as plt

plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
plt.show()

enquanto você pode ver todo o rótulo, o rótulo é cortado na parte inferior.

Caso este seja um problema específico da máquina, estou executando isso no OSX 10.6.8 com matplotlib 1.0.0

Andrew
fonte
4
Você pode postar em um site de hospedagem de imagens e vinculá-lo aqui.
agf 21/07
1
Ajuda se você pode postar um código de exemplo minimalista que dispara esse problema. Dessa forma, as pessoas podem entender e reproduzir seu problema mais rapidamente e terão mais chances de ajudá-lo.
Denilson Sá Maia
Seu código funciona muito bem (exibe a fórmula totalmente visível) na minha máquina (ubuntu 11.04 64bit). Talvez seja um problema específico da máquina [como uma fonte com informações dimensionais incorretas sendo usadas na imagem?]. Talvez você possa especificar o sistema que está usando na sua pergunta.
mac
9
você também pode querer experimentar plt.savefig("test.png",bbox_inches='tight'): stackoverflow.com/questions/21288062/...
Yibo Yang

Respostas:

475

Usar:

import matplotlib.pyplot as plt

plt.gcf().subplots_adjust(bottom=0.15)

para abrir espaço para o rótulo.

Editar:

Desde que eu dei a resposta, matplotlibadicionou a tight_layout()função. Então, eu sugiro usá-lo:

plt.tight_layout()

deve abrir espaço para o xlabel.

tillsten
fonte
141
Acho muito estranho que alguém precise fazer uma ligação extra para abrir espaço para uma parte essencial de uma trama. Qual é o raciocínio por trás disso?
um diferente ben
3
Apenas por curiosidade, por que você tem um gcf().subplots_adjustpouco do que plt.subplots_adjust? Existe alguma diferença?
juniper-
49
O que são gcfe gca? Você deixou de explicar!
Coronel Panic
12
Eu estava enfrentando o mesmo problema e, embora tight_layout()tenha corrigido o ponto de corte dos xlabels, infelizmente o meu rótulo foi cortado (o que não havia sido cortado antes). No entanto, o primeiro remédio ( subplots_adjust(bottom=0.25)) funcionou bem. Obrigado.
Scott-H
17
@ColonelPanic gcf()e gca()são "obter figura atual" e "obter eixos atuais", respectivamente.
precisa saber é
150

Uma opção fácil é configurar o matplotlib para ajustar automaticamente o tamanho da plotagem. Funciona perfeitamente para mim e não sei por que não está ativado por padrão.

Método 1

Defina isso no seu arquivo matplotlibrc

figure.autolayout : True

Consulte aqui para obter mais informações sobre como personalizar o arquivo matplotlibrc: http://matplotlib.org/users/customizing.html

Método 2

Atualize os rcParams durante o tempo de execução como este

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

A vantagem de usar essa abordagem é que seu código produzirá os mesmos gráficos em máquinas configuradas de maneira diferente.

Amit Moscovich
fonte
Eu tive alguns problemas com barras de cores muito grandes ao usar esta opção. Uma possível solução é discutida aqui: matplotlib.org/users/tight_layout_guide.html
Piquer
2
tight_layout faz uma bagunça quando defino tamanhos de letra personalizados (grandes!). Isso faz um trabalho muito melhor.
BenB
Atualizar o rcParams foi realmente a única coisa que funcionou para mim ao usar o back-end pgf com o LaTeX. (apesar de tornar o enredo retangular, o que não me importo)
h4nek
Só isso funcionou para mim; nada de tight_layout ou box_inches funcionou
zed111 16/06
106

Caso você queira armazená-lo em um arquivo, resolva-o usando o bbox_inches="tight"argumento:

plt.savefig('myfile.png', bbox_inches = "tight")
Guido
fonte
2
@Guido salvou o dia
pcko1 6/04
7

Colocando plot.tight_layout()depois de todas as alterações no gráfico, pouco antes show()ou savefig()resolverá o problema.

Armin Okić
fonte
1
Isso não abre espaço para a parte inferior do enredo, mas sim redimensiona todo o enredo, o que pode, em alguns casos (como o meu), fazer com que o enredo pareça realmente estranho.
89f3a1c 24/09/19
6

plt.autoscale() trabalhou para mim.

dgoodman1
fonte
5

Você também pode definir o preenchimento personalizado como padrão no $HOME/.matplotlib/matplotlib_rcseguinte: No exemplo abaixo, modifiquei o preenchimento inferior e esquerdo da caixa:

# The figure subplot parameters.  All dimensions are a fraction of the
# figure width or height
figure.subplot.left  : 0.1 #left side of the subplots of the figure
#figure.subplot.right : 0.9 
figure.subplot.bottom : 0.15
...
Мати Тернер
fonte