在Matplotlib动画中更新X轴标签

时间:2018-09-07 09:02:26

标签: python animation matplotlib

这是一段说明我问题的玩具代码:

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()

如果我设置了blit=True,则将按照我想要的方式绘制数据点。但是,x轴标签/标记保持不变。

如果我设置了blit=False,则x轴标签和刻度将更新我想要的标签。但是,从未绘制过任何数据点。

如何获取绘制的数据(正弦曲线)和和x-asis数据的更新?

1 个答案:

答案 0 :(得分:4)

首先涉及到笔划:笔划仅应用于轴的内容。它将影响轴的内部,但不影响外部轴的装饰器。因此,如果使用blit=True,则不会更新轴装饰器。或反之,如果要缩放比例,则需要使用blit=False

现在,在出现问题的情况下,这导致未绘制线条。原因是该行的animated属性设置为True。但是,默认情况下不会绘制“动画”艺术家。该属性实际上是用于发条。但是如果不执行blitting,则将导致艺术家既不被绘画也不被blit。最好将此属性称为blit_include或类似的名称,以免混淆其名称。
不幸的是,它看起来也没有充分的文献记载。但是,您在source code中发现一条评论

# 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

因此,总的来说,除非您使用blitting,否则可以忽略此参数的存在。即使使用blitting,在大多数情况下也可以将其忽略,因为该属性始终在内部设置。

总结这里的解决方案是不使用animated并且不使用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()