如何在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()
关键逻辑说明
- 获取图例元素:通过
leg.legendHandles拿到图例的图标对象,leg.get_texts()拿到对应的文本对象,两者是一一对应的。 - 合并边界框:每个图例条目包含图标和文本,所以我们把两者的屏幕边界框合并,确保鼠标悬停在图标或文本上都能触发Tooltip。
- Tooltip控制:创建一个初始隐藏的注释对象,在鼠标命中图例区域时,更新内容并显示;离开时隐藏。
- 画布刷新:修改Tooltip状态后调用
draw_idle(),确保界面及时更新。
这样修改后,当你把鼠标悬停在图例的图标或文本上时,就会弹出包含标签和自定义额外内容的Tooltip,离开区域后Tooltip自动消失。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

