Ambiente: Python 2.7, matplotlib 1.3, IPython notebook 1.1, linux, chrome. O código está em uma única célula de entrada, usando--pylab=inline
Quero usar notebook IPython e pandas para consumir um stream e atualizar dinamicamente um gráfico a cada 5 segundos.
Quando eu apenas uso a instrução print para imprimir os dados em formato de texto, funciona perfeitamente bem: a célula de saída apenas continua imprimindo dados e adicionando novas linhas. Mas quando tento plotar os dados (e depois atualizá-los em um loop), o gráfico nunca aparece na célula de saída. Mas se eu remover o loop, plote-o apenas uma vez. Funciona bem.
Então fiz um teste simples:
i = pd.date_range('2013-1-1',periods=100,freq='s')
while True:
plot(pd.Series(data=np.random.randn(100), index=i))
#pd.Series(data=np.random.randn(100), index=i).plot() also tried this one
time.sleep(5)
A saída não mostrará nada até que eu interrompa manualmente o processo (ctrl + m + i). E depois de interrompê-lo, o gráfico mostra corretamente como várias linhas sobrepostas. Mas o que eu realmente quero é um gráfico que apareça e seja atualizado a cada 5 segundos (ou sempre que a plot()
função for chamada, assim como as saídas da instrução de impressão que mencionei acima, que funciona bem). Mostrar apenas o gráfico final depois que a célula está completamente pronta NÃO é o que eu quero.
Eu até tentei adicionar explicitamente a função draw () após cada uma plot()
, etc. Nenhuma delas funciona. Gostaria de saber como atualizar dinamicamente um gráfico por um loop for / while dentro de uma célula no notebook IPython.
fonte
clear_output(wait=True)
resolve esse problema. Veja a resposta do wabu abaixo.%matplotlib nbagg
que lhe dá uma figura viva para brincar.nbagg
para fazer isso. (Enviando um ping para você caso esteja interessado em responder.) Stackoverflow.com/questions/34486642/…Você pode melhorar ainda mais adicionando
wait=True
aclear_output
:fonte
Algumas melhorias na resposta de HYRY :
display
antesclear_output
para que você termine com um gráfico, ao invés de dois, quando a célula for interrompida.KeyboardInterrupt
, para que a saída da célula não seja suja com o rastreamento.fonte
display.display(gcf())
deve ir ANTESdisplay.clear_output(wait=True)
display
ser chamado antesclear_output
? Você não deveria primeiro limpar a saída e, em seguida, exibir os novos dados, em vez de fazer o contrário?Tente adicionar
show()
ougcf().show()
após aplot()
função. Isso forçará a atualização da figura atual (gcf () retorna uma referência para a figura atual).fonte
Adicionar rótulo a outras soluções postadas aqui continuará adicionando novos rótulos a cada loop. Para lidar com isso, limpe o enredo usando
clf
fonte
plt.clf()
trabalhos. No entanto, há como se livrar da oscilação das atualizações?Você pode fazer assim. Ele aceita x, y como lista e produz um gráfico de dispersão mais uma tendência linear no mesmo gráfico.
você só precisa chamar
live_plot(x, y)
dentro de um loop. Veja como fica:fonte