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.)

18
demandé sur Saullo G. P. Castro 2010-11-09 04:28:44

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.Rectangles patches pour mettre à jour l'histogramme, et appeler fig.canvas.draw() pour faire les mises à jour visibles.

21
répondu unutbu 2017-12-31 18:27:10

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.

9
répondu Luke 2018-01-01 21:55:48

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.

1
répondu Gareth Davidson 2010-11-09 01:48:19

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.

1
répondu Bernardo Kyotoku 2013-02-17 04:20:21