我从this other answer中的代码开始,并对它的一部分进行了修改,以便在将鼠标悬停在图的中心时始终显示标签:
...
annot = ax.annotate("", xy=(0,0), xytext=(0,0),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
xmid = np.mean(ax.get_xlim())
ymid = np.mean(ax.get_ylim())
offset = 20
def update_annot(ind):
pos = sc.get_offsets()[ind["ind"][0]]
annot.xy = pos
annot.xytext = (-offset if pos[0] > xmid else offset,
-offset if pos[1] > ymid else offset)
text = " {}, {} ".format(" ".join(list(map(str,ind["ind"]))),
" ".join([names[n] for n in ind["ind"]]))
annot.set_text(text)
annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
annot.get_bbox_patch().set_alpha(0.4)
annot.set_ha("right" if pos[0] > xmid else "left")
annot.set_va("top" if pos[1] > ymid else "bottom")
...
产生以下输出:
以及另外两个示例here和here。这不是预期的输出。箭头的方向正确,文本接近所需的方向,但是它与数据点对齐,而不是与箭头的末端对齐。
我期望得到的是在调用ax.annotate
时使用相同的参数(无需交互修改批注)所实现的结果,这是以下行为:
答案 0 :(得分:0)
更仔细地阅读文档后,发现与xy
不同,xytext
不是Annotation
对象的属性。因此,该行
annot.xytext = (-offset if pos[0] > xmid else offset,
-offset if pos[1] > ymid else offset)
实际上是在创建一个无用的属性。因此,未从原始(0,0)
偏移量修改文本位置。要实际修改文本位置,必须使用set_position()
:
annot.set_position((-offset if pos[0] > xmid else offset,
-offset if pos[1] > ymid else offset))
尽管我已经解决了问题,但我还是决定发布问题,因为我发现这很违反直觉并且有点混乱。 annot.xy
修改作为箭头位置头的xy
自变量,而annot.set_position
修改作为箭头端的xytext
自变量。此外,即使xytext
已使用从Text实例方法set_position
继承的方法进行了修改,也将以textcoords
定义的单位进行解释(即使在这种情况下,{{1} }单元与Text实例不兼容。