You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:03:15