在x值之间发生单击时,在固定的x值上绘制hlines

时间:2015-06-02 06:39:42

标签: python events python-3.x matplotlib plot

在下面的这段代码中,我模拟了我目前正在处理的问题,而且我已经试图弄清楚它已经有一段时间了(我在练习顺便说一下matplotlib。

它应该做的是:当我点击地图上的某个地方时,应该在最近的垂直线上创建一条小的水平红线,这意味着水平线应该只在固定的x上绘制值(在这种情况下,x值是垂直线的x值)。 y值无关紧要,因为我希望水平线绘制在任何y值上。

换句话说:垂直线应该像水平线的磁铁一样。最接近咔嗒声的垂直线应拉动水平线。

我相信event.xdata是关键所在,但我无法找到解决方案。

import matplotlib.pyplot as plt

fig = plt.figure()
for i in range(24):
    plt.axvline(i/50)
plt.xlim(0,1)
plt.ylim(0,1)

def pick(event):
    if event.xdata # ???
        plt.ion()
        plt.hlines(event.ydata,event.xdata-0.01,event.xdata+0.01,colors='r',linestyle='solid')
    else:
        pass

fig.canvas.mpl_connect('button_press_event',pick)
plt.show()

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

您需要将event.xdata与您的"磁铁"进行比较pick函数内的x值,您现在还没有这样做。

您可以从给定值列表中获取最接近的值,如下所示:

nearestMagnetValue = min(magnetValues, key=lambda x: abs(event.xdata - x))

所以把它放在你的代码中,就像这样:

import matplotlib.pyplot as plt
fig = plt.figure()

magnetValues = [i/50 for i in range(24)]
for i in magnetValues:
    plt.axvline(i)

plt.xlim(0,1)
plt.ylim(0,1)

def pick(event):
    if event.xdata: # ???
        nearestMagnetValue = min(magnetValues, key=lambda x: abs(event.xdata - x))
        plt.ion()
        plt.hlines(event.ydata,nearestMagnetValue-0.01,nearestMagnetValue+0.01,colors='r',linestyle='solid')
    else:
        pass

fig.canvas.mpl_connect('button_press_event',pick)
plt.show()