如何使用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.
相关产品推荐
相关产品推荐

