Matplotlib:通过鼠标单击在图形上查找区域

Matplotlib: Find a region on a graph by mouse click

假设我有一个绘制正弦和余弦函数的程序。 我希望能够 select 由图形创建的子区间或区域,例如 π/4 < x < 5π/4 或 -3π/4 < x < π/4。

所以如果我有这个:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.axes(xlim=(-10, 10), ylim=(-10, 10))
ax.set_aspect("equal")

x = np.array((np.linspace(-10,10,500)))
y = np.sin(x)

plt.plot(x,y)

y2 = np.cos(x)

plt.plot(x,y2)

plt.show()

我已经能够打印鼠标点击的坐标,但至于比这更远,我被卡住了。

def onclick(event):
    print('x=%f, y=%f'%(event.xdata, event.ydata))


fig.canvas.mpl_connect('button_press_event', onclick)

我会怎样: 1.存储鼠标点击的点 2. 查看点在什么区间

感谢任何帮助。

有一些内置工具可提供阻止鼠标输入的功能(请参阅 plt.ginput)。

另一种选择是自己动手。最简单的方法是制作一个助手 class 来存储点击的值:

class ClickKeeper(object):
    def __init__(self):
        self.last_point = None
    def on_click(self, event):
        self.last_point = (event.xdata, event.ydata)

ck = ClickKeeper()
fig.canvas.mpl_connect('button_press_event', ck.onclick)

另一个选项(如果您嵌入大型 GUI 应用程序是连接 GUI 的回调堆栈。

参见 matplotlib.widgets (doc) and (examples) for some fancy built in tools, the image_inspector project (which despite the name as generally useful gui tools), mpldatacursor, and the book Interactive Applications in matplotlib(由核心开发人员之一撰写)。