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