Se eu adicionar uma legenda à minha figura do matplotlib, ela será sobreposta pelos títulos da subtrama. Alguém sabe como cuidar disso facilmente? Eu tentei a tight_layout()
função, mas isso só piora as coisas.
Exemplo:
import numpy as np
import matplotlib.pyplot as plt
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure()
fig.suptitle('Long Suptitle', fontsize=24)
plt.subplot(121)
plt.plot(f)
plt.title('Very Long Title 1', fontsize=20)
plt.subplot(122)
plt.plot(g)
plt.title('Very Long Title 2', fontsize=20)
plt.tight_layout()
plt.show()
python
matplotlib
katrasnikj
fonte
fonte
tight_layout
docs:[left, bottom, right, top] in normalized (0, 1) figure coordinates
tight_layout(rect=[0, 0.03, 1, 0.9])
vez de0.95
como na resposta.Você pode ajustar manualmente o espaçamento usando
plt.subplots_adjust(top=0.85)
:fonte
subplots_adjust
subplots_adjust
deve ser chamado após todas as chamadas paratight_layout
, ou não haverá efeito de chamadasubplots_adjust
.Uma coisa que você pode alterar no seu código com muita facilidade é a que
fontsize
você está usando para os títulos. No entanto, vou assumir que você não quer apenas fazer isso!Algumas alternativas ao uso
fig.subplots_adjust(top=0.85)
:Geralmente,
tight_layout()
faz um bom trabalho no posicionamento de tudo em bons locais para que não se sobreponham. O motivotight_layout()
não ajuda nesse caso é porquetight_layout()
não leva em consideração fig.suptitle (). Há um problema em aberto sobre isso no GitHub: https://github.com/matplotlib/matplotlib/issues/829 [encerrado em 2014 devido à necessidade de um gerente de geometria completo - alterado para https://github.com/matplotlib/matplotlib / edições / 1109 ].Se você ler o tópico, há uma solução para o seu problema
GridSpec
. A chave é deixar algum espaço na parte superior da figura ao chamartight_layout
, usando orect
kwarg. Para o seu problema, o código se torna:Usando GridSpec
O resultado:
Talvez
GridSpec
seja um pouco exagerado para você, ou o seu problema real envolverá muito mais subtramas em uma tela muito maior ou outras complicações. Um hack simples é usarannotate()
e bloquear as coordenadas'figure fraction'
para imitar asuptitle
. Você pode precisar fazer alguns ajustes mais precisos depois de analisar a saída. Observe que esta segunda solução não usatight_layout()
.Solução mais simples (embora possa precisar ser ajustada)
O resultado:
[Usando
Python
2.7.3 (64 bits) ematplotlib
1.2.0]fonte
GridSpec
) como posso criar subparcelas que compartilham eixos? Eu costumo usarplt.subplots(N,1, sharex=<>, sharey=<>)
ao criar subtramas, mas o código que você postou usosadd_subplot
vezfig.tight_layout(rect=[0, 0.03, 1, 0.95])
também funciona.Uma solução alternativa e simples de usar é ajustar as coordenadas do texto do subtítulo na figura usando o argumento y na chamada do subtítulo (consulte a documentação ):
fonte
Layout apertado não funciona com legendas, mas
constrained_layout
funciona. Veja esta pergunta Melhorar o tamanho / espaçamento das subparcelas com muitas subtramas no matplotlibEu achei que adicionar as subparcelas de uma só vez parecia melhor, ou seja,
Mas também pode ser adicionado no ponto em que a figura é criada:
Nota: Para aproximar minhas subparcelas, eu também estava usando
e constrained_layout não funciona com isso :(
fonte
Eu lutei com os métodos de corte do matplotlib, então agora criei uma função para fazer isso através de uma
bash
chamada ao comando mogrify deImageMagick
s , que funciona bem e tira todo o espaço em branco da borda da figura. Isso requer que você esteja usando o UNIX / Linux, o shell e a instalação.bash
ImageMagick
Basta ligar para isso após a
savefig()
ligação.fonte
Conforme mencionado por outros, por padrão, o layout restrito não leva em consideração o subtítulo. No entanto, descobri que é possível usar o
bbox_extra_artists
argumento para passar no subtítulo como uma caixa delimitadora que deve ser levada em consideração:Isso força o cálculo apertado do layout a levar
suptitle
em consideração e parece com o que você esperaria.fonte
A única coisa que funcionou para mim foi modificar a chamada para legenda:
fonte
Eu tive um problema semelhante que surgiu ao usar
tight_layout
para uma grade muito grande de plotagens (mais de 200 sub-plotagens) e renderizar em um notebook jupiter. Fiz uma solução rápida que sempre coloca vocêsuptitle
a uma certa distância acima da subparcela superior:Para subparcelas de tamanho variável, você ainda pode usar esse método para obter o topo da subparcela superior e, em seguida, definir manualmente uma quantia adicional a ser adicionada ao subtítulo.
fonte