Aquí hay un ejemplo rápido usando el nuevo módulo de animación.
Es un poco más complejo de lo que debe ser, pero esto debería darle un marco para hacer cosas más elegantes.
Si estás en OSX y usando el backend OSX, tendrá que cambiar blit=True
a blit=False
en el FuncAnimation
inicialización a continuación. El backend de OSX no admite completamente Blitting. El rendimiento sufrirá, pero el ejemplo debería ejecutarse correctamente en OSX con Blitting desactivado.
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
class AnimatedScatter(object):
"""An animated scatter plot using matplotlib.animations.FuncAnimation."""
def __init__(self, numpoints=50):
self.numpoints = numpoints
self.stream = self.data_stream()
# Setup the figure and axes...
self.fig, self.ax = plt.subplots()
# Then setup FuncAnimation.
self.ani = animation.FuncAnimation(self.fig, self.update, interval=5,
init_func=self.setup_plot, blit=True)
def setup_plot(self):
"""Initial drawing of the scatter plot."""
x, y, s, c = next(self.stream)
self.scat = self.ax.scatter(x, y, c=c, s=s, animated=True)
self.ax.axis([-10, 10, -10, 10])
# For FuncAnimation's sake, we need to return the artist we'll be using
# Note that it expects a sequence of artists, thus the trailing comma.
return self.scat,
def data_stream(self):
"""Generate a random walk (brownian motion). Data is scaled to produce
a soft "flickering" effect."""
data = np.random.random((4, self.numpoints))
xy = data[:2, :]
s, c = data[2:, :]
xy -= 0.5
xy *= 10
while True:
xy += 0.03 * (np.random.random((2, self.numpoints)) - 0.5)
s += 0.05 * (np.random.random(self.numpoints) - 0.5)
c += 0.02 * (np.random.random(self.numpoints) - 0.5)
yield data
def update(self, i):
"""Update the scatter plot."""
data = next(self.stream)
# Set x and y data...
self.scat.set_offsets(data[:2, :])
# Set sizes...
self.scat._sizes = 300 * abs(data[2])**1.5 + 100
# Set colors..
self.scat.set_array(data[3])
# We need to return the updated artist for FuncAnimation to draw..
# Note that it expects a sequence of artists, thus the trailing comma.
return self.scat,
def show(self):
plt.show()
if __name__ == '__main__':
a = AnimatedScatter()
a.show()
Para un ejemplo más simple, echar un vistazo a lo siguiente:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
def main():
numframes = 100
numpoints = 10
color_data = np.random.random((numframes, numpoints))
x, y, c = np.random.random((3, numpoints))
fig = plt.figure()
scat = plt.scatter(x, y, c=c, s=100)
ani = animation.FuncAnimation(fig, update_plot, frames=xrange(numframes),
fargs=(color_data, scat))
plt.show()
def update_plot(i, data, scat):
scat.set_array(data[i])
return scat,
main()
Hola Joe He intentado con tu primer ejemplo pero no funciona, mientras que el segundo sí. Tal vez intente depurar la primera opción, esto me ayudará a mejorar mi conocimiento de Python. Gracias –
El primer ejemplo funciona perfectamente (excepto para el manejo del tamaño) en la distribución de Enthought (Win7, matplotlib 1.2.0, numpy 1.4.). Código impresionante, Joe! Pude verlo durante horas :-). – Dave
Desafortunadamente, el primer ejemplo no se muestra para mí, ya sea usando matplotlib 1.3.1 en OS X. Obtengo que el recuadro no muestra ningún punto. El segundo ejemplo funciona – JoshAdel