Suponga que tiene un diagrama de dispersión scat = ax.scatter(...)
, entonces puede
cambiar las posiciones
scat.set_offsets(array)
donde array
es una N x 2
matriz con forma de coordenadas xey.
cambiar los tamaños
scat.set_sizes(array)
donde array
es una matriz 1D de tamaños en puntos.
cambiar el color
scat.set_array(array)
donde array
es una matriz 1D de valores que se mapearán en color.
Aquí hay un ejemplo rápido usando el módulo de animación .
Es un poco más complejo de lo que debería ser, pero esto debería darte un marco para hacer cosas más elegantes.
(Código editado en abril de 2019 para que sea compatible con las versiones actuales. Para el código anterior, consulte el historial de revisiones )
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()
self.fig, self.ax = plt.subplots()
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).T
self.scat = self.ax.scatter(x, y, c=c, s=s, vmin=0, vmax=1,
cmap="jet", edgecolor="k")
self.ax.axis([-10, 10, -10, 10])
return self.scat,
def data_stream(self):
"""Generate a random walk (brownian motion). Data is scaled to produce
a soft "flickering" effect."""
xy = (np.random.random((self.numpoints, 2))-0.5)*10
s, c = np.random.random((self.numpoints, 2)).T
while True:
xy += 0.03 * (np.random.random((self.numpoints, 2)) - 0.5)
s += 0.05 * (np.random.random(self.numpoints) - 0.5)
c += 0.02 * (np.random.random(self.numpoints) - 0.5)
yield np.c_[xy[:,0], xy[:,1], s, c]
def update(self, i):
"""Update the scatter plot."""
data = next(self.stream)
self.scat.set_offsets(data[:, :2])
self.scat.set_sizes(300 * abs(data[:, 2])**1.5 + 100)
self.scat.set_array(data[:, 3])
return self.scat,
if __name__ == '__main__':
a = AnimatedScatter()
plt.show()
Si está en OSX y usa el backend de OSX, deberá cambiar blit=True
a blit=False
en la FuncAnimation
inicialización a continuación. El backend de OSX no es totalmente compatible con blitting. El rendimiento se verá afectado, pero el ejemplo debería ejecutarse correctamente en OSX con blitting desactivado.
Para ver un ejemplo más simple, que solo actualiza los colores, eche 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=range(numframes),
fargs=(color_data, scat))
plt.show()
def update_plot(i, data, scat):
scat.set_array(data[i])
return scat,
main()