Comment puis-je afficher des graphiques en temps réel dans une interface utilisateur simple pour un programme de python?

StackOverflow https://stackoverflow.com/questions/4129697

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top