Após estas instruções no interpretador Python, obtém-se uma janela com um gráfico:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Infelizmente, não sei como continuar a explorar interativamente a figura criada show()
enquanto o programa faz cálculos adicionais.
É possível de alguma forma? Às vezes, os cálculos são longos e ajudaria se eles prosseguissem durante a análise dos resultados intermediários.
python
matplotlib
plot
meteore
fonte
fonte
ion()
corrige o problema.os.fork()
mas lembre-se de que o usoos.fork()
pode ser complicado porque você está criando um novo processo, copiando o processo antigo.Respostas:
Use
matplotlib
as chamadas que não serão bloqueadas:Usando
draw()
:Usando o modo interativo:
fonte
draw()
não funciona para mim, não abre nenhuma janela. No entanto, usar emshow(block=False)
vez dedraw()
parece fazer o truque no matplotlib 1.1.draw()
também não funcionou para mim, apenaspause(0.001)
: stackoverflow.com/questions/28269157/…Use a palavra-chave 'block' para substituir o comportamento de bloqueio, por exemplo
para continuar seu código.
fonte
É melhor sempre verificar com a biblioteca que você está usando se ela suporta o uso de maneira não-bloqueadora .
Mas se você quiser uma solução mais genérica ou se não houver outra maneira, poderá executar qualquer coisa que bloqueie em um processo separado usando o
multprocessing
módulo incluído no python. A computação continuará:Isso tem a sobrecarga de iniciar um novo processo e às vezes é mais difícil depurar em cenários complexos, então eu prefiro a outra solução (usando
matplotlib
as chamadas de API sem bloqueio de API )fonte
if __name__ == '__main__':
?Experimentar
A
show()
documentação diz:fonte
IMPORTANTE : Apenas para deixar algo claro. Presumo que os comandos estejam dentro de um
.py
script e o script seja chamado usando, por exemplo,python script.py
do console.Uma maneira simples que funciona para mim é:
Exemplo de
script.py
arquivo:fonte
Você pode ler este documento na
matplotlib
documentação de, intitulada:Usando matplotlib em um shell python
fonte
No meu caso, eu queria que várias janelas fossem exibidas enquanto elas estavam sendo computadas. Para referência, este é o caminho:
PS. Um guia bastante útil para a interface OO do matplotlib .
fonte
Bem, tive um grande problema para descobrir os comandos não-bloqueadores ... Mas, finalmente, consegui refazer o exemplo " Cookbook / Matplotlib / Animations - Animating selected plot elements ", para que funcione com threads ( e passe dados entre threads também via variáveis globais ou através de um multiprocesso
Pipe
) no Python 2.6.5 no Ubuntu 10.04.O script pode ser encontrado aqui: Animating_selected_plot_elements-thread.py - caso contrário, colado abaixo ( com menos comentários ) para referência:
Espero que isso ajude alguém,
Saúde!
fonte
Em muitos casos, é mais conveniente salvar a imagem como um arquivo .png no disco rígido. Aqui está o porquê:
Vantagens:
Recua:
fonte
Se você estiver trabalhando no console, ou seja,
IPython
você pode usarplt.show(block=False)
como indicado nas outras respostas. Mas se você é preguiçoso, basta digitar:Qual será o mesmo.
fonte
Eu também tive que adicionar
plt.pause(0.001)
ao meu código para fazê-lo funcionar dentro de um loop for (caso contrário, ele mostraria apenas o primeiro e o último gráfico):fonte
No meu sistema, show () não bloqueia, embora eu quisesse que o script esperasse o usuário interagir com o gráfico (e coletar dados usando retornos de chamada 'pick_event') antes de continuar.
Para bloquear a execução até que a janela de plotagem seja fechada, usei o seguinte:
Observe, no entanto, que canvas.start_event_loop_default () produziu o seguinte aviso:
embora o script ainda tenha sido executado.
fonte
Eu também queria que meus gráficos exibissem o restante do código (e continuem exibindo) mesmo se houver um erro (às vezes eu uso gráficos para depuração). Eu codifiquei esse pequeno truque para que quaisquer plotagens dentro desta
with
declaração se comportem como tal.Provavelmente, isso é um pouco fora do padrão e não é aconselhável para o código de produção. Provavelmente, existem muitas "dicas" ocultas neste código.
Se / quando implementar um bom "mantenha os gráficos abertos (mesmo que ocorra um erro) e permita que novos gráficos sejam exibidos", gostaria que o script saísse corretamente se nenhuma interferência do usuário disser o contrário (para fins de execução em lote).
Posso usar algo como uma pergunta de tempo limite "Fim do script! \ NPressione p se você quiser que a saída da plotagem seja pausada (você tem 5 segundos):" em /programming/26704840/corner -casos-para-minha-espera-para-usuário-interrupção-de-implementação .
fonte
fonte
O OP pergunta sobre a retirada de
matplotlib
parcelas. A maioria das respostas pressupõe a execução de comandos de um interpretador python. O caso de uso apresentado aqui é a minha preferência para testar o código em um terminal (por exemplo, bash) em que afile.py
é executado e você deseja que o gráfico apareça, mas o script python seja concluído e retorne ao prompt de comando.Esse arquivo independente usa
multiprocessing
para iniciar um processo separado para plotagem de dadosmatplotlib
. O thread principal sai usando oos._exit(1)
mencionado neste post. Asos._exit()
forças principais saem, mas deixam omatplotlib
processo filho vivo e responsivo até que a janela da plotagem seja fechada. É um processo completamente separado.Essa abordagem é um pouco como uma sessão de desenvolvimento do Matlab com janelas de figuras que vêm com um prompt de comando responsivo. Com essa abordagem, você perdeu todo o contato com o processo da janela de figuras, mas tudo bem para desenvolvimento e depuração. Apenas feche a janela e continue testando.
multiprocessing
foi desenvolvido para execução de código somente em python, o que talvez o torne mais adequadosubprocess
.multiprocessing
é multiplataforma, portanto, isso deve funcionar bem no Windows ou Mac com pouco ou nenhum ajuste. Não há necessidade de verificar o sistema operacional subjacente. Isso foi testado no Linux, Ubuntu 18.04LTS.A execução
file.py
exibe uma janela de figura e__main__
sai, mas a janela de figuramultiprocessing
+matplotlib
permanece responsiva com zoom, pan e outros botões porque é um processo independente.Verifique os processos no prompt de comando bash com:
ps ax|grep -v grep |grep file.py
fonte
.daemon=False
como descrito aqui stackoverflow.com/a/49607287/1476932 No entanto,sys.exit()
não finalizei o processo pai conforme descrito lá até eu fechar a janela filho. Por outro lado, o usoos._exit(0)
do exemplo acima funcionou.Na minha opinião, as respostas neste tópico fornecem métodos que não funcionam para todos os sistemas e em situações mais complexas, como animações. Sugiro dar uma olhada na resposta do MiKTeX no seguinte segmento, onde foi encontrado um método robusto: Como esperar até que a animação matplotlib termine?
fonte
Se você deseja abrir várias figuras, mantendo todas abertas, esse código funcionou para mim:
fonte
Embora não esteja respondendo diretamente à solicitação dos OPs, estou postando esta solução alternativa, pois pode ajudar alguém nessa situação:
para este Im usando:
Onde "var" identifica a plotagem no loop, para que não seja substituída.
fonte
Use
plt.show(block=False)
e no final da sua chamada de scriptplt.show()
.Isso garantirá que a janela não seja fechada quando o script for concluído.
fonte