Estou tentando plotar alguns dados de uma câmera em tempo real usando o OpenCV. No entanto, a plotagem em tempo real (usando o matplotlib) não parece estar funcionando.
Eu isolei o problema neste exemplo simples:
fig = plt.figure()
plt.axis([0, 1000, 0, 1])
i = 0
x = list()
y = list()
while i < 1000:
temp_y = np.random.random()
x.append(i)
y.append(temp_y)
plt.scatter(i, temp_y)
i += 1
plt.show()
Eu esperaria que este exemplo plotasse 1000 pontos individualmente. O que realmente acontece é que a janela aparece com o primeiro ponto exibido (ok com isso) e aguarda o loop terminar antes de preencher o restante do gráfico.
Alguma idéia de por que não estou vendo pontos preenchidos um de cada vez?
python
matplotlib
while-loop
real-time
Chris
fonte
fonte
plt.axis()
mas crie duas listas x e ye chameplt.plot(x,y)
2. no seu loop, anexe novos valores de dados a as duas listas 3. ligarplt.gca().lines[0].set_xdata(x); plt.gca().lines[0].set_ydata(y); plt.gca().relim(); plt.gca().autoscale_view(); plt.pause(0.05);
Se você estiver interessado em plotagem em tempo real, recomendo consultar a API de animação do matplotlib . Em particular, usar
blit
para evitar redesenhar o plano de fundo em cada quadro pode proporcionar ganhos substanciais de velocidade (~ 10x):Resultado:
fonte
plt.show()
eplt.draw()
. Adicionei essas alterações ao código acima.blit()
parece ser "melhorar a plotagem em tempo real"? Se você tem um desenvolvedor / blog matplotlib discutindo o porquê / objetivo / intenção / motivação, isso seria ótimo. (parece que essa nova operação de conversão converteria o Matplotlib de apenas uso para dados offline ou alterando muito lentamente para agora você pode usar o Matplotlib com dados de atualização muito rápidos ... quase como um osciloscópio).Eu sei que estou um pouco atrasado para responder a esta pergunta. No entanto, criei algum código há algum tempo para traçar gráficos ao vivo, que gostaria de compartilhar:
Código para PyQt4:
Recentemente, reescrevi o código do PyQt5.
Código para PyQt5:
Apenas tente. Copie e cole esse código em um novo arquivo python e execute-o. Você deve obter um gráfico bonito e com movimentos suaves:
fonte
dataSendLoop
segmento continuava sendo executado em segundo plano quando você fecha a janela. Então, adicionei adaemon = True
palavra-chave para resolver esse problema.conda install pyqt=4
fiz o truque.show
provavelmente não é a melhor escolha para isso. O que eu faria é usar em seupyplot.draw()
lugar. Você também pode incluir um pequeno atraso de tempo (por exemplo,time.sleep(0.05)
) no loop, para poder ver as plotagens acontecendo. Se eu fizer essas alterações no seu exemplo, funcionará para mim e vejo cada ponto aparecendo um de cada vez.fonte
Nenhum dos métodos funcionou para mim. Mas descobri que esse gráfico em tempo real do matplotlib não está funcionando enquanto ainda está em loop
Tudo que você precisa é adicionar
e então você pode ver os novos gráficos.
Portanto, seu código deve ficar assim, e funcionará
fonte
As respostas principais (e muitas outras) foram baseadas
plt.pause()
, mas essa era uma maneira antiga de animar a trama no matplotlib. Não é apenas lento, mas também faz com que o foco seja capturado a cada atualização (tive dificuldade em parar o processo de plotagem de python).TL; DR: você pode querer usar
matplotlib.animation
( como mencionado na documentação ).Depois de pesquisar várias respostas e partes do código, isso de fato provou ser uma maneira fácil de extrair infinitamente os dados recebidos para mim.
Aqui está o meu código para um início rápido. Ele plota o tempo atual com um número aleatório em [0, 100) a cada 200ms infinitamente, enquanto também gerencia o redimensionamento automático da exibição:
Você também pode explorar
blit
para obter um desempenho ainda melhor, como na documentação do FuncAnimation .Um exemplo da
blit
documentação:fonte
for i in range(1000): x,y = some func_func()
. Aquisome_func()
gerax,y
pares de dados on-line , que eu gostaria de plotar quando estiverem disponíveis. É possível fazer isso comFuncAnimation
. Meu objetivo é construir a curva definida pelos dados passo a passo com cada iteração.pyploy.show()
deve bloquear. Se você deseja anexar dados, recupere-os e atualize naupdate
função.pyplot.show
em um loop, o loop será bloqueado por essa chamada e não continuará. Se você quiser acrescentar dados à curva passo a passo, insira sua lógicaupdate
, que será chamada todos osinterval
demais, para que também seja passo a passo.Eu sei que essa pergunta é antiga, mas agora existe um pacote disponível chamado drawow no GitHub como "python-drawnow". Isso fornece uma interface semelhante à do MATLAB - você pode atualizar facilmente uma figura.
Um exemplo para o seu caso de uso:
python-drawnow é um invólucro fino,
plt.draw
mas fornece a capacidade de confirmar (ou depurar) após a exibição da figura.fonte
O problema parece ser que você espera
plt.show()
mostrar a janela e depois retornar. Isso não faz isso. O programa será interrompido nesse ponto e só será retomado quando você fechar a janela. Você deve poder testar isso: Se você fechar a janela e outra janela aparecer.Para resolver esse problema, basta ligar
plt.show()
uma vez após o loop. Então você obtém a trama completa. (Mas não uma 'plotagem em tempo real')Você pode tentar definir o argumento da palavra-chave
block
assim:plt.show(block=False)
uma vez no início e depois usar.draw()
para atualizar.fonte
Aqui está uma versão que eu trabalhei no meu sistema.
A linha drawow (makeFig) pode ser substituída por uma makeFig (); sequência plt.draw () e ainda funciona bem.
fonte
Se você deseja desenhar e não congelar seu segmento, à medida que mais pontos são desenhados, use plt.pause () e não time.sleep ()
estou usando o código a seguir para plotar uma série de coordenadas xy.
fonte
Outra opção é ir com bokeh . OMI, é uma boa alternativa, pelo menos para gráficos em tempo real. Aqui está uma versão bokeh do código na pergunta:
e para executá-lo:
bokeh mostra o resultado em um navegador da web por meio de comunicações do soquete da web. É especialmente útil quando os dados são gerados por processos remotos do servidor sem cabeça.
fonte
Um exemplo de caso de uso para plotar o uso da CPU em tempo real.
fonte