2012-06-05 11 views
6

Jestem nowy w matplotlib. Mam listę współrzędnych x-y, które aktualizuję w pythonie i chcę animować przy użyciu pyplot matplotlib. Chcę wcześniej określić zakres x i y. Poniżej jest mój bieżący kod:Prosta animacja współrzędnych 2D przy użyciu matplotlib i pyplot

import matplotlib.pyplot as plt 
x=[1,2,3,4] 
y=[5,6,7,8] 
for t in range(100): 
    #lists x and y get updated here 
    #... 
plt.plot(x, y, marker='o', linestyle='None') 
plt.show() 

Jak widać, używam plt.plot() i plt.show()na końcu mojego iteracji pętli wykreślić tylko ostatecznych współrzędnych. Ale chcę umieścić ten krok w pętli i drukować w każdej iteracji z określonym czasem pauzy, aby mieć animację podczas pracy pętli.

Po prostu przeniesienie tego stwierdzenia w pętli lub zmiany w tym miejscu nie działają. Chcę zachować bardzo proste i nie chcę używać matplotlib.animation. Czy jest jakaś prosta metoda bez użycia wielu dodatkowych modułów i bibliotek (tylko rzeczy takie jak plt.pause() i może tylko trochę więcej), które pozwolą mi robić to, co chcę?

Spojrzałem na wiele miejsc w Internecie, a problemem, z którym borykam się z większością metod jest to, że używam Pythona (x, y) (to jest wersja Pythona 2.7) w Windows do tego i animacji używających zbyt skomplikowanych modułów i bibliotek tu się zawieszają.

Jednak jestem w stanie uruchomić proste rzeczy, takie jak this example na stronie matplotlib, która jest bliska temu, co chcę, ale nie całkiem. Być może najlepszą rzeczą będzie modyfikacja tego przykładu, który działa dla mojego przypadku danych 2D (ten przykład dotyczy rzędu 1D). Ale wszelkie inne sugestie są mile widziane.

Odpowiedz

8

ten jest dostosowany od animation demo:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 

x = [1, 2, 3, 4] 
y = [5, 6, 7, 8] 

for t in range(10): 
    if t == 0: 
     points, = ax.plot(x, y, marker='o', linestyle='None') 
     ax.set_xlim(0, 10) 
     ax.set_ylim(0, 10) 
    else: 
     new_x = np.random.randint(10, size=5) 
     new_y = np.random.randint(10, size=5) 
     points.set_data(new_x, new_y) 
    plt.pause(0.5) 

Chociaż jest to proste docstring powiedzieć, że jest wolna.

+0

+1. To działa. Po prostu spróbuję dostosować to do mojego ostatecznego programu i zobaczyć, jak to działa. –

+0

To zadziałało dobrze z moim programem. Przyjęty. I dzięki! –

+0

Może być wygodne użycie 'ax.clear()'; wtedy możesz po prostu wykreślić świeżą figurę i nie musisz rozróżniać pomiędzy pierwszym a późniejszym przebiegiem. Ponadto, 'plt.pause()' spowodował błąd dla mnie, użyłem 'fig.canvas.start_event_loop()' zamiast. – Scipio

Powiązane problemy