matplotlib部件之套索Lasso的使用
套索概述
套索(Lasso)是与套索选区(LassoSelector)相似的matplotlib部件(widgets),两者的区别主要在于:
继承关系:
- 套索具体实现定义为matplotlib.widgets.Lasso类,继承关系为:Widget->AxesWidget->Lasso。
- 套索选区具体实现定义为matplotlib.widgets.LassoSelector类,继承关系为:Widget->AxesWidget->_SelectorWidget->LassoSelector。
构造参数:
- Lasso类的签名为classmatplotlib.widgets.Lasso(ax,xy,callback=None,useblit=True),Lasso类需要给定套索一个起始的坐标。
- LassoSelector类的签名为classmatplotlib.widgets.LassoSelector(ax,onselect=None,useblit=True,lineprops=None,button=None)。
事件处理:
- Lasso事件在鼠标释放时即被销毁。
- LassoSelector在鼠标释放时仍然可以继续与子图交互,直到断开与子图的连接。
Lasso类构造函数的参数为:
- ax:套索生效的子图,类型为matplotlib.axes.Axes的实例。
- xy:套索起始的坐标。
- callback:套索完成即鼠标释放时执行的回调函数,函数签名为deffunc(verts),verts的为套索端点的坐标列表。
套索可以使用matplotlib.path.Path类的contains_point方法获取选区内的数据点。
貌似Lasso是实验性API,还不够完善,matplotlib3.3之后可能逐步废弃Lasso。
案例:
官方案例,https://matplotlib.org/3.2.1/gallery/event_handling/lasso_demo.html
案例说明
案例代码
frommatplotlibimportcolorsasmcolors,path frommatplotlib.collectionsimportRegularPolyCollection importmatplotlib.pyplotasplt frommatplotlib.widgetsimportLasso importnumpyasnp classDatum: colorin=mcolors.to_rgba("red") colorout=mcolors.to_rgba("blue") def__init__(self,x,y,include=False): self.x=x self.y=y ifinclude: self.color=self.colorin else: self.color=self.colorout classLassoManager: def__init__(self,ax,data): self.axes=ax self.canvas=ax.figure.canvas self.data=data self.Nxy=len(data) facecolors=[d.colorfordindata] self.xys=[(d.x,d.y)fordindata] self.collection=RegularPolyCollection( 6,sizes=(100,), facecolors=facecolors, offsets=self.xys, transOffset=ax.transData) ax.add_collection(self.collection) self.cid=self.canvas.mpl_connect('button_press_event',self.onpress) defcallback(self,verts): facecolors=self.collection.get_facecolors() p=path.Path(verts) ind=p.contains_points(self.xys) foriinrange(len(self.xys)): ifind[i]: facecolors[i]=Datum.colorin else: facecolors[i]=Datum.colorout self.canvas.draw_idle() self.canvas.widgetlock.release(self.lasso) delself.lasso defonpress(self,event): ifself.canvas.widgetlock.locked(): return ifevent.inaxesisNone: return self.lasso=Lasso(event.inaxes, (event.xdata,event.ydata), self.callback) #acquirealockonthewidgetdrawing self.canvas.widgetlock(self.lasso) if__name__=='__main__': np.random.seed(19680801) data=[Datum(*xy)forxyinnp.random.rand(100,2)] ax=plt.axes(xlim=(0,1),ylim=(0,1),autoscale_on=False) ax.set_title('Lassopointsusingleftmousebutton') lman=LassoManager(ax,data) plt.show()
代码分析
案例的关键代码在于LassoManager类的onpress方法和callback方法。由于Lasso类在事件处理上比较原始,需要用户进行控制,在鼠标按下、释放事件中需要使用canvas.widgetlock对象锁定/解锁绘图功能,保证只有一个对象进行绘图,canvas.widgetlock是matplotlib.widgets.LockDraw类的实例。
总结
尽量使用套索选区(LassoSelector)而不是套索(Lasso),两者功能相似,索选区(LassoSelector)使用相对更简单一些,套索(Lasso)还有一些BUG,matplotlib3.3已不再推荐使用。
到此这篇关于matplotlib部件之套索Lasso的使用的文章就介绍到这了,更多相关matplotlib套索内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。