Estou escrevendo um script rápido e sujo para gerar gráficos rapidamente. Estou usando o código abaixo (da documentação do Matplotlib ) como ponto de partida:
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
Não quero exibir o gráfico em uma GUI; em vez disso, quero salvar o gráfico em um arquivo (por exemplo, foo.png), para que, por exemplo, ele possa ser usado em scripts em lote. Como faço isso?
python
matplotlib
plot
Homunculus Reticulli
fonte
fonte
savefig
método. Então você pode ligarfig = plt.figure()
entãofig.savefig(...)
.plt.close(fig)
que é especialmente importante em grandes loops. Caso contrário, os números permanecem abertas e em espera na memória e todas as figuras abertas serão apresentados a execuçãoplt.show()
Respostas:
Enquanto a pergunta foi respondida, gostaria de adicionar algumas dicas úteis ao usar matplotlib.pyplot.savefig . O formato do arquivo pode ser especificado pela extensão:
Fornecerá uma saída rasterizada ou vetorizada, respectivamente, ambas que podem ser úteis. Além disso, você verá que
pylab
deixa um espaço em branco generoso, geralmente indesejável, ao redor da imagem. Remova-o com:fonte
plt.savefig
alterar o ppp, consulte o link na resposta. As dimensões podem ser controlados durante a criação da figura, verfigsize
em matplotlib.org/api/figure_api.html#matplotlib.figure.Figureplt.ioff()
que deve desativar a interatividade nosmatplotlib.pyplot
comandos.foo.png
é o caminho. Você pode, por exemplo, colocá-lo em um diretório como estesavefig("mydir/foo.png")
.Como outros já disseram,
plt.savefig()
oufig1.savefig()
é realmente o caminho para salvar uma imagem.No entanto, descobri que, em certos casos, a figura é sempre mostrada . (por exemplo, com o Spyder tendo
plt.ion()
: modo interativo = Ativado.) Eu contorno isso forçando o fechamento da janela de figura no meu loop gigante complt.close(figure_object)
(consulte a documentação ), para não ter um milhão de figuras abertas durante o loop:Você deve poder reabrir a figura posteriormente, se necessário
fig.show()
(não me testou).fonte
plt.ioff() # turn of interactive plotting mode
, mas isso pode desativar o comportamento que você deseja usar se o seu código sair com um erro.plt.close(fig)
A solução é:
fonte
Acabei de encontrar este link na documentação do MatPlotLib que aborda exatamente esse problema: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Eles dizem que a maneira mais fácil de impedir que a figura apareça é usar um back-end não interativo (por exemplo, Agg), via
matplotib.use(<backend>)
, por exemplo:Eu ainda prefiro usar pessoalmente
plt.close( fig )
, desde então, você tem a opção de ocultar determinadas figuras (durante um loop), mas ainda exibe figuras para o processamento de dados pós-loop. É provavelmente mais lento do que escolher um back-end não interativo - seria interessante se alguém testasse isso.UPDATE : para o Spyder, você normalmente não pode definir o back-end dessa maneira (porque o Spyder geralmente carrega o matplotlib mais cedo, impedindo o uso
matplotlib.use()
).Em vez disso, use
plt.switch_backend('Agg')
ou desative " ativar suporte " nas preferências do Spyder e execute omatplotlib.use('Agg')
comando você mesmo.Destas duas dicas: uma , duas
fonte
.plot()
gerará um erro seos.environ['DISPLAY']
não estiver definido corretamente.Se você não gosta do conceito da figura "atual", faça:
fonte
src.png
paraout.png
?img
), então você pode salvá-lo em arquivo com o.imsave()
métodoAs outras respostas estão corretas. No entanto, às vezes acho que quero abrir o objeto de figura mais tarde. Por exemplo, convém alterar os tamanhos dos rótulos, adicionar uma grade ou fazer outro processamento. Em um mundo perfeito, eu simplesmente executaria novamente o código que gerava o enredo e adaptaria as configurações. Infelizmente, o mundo não é perfeito. Portanto, além de salvar em PDF ou PNG, adiciono:
Assim, eu posso carregar o objeto da figura e manipular as configurações como quiser.
Também escrevo a pilha com o código-fonte e o
locals()
dicionário para cada função / método na pilha, para que depois eu possa dizer exatamente o que gerou a figura.Nota: tenha cuidado, pois às vezes esse método gera arquivos enormes.
fonte
fonte
Depois de usar o plot () e outras funções para criar o conteúdo desejado, você pode usar uma cláusula como essa para selecionar entre plotar na tela ou arquivar:
fonte
fig = plt.figure(figuresize=4, 5)
poderia serfig = plt.figure(figsize=(4, 5)) #figure sizes in inches
Eu usei o seguinte:
Achei muito importante usar o plt.show depois de salvar a figura, caso contrário não funcionará. figura exportada em png
fonte
f= plt.savefig('data.png')
Você pode fazer:
e lembre-se de deixar savefig terminar antes de fechar o gráfico da GUI. Desta forma, você pode ver a imagem de antemão.
Como alternativa, você pode vê-lo com
plt.show()
Em seguida, feche a GUI e execute o script novamente, mas desta vez substituaplt.show()
porplt.savefig()
.Como alternativa, você pode usar
fonte
Se, como eu, você usa o Spyder IDE, precisa desativar o modo interativo com:
plt.ioff()
(este comando é iniciado automaticamente com a inicialização científica)
Se você deseja habilitá-lo novamente, use:
plt.ion()
fonte
A solução :
Se você deseja exibir a imagem e salvar a imagem, use:
depois de
import matplotlib
fonte
De acordo com a pergunta Matplotlib (pyplot), savefig gera uma imagem em branco .
Uma coisa deve notar: se você usar
plt.show
e deve depoisplt.savefig
, ou você dará uma imagem em branco.Um exemplo detalhado:
fonte
No Jupyter Notebook, você deve remover
plt.show()
e adicionarplt.savefig()
, juntamente com o restante do código plt, em uma célula. A imagem ainda aparecerá no seu notebook.fonte
Dado que hoje (não estava disponível quando esta pergunta foi feita) muitas pessoas usam Jupyter Notebook como console de python, há uma maneira extremamente fácil para salvar as parcelas como
.png
, basta ligar para omatplotlib
'spylab
classe de Jupyter Notebook, traçar a figura' inline 'jupyter células e arraste essa figura / imagem para um diretório local. Não esqueça%matplotlib inline
na primeira linha!fonte
Além dos itens acima, adicionei
__file__
o nome para que a imagem e o arquivo Python obtenham os mesmos nomes. Também adicionei alguns argumentos para torná-lo melhor:fonte
Ao usar
matplotlib.pyplot
, você deve primeiro salvar sua plotagem e depois fechá-la usando estas 2 linhas:fonte
Como sugerido anteriormente, você pode usar:
Para salvar qualquer imagem IPhython que você está exibindo. Ou em uma nota diferente (olhando de um ângulo diferente), se você trabalhar com o cv aberto ou se tiver importado o cv aberto, poderá optar por:
importação cv2
cv2.imwrite ("myfig.png", imagem)
Mas isso é apenas no caso, se você precisar trabalhar com o Open CV. Caso contrário, plt.savefig () deve ser suficiente.
fonte
Você pode salvar sua imagem com qualquer extensão (png, jpg, etc.) E com a resolução desejada. Aqui está uma função para salvar sua figura.
'fig_id' é o nome pelo qual você deseja salvar sua figura. Espero que ajude:)
fonte
Você pode fazer assim:
fonte