注释仅适用于绘制的最后一行

时间:2018-12-19 18:48:34

标签: python matplotlib

已为我提供了在给定绘图上绘制多条线的现有代码。该代码很长,所以我只发布我编写的代码,希望已经足够。我编写的代码是基于在这里找到的代码构建的: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。先感谢您。

0 个答案:

没有答案