如何在Matplotlib散点图中实现鼠标点击及RectangleSelector框选点并改色?
散点图单点点击改色+矩形框选高亮实现方案
以下是结合Matplotlib的RectangleSelector实现需求的完整代码,同时保留你已实现的单点左右键改色功能:
import matplotlib.pyplot as plt from matplotlib.widgets import RectangleSelector import numpy as np # 替换为你的实际数据,这里模拟测试数据 # testdata = df2.to_numpy() testdata = np.random.rand(50, 2) * 10 # 生成50个随机散点 fig, ax = plt.subplots() fig.set_size_inches(7.5, 8.25) # 初始化散点图,用单独数组维护颜色避免版本兼容问题 colors = np.array([(0, 0, 0, 1)] * len(testdata)) coll = ax.scatter(testdata[:,0], testdata[:,1], color=colors, picker=5, s=[10]*len(testdata)) def on_pick(event): if event.mouseevent.button == 1: print(testdata[event.ind], "clicked") colors[event.ind] = (1, 0, 0, 1) coll.set_facecolors(colors) fig.canvas.draw() elif event.mouseevent.button == 3: print(testdata[event.ind], "unclicked") colors[event.ind] = (0, 0, 0, 1) coll.set_facecolors(colors) fig.canvas.draw() def select_callback(eclick, erelease): # 获取选框的坐标范围 x1, y1 = eclick.xdata, eclick.ydata x2, y2 = erelease.xdata, erelease.ydata xmin, xmax = min(x1, x2), max(x1, x2) ymin, ymax = min(y1, y2), max(y1, y2) # 筛选选框内的点 mask = (testdata[:,0] >= xmin) & (testdata[:,0] <= xmax) & \ (testdata[:,1] >= ymin) & (testdata[:,1] <= ymax) # 修改框选点的颜色为红色 colors[mask] = (1, 0, 0, 1) coll.set_facecolors(colors) fig.canvas.draw() # 绑定单点点击事件 fig.canvas.mpl_connect('pick_event', on_pick) # 初始化矩形选择器:左键拖动绘制选框,松开触发回调 rect_selector = RectangleSelector( ax, select_callback, drawtype='box', useblit=True, button=[1], # 仅用左键触发框选 minspanx=5, minspany=5, spancoords='pixels', interactive=True ) plt.show()
关键细节说明:
- 用独立的
colors数组维护点的颜色,替代直接修改散点对象的内部属性_facecolors,避免不同Matplotlib版本的兼容性问题 - 矩形框选通过按住左键拖动实现,松开鼠标后自动筛选选框内的点并修改为红色
- 保留原有交互逻辑:左键单击单个点变红,右键单击单个点恢复黑色
- 若需要拖动选框过程中实时高亮选中点,可以扩展
select_callback逻辑,添加实时更新的处理
内容的提问来源于stack exchange,提问作者datasciencefordummies
相关产品推荐
相关产品推荐

