Comment afficher des graphiques en temps réel dans une interface utilisateur simple pour un programme python?
j'ai un algorithme compliqué 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 des histogrammes dans une interface utilisateur. Quelle est la meilleure façon de le faire. (Le développement rapide des applications est plus important que l'optimisation du code.)
j'ai une certaine expérience avec Qt (en C++) et une certaine expérience avec matplotlib.
(je vais laisser cette question ouverte pour un jour ou deux, car il est difficile pour moi pour évaluer les solutions sans beaucoup plus d'expérience que je n'ai pas. Espérons que les votes de la communauté aideront à choisir la meilleure réponse.)
4 réponses
Edit: de nos jours, il est plus facile et meilleur d'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 y a un exemple de faire un graphique animé ici. En vous basant sur cet exemple, vous pourriez 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 sur les 14 images par seconde de cette façon, par rapport à 4 images par seconde en utilisant le code que j' d'abord posté. L'astuce est d'éviter de demander à matplotlib de dessiner des chiffres complets. Au lieu d'appeler plt.hist
une fois, puis manipuler l'existant matplotlib.patches.Rectangle
s patches
pour mettre à jour l'histogramme, et appeler
fig.canvas.draw()
pour faire les mises à jour visibles.
pour le traçage en temps réel, je recommande D'essayer Chaco, pyqtgraph, ou n'importe laquelle des bibliothèques basées sur opengl comme glumpy ou visvis. Matplotlib, beau soit-il, n'est généralement pas adapté pour ce type d'application.
Edit: les développeurs de glumpy, visvis, galry et pyqtgraph collaborent tous sur une bibliothèque de visualisation appelée vispy. Il est encore à ses débuts, mais prometteur et déjà assez puissant.
je recommande d'utiliser matplotlib en mode interactif, si vous appelez .show
une fois alors il apparaîtra dans sa propre fenêtre, si vous ne le faites pas, alors il n'existe qu'en mémoire et peut être écrit dans un fichier lorsque vous en avez fini avec lui.
Ouh, maintenant Voir, quand vous dites temps réel vous voulez 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.