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


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.


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.


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

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.


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


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
...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.