【发布时间】:2019-02-20 14:26:19
【问题描述】:
在使用 blitting 时,我发现 matplotlib 中的 FuncAnimation 存在一个奇怪的问题。下面的代码是一个最小的工作示例,它沿着正弦线移动一个点。问题在于,在交互式缩放/平移操作之后,轴会重新绘制,但线图仍保持在屏幕上的原始位置。似乎由于某种原因,缩放/平移不会触发块的新初始化。我正在使用带有 matplotlib 3.0.2 的 Qt5Agg 后端,但 TkAgg 后端也存在问题。一种可能的解决方法是使函数更新也返回线图。然而,这以某种方式挫败了 blitting 的想法。您知道解决此问题的更好方法吗?
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation
t = np.linspace(0, 10, 100)
y = np.sin(t)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(t, y)
point, = ax.plot(0, 0, 'o')
def update(i):
point.set_data([t[i], y[i]])
return point,
ani = mpl.animation.FuncAnimation(fig, update, frames=t.size, blit=True)
plt.tight_layout()
plt.show()
【问题讨论】:
-
如果你也想blit line,使用
return line, point。 -
是的,当然,但关键是在每次更新期间不应该重绘该行。线条是静态的,不应设置动画。
-
画线对于画所有东西来说是小菜一碟,所以它仍然比不使用 blitting 快得多。
-
是的,在查看给定的最小工作示例时,您是完全正确的。但是,如果静态部分包含的不仅仅是一条线图,情况就完全不同了。考虑一个例子,你有一个静态的箭袋图,它可以可视化一些场和几个移动的点。在这种情况下,您的解决方案几乎会完全破坏 blitting 的好处。
-
这肯定不是最优的,但仍然快得多。
标签: python matplotlib