2012-06-05 21 views
6

Soy nuevo en matplotlib. Tengo una lista de coordenadas x-y que actualizo en python y quiero animar usando la pepplot de matplotlib. Quiero especificar el rango xy el rango y de antemano. A continuación se muestra el código actual:Animación simple de coordenadas 2D usando matplotlib y 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() 

Como se puede ver, yo uso plt.plot() y plt.show()al final de mi iteración del bucle para trazar solamente las coordenadas finales. Pero quiero poner este paso dentro del ciclo y trazar en cada iteración con un tiempo de pausa especificado para que tenga una animación mientras se ejecuta el ciclo.

Simplemente moviendo esa declaración dentro del ciclo o ajustes por ahí no están funcionando. Quiero que sea muy simple, sin embargo, y no quiero usar matplotlib.animation. ¿Hay algún método simple sin usar muchos más módulos y bibliotecas (solo cosas como plt.pause() y quizás solo un poco más) que me permitan hacer lo que quiero?

Miré en muchos lugares en línea, y el problema que tengo con la mayoría de los métodos es que estoy usando Python (x, y) (es la versión de Python 2.7) en Windows para esto y animaciones usando módulos y bibliotecas demasiado complicados están fallando aquí.

Sin embargo, puedo ejecutar cosas simples como this example en el sitio matplotlib, que está cerca de lo que quiero, pero no del todo. Entonces, quizás lo mejor será una modificación de este ejemplo que funcione para mi caso de datos 2D (ese ejemplo es para una fila 1D). Pero cualquier otra sugerencia es bienvenida.

Respuesta

8

Esta es una adaptación de la 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) 

Si bien esto es simple la cadena de documentación decir que es lento.

+0

+1. Esto funciona. Intentaré adaptarlo a mi programa final y veré cómo funciona. –

+0

Eso funcionó muy bien con mi programa. Aceptado. ¡Y gracias! –

+0

Puede ser conveniente usar 'ax.clear()'; entonces simplemente puede trazar una figura nueva y no necesita distinguir entre las ejecuciones primera y posterior. Además, 'plt.pause()' causó un error para mí, usé 'fig.canvas.start_event_loop()' en su lugar. – Scipio

Cuestiones relacionadas