Actualización de las tags del eje x en la animación matplotlib

Aquí hay un código de juguete que ilustra mi problema:

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() xdata, ydata = [], [] ln, = plt.plot([], [], '-o', animated=True) def init(): ax.set_xlim(0, 2*np.pi) ax.set_ylim(-1, 1) return ln, def update(frame): xdata.append(frame) ydata.append(np.sin(frame)) ln.set_data(xdata, ydata) ax.set_xlim(np.amin(xdata), np.amax(xdata)) return ln, ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128), init_func=init, blit=True) plt.show() 

Si configuro blit=True , los puntos de datos se representan exactamente como los quiero. Sin embargo, las tags / marcas del eje x permanecen estáticas.

Si configuro blit=False , las tags y marcas del eje x se actualizan exactamente como las quiero. Sin embargo, ninguno de los puntos de datos se traza nunca.

¿Cómo puedo obtener los datos trazados (curva sinusoidal) y los datos de x-asis para actualizar “?

En primer lugar en lo que respecta a blitting: Blitting solo se aplica al contenido de los ejes. Afectará la parte interna de los ejes, pero no los decoradores de los ejes externos. Por lo tanto, si usar blit=True los decoradores de ejes no se actualizan. O, a la inversa, si desea que la escala se actualice, debe usar blit=False .

Ahora, en el caso de la pregunta, esto lleva a que la línea no se dibuje. La razón es que la línea tiene su atributo animated establecido en True . Sin embargo, los artistas “animados” no se dibujan por defecto. Esta propiedad está destinada a ser utilizada para blitear; pero si no se realiza ninguna operación de blit, el artista no se dibujará ni se borrará. Podría haber sido una buena idea llamar a esta propiedad blit_include o algo similar para evitar la confusión de su nombre.
Desafortunadamente, parece que tampoco está bien documentado. Usted encuentra sin embargo un comentario en el código fuente diciendo

 # if the artist is animated it does not take normal part in the # draw stack and is not expected to be drawn as part of the normal # draw loop (when not saving) so do not propagate this change 

Entonces, en total, uno puede ignorar la presencia de este argumento, a menos que use blitting. Incluso cuando se usa bliting, puede ignorarse en la mayoría de los casos , porque esa propiedad se establece internamente de todos modos.

Para concluir, la solución aquí es no usar animated y no usar blit .

 import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() xdata, ydata = [], [] ln, = plt.plot([], [], '-o') def init(): ax.set_xlim(0, 2*np.pi) ax.set_ylim(-1, 1) def update(frame): xdata.append(frame) ydata.append(np.sin(frame)) ln.set_data(xdata, ydata) ax.set_xlim(np.amin(xdata), np.amax(xdata)) ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128), init_func=init) plt.show()