Je crée une application en Python qui collecte des données à partir d'un port série et trace un graphique des données collectées par rapport à l'heure d'arrivée. L'heure d'arrivée des données est incertaine. Je veux que le tracé soit mis à jour lorsque les données sont reçues. J'ai cherché comment faire cela et j'ai trouvé deux méthodes:
- Effacez le tracé et redessinez le tracé avec tous les points à nouveau.
- Animez le tracé en le modifiant après un intervalle particulier.
Je ne préfère pas le premier car le programme s'exécute et recueille des données pendant une longue période (un jour par exemple), et redessiner l'intrigue sera assez lent. Le second n'est pas non plus préférable car l'heure d'arrivée des données est incertaine et je souhaite que le graphique ne se mette à jour que lorsque les données sont reçues.
Existe-t-il un moyen de mettre à jour le tracé simplement en y ajoutant plus de points uniquement lorsque les données sont reçues?
la source
Réponses:
Il existe plusieurs façons d'animer des données dans matplotlib, selon la version dont vous disposez. Avez-vous vu les exemples de livres de recettes matplotlib ? Consultez également les exemples d'animation les plus modernes dans la documentation matplotlib. Enfin, l' API d'animation définit une fonction FuncAnimation qui anime une fonction dans le temps. Cette fonction pourrait simplement être la fonction que vous utilisez pour acquérir vos données.
Chaque méthode définit fondamentalement la
data
propriété de l'objet dessiné, donc ne nécessite pas d'effacer l'écran ou la figure. Ladata
propriété peut simplement être étendue, de sorte que vous pouvez conserver les points précédents et continuer à ajouter à votre ligne (ou image ou tout ce que vous dessinez).Étant donné que vous dites que l'heure d'arrivée de vos données est incertaine, votre meilleur pari est probablement de faire quelque chose comme:
Ensuite, lorsque vous recevez des données du port série, il vous suffit d'appeler
update_line
.la source
Pour ce faire sans FuncAnimation (par exemple, vous voulez exécuter d'autres parties du code pendant la production du tracé ou vous voulez mettre à jour plusieurs tracés en même temps), l'appel
draw
seul ne produit pas le tracé (du moins avec le qt backend).Ce qui suit fonctionne pour moi:
la source
%matplotlib notebook
commande magic après votre instruction d'importation matplotlib.Voici un moyen qui permet de supprimer des points après un certain nombre de points tracés:
la source
Je sais que je suis en retard pour répondre à cette question, mais pour votre problème, vous pouvez consulter le package "joystick". Je l'ai conçu pour tracer un flux de données à partir du port série, mais cela fonctionne pour n'importe quel flux. Il permet également la journalisation de texte interactive ou le traçage d'images (en plus du tracé graphique). Pas besoin de faire vos propres boucles dans un thread séparé, le package s'en charge, donnez simplement la fréquence de mise à jour que vous souhaitez. De plus, le terminal reste disponible pour surveiller les commandes pendant le traçage. Voir http://www.github.com/ceyzeriat/joystick/ ou https://pypi.python.org/pypi/joystick (utilisez pip install joystick pour installer)
Remplacez simplement np.random.random () par votre point de données réel lu depuis le port série dans le code ci-dessous:
la source