【发布时间】:2017-11-19 10:57:26
【问题描述】:
我将 Python 3.6.3 与 matplotlib 2.1.0 一起使用,我想要实现的是能够删除一些在动画之前使用 contour() 函数绘制的轮廓。 等高线图需要在动画开始时可见,并且只有在用户按下某个键后才能删除。困难在于我需要对动画使用 blitting。然而,blitting 会恢复原始画布,因此即使移除轮廓,它仍然在 blitted 背景中保持可见。
这是显示问题的代码:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from numpy import mgrid, sin, cos, pi
def keypress(event):
if event.key == "delete":
for c in cs.collections: c.remove() # this doesn't work
cs.set_alpha(0.0) # this doesn't work either
phi = pi/2
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=(19.2,10.8), 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=0.8, colors='r')
fig.canvas.mpl_connect('key_press_event', keypress)
ani = animation.FuncAnimation(fig, animate, blit=True, interval=0, frames=2000)
plt.show()
如果无法删除轮廓,那么至少我应该能够使其不可见或透明,但我也找不到这样做的方法。请帮忙! :)
【问题讨论】:
-
清洁循环后调用 plt.draw()
-
我试过了,但不幸的是,它所做的只是应该消失的曲线“闪烁”,即它闪烁 --- 瞬间消失,然后再次出现,颜色完全相同因为它最初是绘制的。我假设你的意思是这样做:for c in p.cs.collections: c.remove() plt.draw()
-
如果您的代码太大而不能成为问题的一部分。那么,代码对于问题来说太大了,因此不是问题的minimal reproducible example。如果您在从画布中删除艺术家时遇到问题,我相信您只需花费 20 行代码即可重现此内容,以便人们能够提供帮助。
-
好的,我已经编辑了这个问题,包括一个只有 26 行代码的小测试用例。
标签: python python-3.x animation matplotlib