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

如何使用mpl_connect高亮选中点及时间序列中的下一个点?

实现时间序列点选中时高亮当前点与下一个点

要实现选中点时高亮当前点及序列中的下一个点,你需要在mplcursors的回调逻辑里添加样式修改逻辑,同时注意重置之前的高亮状态,避免多个点一直保持高亮。

完整代码示例

import matplotlib.pyplot as plt
import mplcursors
import pandas as pd

# 模拟测试数据
data = pd.DataFrame({
    'Column1': [1, 2, 3, 4, 5, 6],
    'Column2': [2, 4, 3, 5, 7, 6]
}, index=pd.date_range('2024-01-01', periods=6))
color = '#636EFA'

# 绘制初始散点图
fig, ax = plt.subplots()
points = ax.scatter(data['Column1'], data['Column2'], color=color, s=50)
labels = data.index

# 保存所有点的原始样式(颜色、大小)
original_colors = points.get_facecolors().copy()
original_sizes = points.get_sizes().copy()

def highlight_points(sel):
    # 重置所有点到原始样式
    points.set_facecolors(original_colors)
    points.set_sizes(original_sizes)
    
    # 高亮当前选中的点
    sel.annotation.set_text(labels[sel.index])
    points.get_facecolors()[sel.index] = '#EF553B'  # 红色高亮当前点
    points.set_sizes([s if i != sel.index else 100 for i, s in enumerate(original_sizes)])
    
    # 高亮下一个点(如果存在)
    next_idx = sel.index + 1
    if next_idx < len(data):
        points.get_facecolors()[next_idx] = '#00CC96'  # 绿色高亮下一个点
        points.set_sizes([s if i != next_idx else 100 for i, s in enumerate(original_sizes)])
    
    # 更新绘图
    fig.canvas.draw_idle()

# 绑定回调函数
cursor = mplcursors.cursor(points, hover=2)
cursor.connect("add", highlight_points)

plt.show()

关键逻辑说明

  • 保存原始样式:提前存储所有点的颜色和大小,确保每次选中新点时能重置之前的高亮状态。
  • 重置样式:在每次回调开始时,把所有点恢复到初始状态,避免残留高亮。
  • 高亮当前点:修改选中点的颜色和大小,区分于其他点。
  • 高亮下一个点:判断当前点不是序列最后一个时,对下一个点做同样的样式修改,直观展示序列走向。
  • 更新绘图:调用fig.canvas.draw_idle()确保样式修改实时生效。

内容的提问来源于stack exchange,提问作者lee b.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:40:57