首页 >后端开发 >Python教程 >如何向 Matplotlib 散点图添加悬停注释?

如何向 Matplotlib 散点图添加悬停注释?

Barbara Streisand
Barbara Streisand原创
2024-12-23 05:41:18946浏览

How to Add Hovering Annotations to Matplotlib Scatter Plots?

如何在图中创建悬停注释

分析具有大量数据点的散点图时,识别特定的兴趣点可能具有挑战性。一种方便的解决方案是实现悬停注释,在光标移动时显示附加信息。

matplotlib 库提供了向绘图添加注释的多功能功能。要创建悬停注释,我们可以利用 annotate 和 update_annot 函数。 annotate 函数将注释定位在指定坐标处,而 update_annot 根据悬停数据点的索引修改其文本和外观。

要实现悬停注释,请按照以下步骤操作:

  1. 导入所需的库并生成数据。
  2. 创建散点图和不可见注释对象。
  3. 定义 update_annot 函数,根据悬停点的索引更新注释的文本和外观。
  4. 实现悬停函数,根据光标移动控制注释的可见性。
  5. 将motion_notify_event连接到hover函数。

通过实现这个方法,您可以轻松地向散点图添加悬停注释,提供对特定数据点的有价值的见解,而不会使绘图变得混乱。

示例:

提供的代码片段演示散点图上悬停注释的实现:

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

x = np.random.rand(15)
y = np.random.rand(15)
names = np.array(list("ABCDEFGHIJKLMNO"))
c = np.random.randint(1,5,size=15)

norm = plt.Normalize(1,4)
cmap = plt.cm.RdYlGn

fig,ax = plt.subplots()
sc = plt.scatter(x,y,c=c, s=100, cmap=cmap, norm=norm)

annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
                    bbox=dict(boxstyle="round", fc="w"),
                    arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)

def update_annot(ind):

    pos = sc.get_offsets()[ind["ind"][0]]
    annot.xy = pos
    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)


def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = sc.contains(event)
        if cont:
            update_annot(ind)
            annot.set_visible(True)
            fig.canvas.draw_idle()
        else:
            if vis:
                annot.set_visible(False)
                fig.canvas.draw_idle()

fig.canvas.mpl_connect("motion_notify_event", hover)

plt.show()

以上是如何向 Matplotlib 散点图添加悬停注释?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn