在下面的这段代码中,我正在模拟一个当前正在处理的问题,并且我已经尝试了一段时间了(我正在练习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()


有任何想法吗?谢谢。

最佳答案

您需要将event.xdatapick函数内部的“磁铁” 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()

08-19 21:13