Estou lutando para lidar com as margens da minha plotagem no matplotlib. Eu usei o código abaixo para produzir meu gráfico:
plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")
No entanto, recebo uma figura de saída com muito espaço em branco em ambos os lados do gráfico. Pesquisei no google e li a documentação do matplotlib, mas não consigo encontrar como reduzir isso.
python
matplotlib
robintw
fonte
fonte
extent
daimshow
figura, ou a quantidade de espaço em branco fronteira no png resultante, em torno da figura, gerada porsavefig
?savefig
- então é isso que eu gostaria de classificar.Respostas:
Uma maneira de fazer isso automaticamente é
bbox_inches='tight'
usando o kwargplt.savefig
.Por exemplo
Outra maneira é usar
fig.tight_layout()
fonte
fig.savefig()
. (plt.savefig()
não funcionará nesse caso).fig.tight_layout()
. Essa função não existia quando esta resposta foi originalmente escrita, caso contrário, eu a mencionaria com mais destaque.fig = plt.gcf()
Você pode ajustar o espaçamento em torno das figuras matplotlib usando a função subplots_adjust ():
Isso funcionará para a figura na tela e salva em um arquivo, e é a função correta para chamar, mesmo que você não tenha várias plotagens na figura.
Os números são frações das dimensões da figura e precisarão ser ajustados para permitir os rótulos das figuras.
fonte
GridSpec
objetos chamando oupdate
método (consulte stackoverflow.com/a/20058199/1030876 ).Tudo o que você precisa é
antes da sua saída.
Além de reduzir as margens, isso também agrupa fortemente o espaço entre quaisquer subparcelas:
fonte
bbox_inches='tight'
que apenas corta o espaço em branco nas bordas, mas deixa o gráfico sozinho. Eu criei a figura complt.figure(figsize=(10,3))
.Basta usar
ax = fig.add_axes([left, bottom, width, height])
se você quiser controle exato do layout da figura. por exemplo.fonte
Caso alguém se pergunte como se livrar do restante da margem branca após aplicar
plt.tight_layout()
oufig.tight_layout()
: Com o parâmetropad
(que é o1.08
padrão), você poderá torná-lo ainda mais apertado: "Preenchimento entre a borda da figura e as bordas da subtramas, como uma fração do tamanho da fonte ". Então por exemploreduzirá a uma margem muito pequena. Colocar
0
não funciona para mim, pois também faz com que a caixa da subtrama seja um pouco cortada.fonte
fonte
savefig
função é elegante; no entanto, o valor negativo parapad_inches
não é necessariamente necessário em todos os casos.O problema com o subplots_adjust do matplotlibs é que os valores inseridos são relativos ao tamanho de figura xey da figura. Este exemplo é para o correto dimensionamento de figuras para impressão de um pdf:
Para isso, recalculo o espaçamento relativo para valores absolutos como este:
para uma figura de 'figure.xsize' polegadas na dimensão x e 'figure.ysize' polegadas na dimensão y Portanto, a figura inteira tem uma margem esquerda de 5 mm, margem inferior de 4 mm, direita de 1 mm e parte superior de 3 mm nas etiquetas. A conversão de (x / 25,4) é feita porque eu precisava converter mm em polegadas.
Observe que o tamanho puro do gráfico de x será "figure.xsize - margem esquerda - margem direita" e o tamanho puro do gráfico de y será "figure.ysize - margem inferior - margem superior" em polegadas
Outros sniplets (não tenho certeza sobre esses, eu só queria fornecer os outros parâmetros)
e
fonte
xsize
eysize
de onde? Eu uso essas propriedades e receboAttributeError: 'Figure' object has no attribute 'xsize'
inspirado na resposta de Sammys acima:
Onde figsize é a tupla usada em
fig = pyplot.figure(figsize=...)
fonte
Para mim, as respostas acima não funcionaram com
matplotlib.__version__ = 1.4.3
no Win7. Portanto, se estivermos interessados apenas na imagem em si (ou seja, se não precisarmos de anotações, eixos, ticks, título, rótulo etc.), é melhor simplesmente salvar a matriz numpy como imagem em vez desavefig
.Além disso, usando as funções de desenho opencv (cv2.line, cv2.polylines), podemos fazer alguns desenhos diretamente na matriz numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html
fonte
Nas versões recentes do matplotlib, convém experimentar o Layout restrito .
fonte