Estou fazendo um aplicativo em Python que coleta dados de uma porta serial e traça um gráfico dos dados coletados em relação ao tempo de chegada. A hora de chegada dos dados é incerta. Quero que o gráfico seja atualizado quando os dados forem recebidos. Pesquisei como fazer isso e encontrei dois métodos:
- Limpe o gráfico e redesenhe o gráfico com todos os pontos novamente.
- Anime o enredo alterando-o após um determinado intervalo.
Eu não prefiro o primeiro porque o programa roda e coleta dados por um longo tempo (um dia, por exemplo), e redesenhar o gráfico será bem lento. O segundo também não é preferível, pois o tempo de chegada dos dados é incerto e eu quero que o gráfico seja atualizado apenas quando os dados forem recebidos.
Existe uma maneira de atualizar o gráfico apenas adicionando mais pontos a ele apenas quando os dados forem recebidos?
python
matplotlib
tkinter
Shadman Anwer
fonte
fonte
Respostas:
Existem várias maneiras de animar dados em matplotlib, dependendo da versão que você possui. Você viu o exemplos do livro de receitas matplotlib ? Além disso, verifique os exemplos de animação mais modernos na documentação do matplotlib. Finalmente, a API de animação define uma função FuncAnimation que anima uma função no tempo. Esta função pode ser apenas a função que você usa para adquirir seus dados.
Cada método basicamente define a
data
propriedade do objeto que está sendo desenhado, portanto, não requer a limpeza da tela ou figura. Adata
propriedade pode ser simplesmente estendida, para que você possa manter os pontos anteriores e apenas continuar adicionando à sua linha (ou imagem ou o que quer que esteja desenhando).Considerando que você diz que seu horário de chegada de dados é incerto, sua melhor aposta é provavelmente apenas fazer algo como:
Então quando você receber dados da porta serial é só ligar
update_line
.fonte
Para fazer isso sem FuncAnimation (por exemplo, você deseja executar outras partes do código enquanto o gráfico está sendo produzido ou deseja atualizar vários gráficos ao mesmo tempo), chamando
draw
sozinho não produz o gráfico (pelo menos com o backend qt).O seguinte funciona para mim:
fonte
%matplotlib notebook
comando mágico após sua instrução de importação matplotlib.Esta é uma maneira que permite remover pontos após um certo número de pontos traçados:
fonte
Sei que estou atrasado para responder a essa pergunta, mas para seu problema, você pode olhar para o pacote "joystick". Eu o projetei para traçar um fluxo de dados da porta serial, mas funciona para qualquer fluxo. Também permite registro de texto interativo ou plotagem de imagem (além de plotagem de gráfico). Não há necessidade de fazer seus próprios loops em uma thread separada, o pacote cuida disso, basta fornecer a frequência de atualização desejada. Além disso, o terminal permanece disponível para monitorar comandos durante a plotagem. Consulte http://www.github.com/ceyzeriat/joystick/ ou https://pypi.python.org/pypi/joystick (use o joystick de instalação do pip para instalar)
Basta substituir np.random.random () pelo seu ponto de dados real lido da porta serial no código abaixo:
fonte