2010-11-09 12 views
18

Mam skomplikowany algorytm, który aktualizuje 3 histogramy, które są przechowywane w tablicach. Chcę debugować mój algorytm, więc pomyślałem o wyświetleniu tablic jako histogramów w interfejsie użytkownika. Jaki jest najłatwiejszy sposób na zrobienie tego. (Szybkie tworzenie aplikacji jest ważniejsze niż zoptymalizowany kod.)Jak wyświetlić wykresy w czasie rzeczywistym w prostym interfejsie dla programu Pythona?

Mam pewne doświadczenie z Qt (w C++) i trochę doświadczenia z matplotlib.

(Mam zamiar zostawić to pytanie otwarte na dzień lub dwa, ponieważ trudno mi ocenić rozwiązania bez większego doświadczenia, którego nie mam. Mam nadzieję, że głosy społeczności pomogą wybrać najlepszy odpowiedź.)

+0

Jeśli chodzi o szybki rozwój, polecam Tkintera. To znacznie bardziej intuicyjne IMO niż PyQt. –

+0

Nie widzę trudności. Po prostu użyj matplotlib, aby narysować histogramy. Jakiś konkretny problem? –

+0

@Bernardo, chcę je zaktualizować, ponieważ podstawowe struktury danych są aktualizowane. Jeśli wykreślić przy użyciu matplotlib, otrzymam wykres dla każdego kroku czasowego? To będzie trudne do śledzenia, kiedy mam okno na każdy krok. –

Odpowiedz

21

Edit: Teraz łatwiej i lepiej używać 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() 

Jest przykładem podejmowania animowany wykres here. Opierając się na tym przykładzie, można spróbować czegoś takiego:

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

mogę dostać około 14 klatek na sekundę w ten sposób, w porównaniu do 4 klatek na sekundę przy użyciu kodu I first posted. Sztuką jest unikanie pytania matplotlib o narysowanie pełnych figur. Zamiast tego zadzwoń raz plt.hist, następnie zmodyfikuj istniejące matplotlib.patches.Rectangle s w patches, aby zaktualizować histogram, i zadzwoń pod numer fig.canvas.draw(), aby aktualizacje były widoczne.

+0

To działa dobrze, ale okno kreślenia nie reaguje lub zamyka się samo .. jakakolwiek sugestia? – DevC

+0

@DevC: W dzisiejszych czasach lepiej jest użyć 'matplotlib.animation'. Dodałem przykład powyżej. – unutbu

+0

Tutaj można znaleźć przykładowe filmy animowane: http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/ – kakyo

1

Polecam używanie matplotlib w trybie interaktywnym, jeśli raz zadzwonisz pod numer .show, to pojawi się on w swoim własnym oknie, jeśli nie, to istnieje tylko w pamięci i może być zapisany do pliku, gdy Zrobiłem to.

1

Ouh, teraz widzisz, kiedy mówisz w czasie rzeczywistym masz na myśli, że chcesz uzyskać częstotliwość odświeżania wyższą niż 5 Hz, matplotlib nie wykona zadania. Miałem ten problem wcześniej, poszedłem na PyQwt, który działa z PyQt.

+1

PyQwt jest obecnie uważany za bez opieki.Mam nadzieję, że to się zmieni w przyszłości, ale uważaj na teraz .. – Luke

9

Do kreślenia w czasie rzeczywistym zalecam wypróbowanie Chaco, pyqtgraph lub dowolnej z bibliotek opartych na OpenGL, takich jak glumpy lub visvis. Matplotlib, jakkolwiek cudowny, generalnie nie nadaje się do tego rodzaju aplikacji.

Edytuj: Twórcy glumpy, visvis, gallry i pyqtgraph współpracują w bibliotece wizualizacji o nazwie vispy. Jest jeszcze na wczesnym etapie rozwoju, ale obiecujący i już dość potężny.

+0

[vispy website] (http://vispy.org) zawiera galeria kilku aplikacji i kod odpowiadający tym aplikacjom. – Mark

Powiązane problemy