Comment puis-je afficher des graphiques en temps réel dans une interface utilisateur simple pour un programme de python?
-
29-09-2019 - |
Question
J'ai un algorithme complexe qui met à jour 3 histogrammes qui sont stockés dans des tableaux. Je veux déboguer mon algorithme, donc je pensais à montrer les tableaux comme dans une interface histogrammes utilisateur. Quelle est la manière la plus simple de faire ça. (Développement rapide d'applications est plus important que le code optimisé.)
J'ai une certaine expérience avec Qt (en C ++) et une certaine expérience avec matplotlib.
(Je vais laisser cette question ouverte pour une journée ou deux parce qu'il est difficile pour moi d'évaluer les solutions sans beaucoup plus d'expérience que je n'ai pas. Il faut espérer que les votes de la communauté vous aidera à choisir la meilleure réponse .)
La solution
Edit: De nos jours, il est plus facile et mieux utiliser matplotlib.animation
:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def animate(frameno):
x = mu + sigma * np.random.randn(10000)
n, _ = np.histogram(x, bins, normed=True)
for rect, h in zip(patches, n):
rect.set_height(h)
return patches
mu, sigma = 100, 15
fig, ax = plt.subplots()
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
ani = animation.FuncAnimation(fig, animate, blit=True, interval=10,
repeat=True)
plt.show()
Il est un exemple de faire un graphique animé ici . Fortes de cet exemple, vous pouvez essayer quelque chose comme:
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
mu, sigma = 100, 15
fig = plt.figure()
x = mu + sigma*np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
for i in range(50):
x = mu + sigma*np.random.randn(10000)
n, bins = np.histogram(x, bins, normed=True)
for rect,h in zip(patches,n):
rect.set_height(h)
fig.canvas.draw()
Je peux obtenir environ 14 images par seconde de cette façon, par rapport à 4 images par seconde en utilisant le code I première affiché . L'astuce est d'éviter de demander matplotlib de tirer des chiffres complets. Au lieu de cela plt.hist
appel une fois, puis manipuler les matplotlib.patches.Rectangle
s existants dans patches
de mettre à jour l'histogramme et appel
fig.canvas.draw()
pour faire les mises à jour visibles.
Autres conseils
Pour tracer le graphe en temps réel, je recommande d'essayer Chaco, pyqtgraph, ou l'une des bibliothèques OpenGL comme glumpy ou visvis. Matplotlib, merveilleux comme il est, ne convient généralement pas pour ce genre d'application.
Edit: les développeurs de glumpy, visvis, galry et pyqtgraph sont tous collaborent à une bibliothèque de visualisation appelée
Je recommande d'utiliser matplotlib en mode interactif, si vous appelez .show
une fois il apparaîtra dans sa propre fenêtre, si vous ne le faites pas, alors il existe seulement dans la mémoire et peut être écrit dans un fichier lorsque vous avez terminé il.
Ouh, maintenant voir, quand vous dites temps réel vous dire que vous voulez un taux de rafraîchissement supérieur à 5 Hz matplotlib ne fera pas le travail. J'ai eu ce problème avant, je suis allé pour PyQwt qui fonctionne avec PyQt.