首页 > 后端开发 > Python教程 > 如何在 Matplotlib 中为散点图创建悬停注释?

如何在 Matplotlib 中为散点图创建悬停注释?

DDD
发布: 2024-12-14 08:46:10
原创
324 人浏览过

How to Create Hovering Annotations for Scatter Plots in Matplotlib?

如何向绘图添加悬停注释

在散点图上注释点是处理数据时的一项常见任务。 Matplotlib 是一个用于创建 2D 绘图的 Python 库,它提供了一种使用 annotate 命令向绘图添加固定注释的简单方法。然而,在处理大量数据点时,这种方法可能变得不切实际,因为绘图可能会变得混乱。

幸运的是,有一种解决方案涉及创建仅当光标悬停在特定数据点上时才出现的动态注释。此方法需要对注释函数进行轻微修改,并结合回调函数来处理光标事件。

这是演示实现的示例代码:

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()
登录后复制

此代码添加了一个工具提示,当鼠标悬停在数据点上时出现,显示其坐标和名称。 update_annot 函数根据悬停点动态更新注释的位置和内容。

这种方法可以实现整洁的可视化,并且可以轻松访问有关每个数据点的信息,使其适合交互式数据探索。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板