我想编写一个代码,其中只有在我单击matplotlib按钮小部件之后,matplotlib中的动画功能才开始绘制。这是我的步骤:
我已经成功地存储了x和y坐标,但是按下按钮并没有给我所需的动画图。这是我面临的第一个错误。
第二个错误是我的点击事件还存储了我按下按钮的位置的坐标。我不希望在按下按钮期间出现坐标。我只是空图上的坐标。
from matplotlib.widgets import Button
from matplotlib.animation import FuncAnimation
x_coord,y_coord = [],[]
fig = plt.figure()
axis = fig.add_subplot(111,xlim=(-5,15),ylim=(-5,15))
line, = axis.plot([],[],lw=3)
def init():
line.set_data([],[])
return line,
def animate(i):
x_points = [0,x_coord[i]]
y_points = [0,y_coord[i]]
line.set_data(x_points,y_points)
return line,
def onclick(event):
print(event.xdata,event.ydata)
x_coord.append(event.xdata)
y_coord.append(event.ydata)
def buttonPress(pressevent):
print('pressed')
print(x_coord)
ani = FuncAnimation(fig,animate,init_func=init,frames=len(x_coord),interval=100,blit=False)
cid = fig.canvas.mpl_connect('button_press_event',onclick)
axprev = plt.axes([0.5,0,0.1,0.1])
button = Button(axprev,'press')
button.on_clicked(buttonPress)
plt.show()```
第二个错误很容易解决,您可以使用以下命令测试点击是否在轴区域内 event.inaxes
动画问题是由于您正在函数中创建动画对象,并且在函数末尾立即对其进行垃圾回收。[FuncAnimation][2]
状态文档:
保留对实例对象的引用至关重要。动画由计时器(通常来自主机GUI框架)推进,该动画对象持有唯一的引用。如果不保留对Animation对象的引用,则将对其进行垃圾回收(并因此对计时器进行引用),这将停止动画。
解决该问题的一种方法是将动画对象保留在全局变量中。一种更干净的方法是将代码封装在自定义类中,并将动画存储为该类的属性。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.widgets import Button
x_coord, y_coord = [], []
fig = plt.figure()
axis = fig.add_subplot(111, xlim=(-5, 15), ylim=(-5, 15))
line, = axis.plot([], [], lw=3)
ani = None
def init():
line.set_data([], [])
return line,
def animate(i):
x_points = [0, x_coord[i]]
y_points = [0, y_coord[i]]
line.set_data(x_points, y_points)
return line,
def onclick(event):
if event.inaxes is axis:
print(event.xdata, event.ydata)
x_coord.append(event.xdata)
y_coord.append(event.ydata)
def buttonPress(pressevent):
global ani
print('pressed')
print(x_coord)
ani = FuncAnimation(fig, animate, init_func=init, frames=len(x_coord), interval=100, blit=False)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
axprev = plt.axes([0.5, 0, 0.1, 0.1])
button = Button(axprev, 'press')
button.on_clicked(buttonPress)
plt.show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句