You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib循环绘制散点图时,如何实现每个点的专属悬停提示框?

问题解决:Matplotlib散点图每个点的专属悬停提示

错误原因

你的代码在循环中每次创建新的scatter对象,变量scatter最终只指向最后一个散点实例,导致悬停检测仅对最后一个点生效。

解决方案

一次性绘制所有散点,让单个scatter对象包含所有数据点,这样contains方法能检测到所有点;同时利用索引获取每个点的专属编号:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# 准备所有点的数据,一次性绘制
x = range(1, 51)
y = range(1, 51)
scatter = ax.scatter(x, y)

annot = ax.annotate("", xy=(0,0), xytext=(10,10), textcoords="offset points",
                    bbox=dict(boxstyle="round", fc="white"))
annot.set_visible(False)

def update_annot(ind):
    # 获取选中点的位置
    pos = scatter.get_offsets()[ind["ind"][0]]
    annot.xy = pos
    # 根据索引生成专属编号(索引从0开始,加1得到1-50的编号)
    point_index = ind["ind"][0]
    text = f"编号: {point_index + 1}"
    annot.set_text(text)

def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        # 检测鼠标是否在散点集合上
        cont, ind = scatter.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()

关键改动说明

  • 取消循环创建单个散点,改用一次性绘制所有点,确保scatter对象包含全部数据
  • 在update_annot中通过ind["ind"][0]获取当前悬停点的索引,计算得到对应的1-50编号
  • 保留原有的悬停事件逻辑,现在能正确识别所有散点

内容的提问来源于stack exchange,提问作者Bast38

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:52:34