我正在使用带有matplotlib 2.1.0的Python 3.6.3,我想要实现的是能够使用contour()函数删除在动画之前绘制的一些轮廓。 轮廓图需要在动画开始时可见,并且只有在用户按下某个键后才能删除。困难在于我需要使用blitting来制作动画。然而,blitting恢复原始画布,这样即使去除轮廓,它仍然在blitted背景中保持可见。
以下是显示问题的代码:
{{1}}
如果不可能去除轮廓,那么至少我应该能够使它看不见或透明,但我也找不到办法。请帮忙! :)
答案 0 :(得分:1)
在使用blit=True
的动画期间,不容易在画布中更改任何内容(整个blitting点是背景不会改变)。虽然不使用blit,但删除线条或将其设置为不可见应该没有任何问题,blitting将始终恢复原始画布背景,即使某些艺术家已被删除。
我们需要做的是在删除艺术家后中断动画,重绘画布,拍摄背景的新快照并使用新背景重新开始动画。虽然这本身就相当麻烦,但可能的解决方案是模仿画布的resize事件,这将触发完全描述的过程。这在以下代码中完成。
(请注意,这适用于Qt
后端,而使用Tk
时会出现一些问题,至少在matplotlib的2.1版本中会出现问题。)
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from numpy import mgrid, sin, cos, pi
phi = pi/2.
def keypress(event):
if event.key == "delete":
try:
for c in cs.collections:
c.remove()
except ValueError:
pass
ani._handle_resize()
ani._end_redraw(None)
def animate(i):
global phi
line.set_data([[0.0, sin(phi)], [0.0, cos(phi)]])
phi += 0.01
return line,
x,p = mgrid[-2:2:100*1j,-2:2:100*1j]
fig,ax = plt.subplots(1, 1, figsize=(8,6), dpi=100)
ax.set_xlim([-2,2])
ax.set_ylim([-2,2])
line, = ax.plot([], [], 'o-', lw=2, color='b')
cs = ax.contour(x, p, x**2 + p**2, levels=2, linewidths=2, colors='r')
fig.canvas.mpl_connect('key_press_event', keypress)
ani = animation.FuncAnimation(fig, animate,
blit=True, interval=1, frames=2000)
plt.show()