已为我提供了在给定绘图上绘制多条线的现有代码。该代码很长,所以我只发布我编写的代码,希望已经足够。我编写的代码是基于在这里找到的代码构建的:Possible to make labels appear when hovering over a point in matplotlib?
问题是它只会在多行打印在图形上的最后一行上打印注释(我也打印出一个图例,它是该图例列表中的最后一个)。
我放置了一些打印语句,您可以在下面的代码中看到这些语句。在条件hit
下,我将标签打印到控制台,并且随着行与行之间的变化而变化,并且在控制台中可以正常工作。接下来,您会注意到我调用了update_annot
函数。在此函数内部,我打印出另一条语句,以验证我是否在函数中。控制台显示,实际上,每当我将鼠标悬停在一行上时,它都会输入该功能。但是,注释框不会显示,只有一行。下面是我的代码。第一个代码段使用现有函数plotData
进行调用。
annot = ax.annotate("", xy=(-20,20), xytext=(None),textcoords="offset
points",
bbox=dict(fc="b"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(True)
h = lambda x: self.hover(x, ax, annot)
fig.canvas.mpl_connect("motion_notify_event", h)
def update_annot(self, annot, label, ind, x, y):
print ("Entered update annot")
annot.xy = (x[ind["ind"][0]], y[ind["ind"][0]])
annot.set_text(label)
annot.get_bbox_patch().set_alpha(0.4)
#end of update_annot
def hover(self, event, ax, annot):
#if event.inaxes == ax:
for curve in ax.get_lines():
label = curve.get_label()
x,y = curve.get_data()
hit, ind = curve.contains(event)
if hit:
print(label)
self.update_annot(annot, label, ind, x, y)
annot.set_visible(True)
plt.draw()
else:
annot.set_visible(False)
plt.draw()
我希望每行都显示注释框;但相反,它仅显示在已打印的一行上。这使我感到困惑,因为它每次输入条件hit
时都会在控制台上正确打印标签,并且每次都输入更新功能。我真的是Python的新手,所以如果我的代码中有任何建议(即使是在问题之外),我也希望能听到。另外,正如我指出的,我是在这里找到的代码的基础上构建的。我仍然不确定annot.xy
的作用,因为在定义xy
时已经定义了annot
。先感谢您。