如何限制matplotlib的button_press_event仅响应单个坐标轴?
Matplotlib 坐标轴点击回调限制问题
以下是运行的脚本:
import matplotlib.pyplot as plt from matplotlib.widgets import Button def fAccept(_): print(f'accepted') def onclick(event): print(f'click {event.xdata, event.ydata}') fig, ax = plt.subplots() fig.subplots_adjust(bottom=0.2) fig.canvas.mpl_connect('button_press_event', onclick) axAccept = fig.add_axes([0.7, 0.05, 0.1, 0.075]) bAccept = Button(axAccept, 'Accept') bAccept.on_clicked(fAccept) plt.show()
运行后点击底部的Accept按钮时,onclick回调也会被触发。现在需要解决两个问题:
- 如何将
onclick回调限制为仅作用于上方的主坐标轴? - 如何区分
Accept按钮中心(绿色圆圈)的(0.5, 0.5)坐标与上方主坐标轴中心(红色圆圈)的(0.5, 0.5)坐标?
解决方案
方法一:限制onclick仅作用于主坐标轴
可以通过判断事件的inaxes属性是否为目标坐标轴来实现。如果点击的区域不在主坐标轴内,直接返回即可:
import matplotlib.pyplot as plt from matplotlib.widgets import Button def fAccept(_): print(f'accepted') def onclick(event): # 仅当点击在主坐标轴ax内时才执行逻辑 if event.inaxes != ax: return print(f'click {event.xdata, event.ydata}') fig, ax = plt.subplots() fig.subplots_adjust(bottom=0.2) fig.canvas.mpl_connect('button_press_event', onclick) axAccept = fig.add_axes([0.7, 0.05, 0.1, 0.075]) bAccept = Button(axAccept, 'Accept') bAccept.on_clicked(fAccept) plt.show()
这样点击Accept按钮时,onclick就不会被触发了——因为按钮所在的坐标轴是axAccept,不是主坐标轴ax。
方法二:区分不同区域的坐标
如果需要区分不同坐标轴内的相同数值坐标,同样可以通过事件的inaxes属性判断坐标所属的坐标轴:
import matplotlib.pyplot as plt from matplotlib.widgets import Button def fAccept(_): print(f'accepted') def onclick(event): if event.inaxes is None: print(f'click outside axes: {event.x, event.y}') elif event.inaxes == ax: print(f'click in main axis: {event.xdata, event.ydata}') elif event.inaxes == axAccept: print(f'click in button axis: {event.xdata, event.ydata}') fig, ax = plt.subplots() fig.subplots_adjust(bottom=0.2) fig.canvas.mpl_connect('button_press_event', onclick) axAccept = fig.add_axes([0.7, 0.05, 0.1, 0.075]) bAccept = Button(axAccept, 'Accept') bAccept.on_clicked(fAccept) plt.show()
这样即使两个区域的xdata和ydata数值相同,也能通过inaxes判断出点击的是主坐标轴还是按钮所在的坐标轴,从而区分开这两个位置。
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

