如何在matplotlib中的动画期间删除轮廓线

时间:2017-11-19 10:57:26

标签: python python-3.x animation matplotlib

我正在使用带有matplotlib 2.1.0的Python 3.6.3,我想要实现的是能够使用contour()函数删除在动画之前绘制的一些轮廓。 轮廓图需要在动画开始时可见,并且只有在用户按下某个键后才能删除。困难在于我需要使用blitting来制作动画。然而,blitting恢复原始画布,这样即使去除轮廓,它仍然在blitted背景中保持可见。

以下是显示问题的代码:

{{1}}

如果不可能去除轮廓,那么至少我应该能够使它看不见或透明,但我也找不到办法。请帮忙! :)

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