Python 如何向matplotlib工具栏上的用户定义按钮添加功能?

Python 如何向matplotlib工具栏上的用户定义按钮添加功能?,python,matplotlib,Python,Matplotlib,我有一个类,它使用给定的数据设置matplotlib图形,默认情况下它记录在绘图上的单击。它会记录每一次鼠标单击,因此缩放操作总是会添加一个新点。为了防止这种情况,我想在mpl工具栏上创建一个切换按钮,以启用和禁用单击录制。代码如下: 将numpy导入为np 导入matplotlib matplotlib.rcParams[“工具栏”]=“工具管理器” 将matplotlib.pyplot作为plt导入 从matplotlib.backend\u工具导入工具日志库 从matplotlib.bac

我有一个类,它使用给定的数据设置matplotlib图形,默认情况下它记录在绘图上的单击。它会记录每一次鼠标单击,因此缩放操作总是会添加一个新点。为了防止这种情况,我想在mpl工具栏上创建一个切换按钮,以启用和禁用单击录制。代码如下:

将numpy导入为np
导入matplotlib
matplotlib.rcParams[“工具栏”]=“工具管理器”
将matplotlib.pyplot作为plt导入
从matplotlib.backend\u工具导入工具日志库
从matplotlib.backend导入鼠标按钮
类EditPeak(对象):
定义初始值(self,x,y,x_extremal=None,y_extremal=None):
#设置情节
self.x=x
self.y=y
self.cid=无
self.figure=plt.figure()
赛尔夫出版社()
plt.plot(self.x,self.y,'r')
self.x_extremal=x_extremal
self.y_extremal=y_extremal
如果不是len(self.x_extremal)=len(self.y_extremal):
raise VALUERROR('数据形状不同')
self.lins=plt.plot(self.x_extremal,self.y_extremal,'ko',markersize=6,zorder=99)
plt.网格(α=0.7)
#添加按钮
tm=self.figure.canvas.manager.toolmanager
tm.add_工具(“切换录制”,选择按钮)
self.figure.canvas.manager.toolbar.add_工具(tm.get_工具(“切换录制”),“工具组”)
plt.show()
已单击的def(自身、事件):
“”“记录和放弃绘图上的点的函数。”“”
ix,iy=event.xdata,event.ydata
如果event.button为MouseButton.RIGHT:
ix,iy,idx=获取最近值(ix,self.x\u极值,self.y\u极值)
self.x_extremal=np.delete(self.x_extremal,idx)
self.y_extremal=np.delete(self.y_extremal,idx)
elif event.button是MouseButton.LEFT:
ix,iy,idx=获取最近的(ix,self.x,self.y)
self.x_extremal=np.append(self.x_extremal,ix)
self.y_extremal=np.append(self.y_extremal,iy)
其他:
通过
plt.cla()
plt.plot(self.x,self.y,'r')
self.lins=plt.plot(self.x_extremal,self.y_extremal,'ko',markersize=6,zorder=99)
plt.网格(α=0.7)
plt.draw()
返回
def压力(自):
self.cid=self.figure.canvas.mpl\u connect('button\u press\u event',self.on\u clicked')
def释放(自):
self.figure.canvas.mpl\u断开连接(self.cid)
最接近的位置如下所示:

def get_closest(x_值、x_数组、y_数组):
“”“查找图形中距离给定x_值最近的点,其中距离为
相对于x测量。
"""
idx=(np.abs(x_数组-x_值)).argmin()
value=x_数组[idx]
返回值,y_数组[idx],idx
这是工具栏上的按钮

class SelectButton(工具日志库):
默认值_toggled=True
定义初始化(self,*args,**kwargs):
super()
def启用(自身、事件):
通过
def禁用(自身、事件):
通过
我想在触发功能时激活它,否则禁用。我的问题是启用和禁用函数是在EditPeak类中定义的,我无法将它们链接到SelectButton类

您可以尝试的最简单的方法(即使它对随机值没有实际意义):

x=np.随机.正常(0,1100)
y=np.随机.正常(0,1100)
编辑峰值(x,y,x[:2],y[:2])
左键单击将向给定图形中最接近的x值添加一个新点,右键单击将删除最接近的x值

我的目标是在切换按钮打开时调用EditPeak.press,否则调用EditPeak.release。 欢迎对代码(包括样式、结构)进行任何改进。

紧接着:

tm.add_tool('Toggle recording', SelectButton)
您可以执行以下操作:

self.my_select_button = tm.get_tool('Toggle recording')

现在,
EditPeak
实例引用了可在
EditPeak中使用的
add\u工具创建的
SelectButton
实例。(其余部分留给读者作为练习:-)

添加
if self.my_select_按钮。单击时将
条件切换为
,方法实际上实现了我想要的功能。非常感谢。(我写下答案只是为了帮助其他人,以防他们想看到解决方案。)