matplotlib中如何正确使用set_pickradius实现点选数据高亮功能
关于matplotlib pick_event点选高亮功能失效的解决方案
错误原因
你当前的修改存在两个核心问题:
- 你删除了蓝色散点对应
Line2D对象的picker参数,相当于直接关闭了该图形元素的pick事件监听,自然无法触发点击回调 xaxis.set_pickradius/yaxis.set_pickradius的作用对象是坐标轴刻度、轴线这类坐标轴内置组件,和你自定义绘制的散点/曲线无关,完全不能替代原picker参数的作用
正确修改方案
方案1(兼容写法)
如果你使用的是matplotlib 3.5及以上版本,原有picker=5的写法仍保持兼容,直接保留即可正常运行,无需额外修改。
方案2(新版API规范写法)
如果要遵循新版API的拆分逻辑,需要先为散点对象开启pick监听,再单独设置感应半径,对应修改如下:
将原代码中
ax.plot(x, y, 'o', color='blue', picker=5)
替换为:
# 先获取蓝色散点对应的Line2D对象,开启pick监听 blue_points, = ax.plot(x, y, 'o', color='blue', picker=True) # 单独设置点击感应半径为5像素 blue_points.set_pickradius(5)
其余代码无需调整,即可恢复原来的点选高亮效果。
完整可运行代码
import matplotlib.pyplot as plt class MyPlot(object): def makePlot(self): self.fig = plt.figure('Test', figsize=(10, 8)) ax = plt.subplot(111) x = range(0, 100, 10) y = (5,)*10 ax.plot(x, y, '-', color='red') # 新版API写法 blue_points, = ax.plot(x, y, 'o', color='blue', picker=True) blue_points.set_pickradius(5) self.highlight, = ax.plot([], [], 'o', color='yellow') self.cid = plt.connect('pick_event', self.onPick) plt.show() def onPick(self, event=None): this_point = event.artist x_value = this_point.get_xdata() y_value = this_point.get_ydata() ind = event.ind self.highlight.set_data(x_value[ind][0],y_value[ind][0]) self.fig.canvas.draw_idle() if __name__ == '__main__': app = MyPlot() app.makePlot()
内容的提问来源于stack exchange,提问作者s6hebern
相关产品推荐
相关产品推荐

