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

如何在Matplotlib中检测图例鼠标悬停并显示Tooltip?

实现图例悬停Tooltip的方法

当然可以实现这个需求!问题的核心是你把图例放在了坐标轴区域外,默认的鼠标事件不会自动识别图例元素的位置,所以我们需要手动获取图例条目的边界信息,在鼠标悬停事件里判断位置,进而控制Tooltip的显示和隐藏。

下面是修改后的完整代码,我会在关键部分做注释说明:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib
print("matplotlib.__version__ {}".format(matplotlib.__version__))
import matplotlib.pyplot as plt
import numpy as np

def onhover(event, fig, axes, leg_handles, leg_texts, tooltip):
    # 先隐藏之前的tooltip
    tooltip.set_visible(False)
    
    # 遍历每个图例条目(图标+文本)
    for handle, text in zip(leg_handles, leg_texts):
        # 获取当前条目在屏幕上的边界框
        bbox = handle.get_window_extent()
        # 同时也要包含文本区域,所以合并图标和文本的bbox
        text_bbox = text.get_window_extent()
        combined_bbox = bbox.union(text_bbox)
        
        # 判断鼠标是否在当前图例条目的区域内
        if combined_bbox.contains(event.x, event.y):
            # 设置tooltip的内容,这里可以自定义文本
            tooltip_text = f"图例标签: {text.get_text()}\n额外信息: 这是自定义的提示内容"
            tooltip.set_text(tooltip_text)
            # 将tooltip定位在鼠标位置附近
            tooltip.xy = (event.xdata, event.ydata)
            # 显示tooltip
            tooltip.set_visible(True)
            # 刷新画布
            fig.canvas.draw_idle()
            return
    # 没有命中任何图例条目,刷新画布确保tooltip隐藏
    fig.canvas.draw_idle()

def main():
    xdata = np.arange(0, 101, 1) # 0 to 100, both included
    ydata1 = np.sin(0.01*xdata*np.pi/2)
    fig, ax1 = plt.subplots(1, 1, figsize=(9, 6), dpi=120)
    fig.subplots_adjust(hspace=0)
    pl11, = ax1.plot(xdata, ydata1, color="Red", label="My plot")
    leg = ax1.legend(ncol=1, bbox_to_anchor=(0,1.01), loc="lower left", borderaxespad=0, prop={'size': 8})
    
    # 创建tooltip注释对象,初始隐藏
    tooltip = ax1.annotate(
        "",
        xy=(0, 0),
        xytext=(15, 15),  # 相对于鼠标位置的偏移
        textcoords="offset points",
        bbox=dict(boxstyle="round,pad=0.3", fc="white", alpha=0.9),
        arrowprops=dict(arrowstyle="->", color="#666666"),
        visible=False
    )
    
    # 获取图例的图标和文本元素
    leg_handles = leg.legendHandles
    leg_texts = leg.get_texts()
    
    # 绑定鼠标移动事件,传入需要的参数
    fig.canvas.mpl_connect(
        'motion_notify_event',
        lambda event: onhover(event, fig, (ax1,), leg_handles, leg_texts, tooltip)
    )
    plt.show()

# ENTRY POINT
if __name__ == '__main__':
    main()

关键逻辑说明

  1. 获取图例元素:通过leg.legendHandles拿到图例的图标对象,leg.get_texts()拿到对应的文本对象,两者是一一对应的。
  2. 合并边界框:每个图例条目包含图标和文本,所以我们把两者的屏幕边界框合并,确保鼠标悬停在图标或文本上都能触发Tooltip。
  3. Tooltip控制:创建一个初始隐藏的注释对象,在鼠标命中图例区域时,更新内容并显示;离开时隐藏。
  4. 画布刷新:修改Tooltip状态后调用draw_idle(),确保界面及时更新。

这样修改后,当你把鼠标悬停在图例的图标或文本上时,就会弹出包含标签和自定义额外内容的Tooltip,离开区域后Tooltip自动消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:07