Preciso tirar uma foto e salvá-la após algum processo. A figura fica bem quando a exibo, mas depois de salvá-la, fiquei com um espaço em branco ao redor da imagem salva. Eu tentei a 'tight'
opção pelo savefig
método, também não funcionou. O código:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
Estou tentando desenhar um gráfico básico usando o NetworkX em uma figura e salvá-lo. Percebi que sem o gráfico ele funciona, mas quando adicionado um gráfico, recebo espaço em branco ao redor da imagem salva;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
python
matplotlib
Ahmet Tuğrul Bayrak
fonte
fonte
Respostas:
Não posso afirmar que sei exatamente por que ou como minha “solução” funciona, mas era isso que eu precisava fazer quando quis plotar o esboço de algumas seções de aerofólio - sem margens brancas - em um arquivo PDF. (Observe que eu usei o matplotlib dentro de um notebook IPython, com o sinalizador -pylab.)
Tentei desativar partes diferentes disso, mas isso sempre leva a uma margem branca em algum lugar. Você pode até modificar isso para impedir que linhas gordas próximas aos limites da figura sejam raspadas pela falta de margens.
fonte
set_major_locator
eram necessárias.pad_inches=0
que outras respostas não mencionam.set_major_locator
foi a chave para mim.pad_inches
me ajudou.Você pode remover o preenchimento de espaço em branco, definindo
bbox_inches="tight"
emsavefig
:Você terá que colocar o argumento
bbox_inches
como uma string, talvez seja por isso que não funcionou anteriormente para você.Possíveis duplicatas:
Gráficos Matplotlib: removendo eixos, legendas e espaços em branco
Como definir as margens para uma figura do matplotlib?
Reduzir as margens esquerda e direita no gráfico matplotlib
fonte
fig.savefig()
. (plt.savefig()
não funcionará nesse caso).bbox_inches
opção, há outro padrão que deixa algum espaço. Se você realmente quer se livrar de tudo, também precisa usá-lopad_inches=0.0
. Claro, tal preenchimento apertado freqüentemente corta, por exemplo, expoentes ...pad_inches=-0.1
Depois de tentar as respostas acima sem sucesso (e várias outras postagens de pilha), o que finalmente funcionou para mim foi apenas
É importante ressaltar que isso não inclui os argumentos bbox ou padding.
fonte
set_axis_off
. Isso não afeta a imagem salva, pois apóssubplots_adjust
o eixo ficar fora da extensão da figura e a henve não será obtida de qualquer maneira. Nos blocos de anotações Jupyter, no entanto, é necessário desativar explicitamente o eixo, pois o back-end embutido substitui essas configurações.Encontrei algo de Arvind Pereira ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) e parecia funcionar para mim:
fonte
transparent=True
fará parecer que não há problema, mas apenas ocultará o espaço em branco, as dimensões da imagem não serão aceitáveis.pad_inches
! Eu gostaria de ter conhecido essa opção anteriormente!pad_inches=.25
A função a seguir incorpora a resposta de johannes-s acima. Eu testei com
plt.figure
eplt.subplots()
com vários eixos, e funciona muito bem.fonte
Eu achei os seguintes códigos funcionar perfeitamente para o trabalho.
fonte
Eu segui essa sequência e funcionou como um encanto.
fonte
Para quem quer trabalhar em pixels em vez de polegadas, isso funcionará.
Além do habitual, você também precisará
Então você pode usar o seguinte:
fonte
fig.dpi
em vezUma abordagem muito mais simples que encontrei é usar
plt.imsave
:fonte
plt.savefig()
.Você pode tentar isso. Resolveu o meu problema.
fonte
Se você deseja exibir o que deve ser salvo, recomendo usar a
plt.tight_layout
transformação, que é realmente mais preferível, pois não faz cortes desnecessários ao usarplt.savefig
fonte
Isso funciona para mim, salvando uma matriz numpy plotada com imshow para arquivar
fonte