详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
matplotlib有两种绘图方式,一种是依托matplotlib.pyplot模块实现类似matlab绘图指令的绘图方式,一种是面向对象式绘图,依靠FigureCanvas(画布)、Figure(图像)、Axes(轴域)等对象绘图。
这两种方式之间并不是完全独立的,而是通过某种机制进行了联结,pylot绘图模式其实隐式创建了面向对象模式的相关对象,其中的关键是matplotlib._pylab_helpers模块中的单例类Gcf,它的作用是追踪当前活动的画布及图像。
因此,可以说matplotlib绘图的基础是面向对象式绘图,pylot绘图模式只是一种简便绘图方式。
先不分析源码,先做实验!
实验
先通过实验,看一看我们常用的那些pyplot绘图模式
实验一
无绘图窗口显示
frommatplotlibimportpyplotasplt plt.show()
实验二
出现绘图结果
frommatplotlibimportpyplotasplt plt.plot([1,2]) plt.show()
实验三
出现绘图结果
frommatplotlibimportpyplotasplt plt.gca() plt.show()
实验四
出现绘图结果
frommatplotlibimportpyplotasplt plt.figure() #或者plt.gcf() plt.show()
pyplot模块绘图原理
通过查看pyplot模块figure()函数、gcf()函数、gca()函数、plot()函数和其他绘图函数的源码,可以简单理个思路!
- figure()函数:如果有现成图像,返回值就是当前图像,如果没有现成的图像,就初始化一个新图像,返回值为Figure对象。
- gcf()函数:如果有现成图像,返回值就是当前图像,如果没有现成的图像,就调用figure()函数,返回值为Figure对象。
- gca()函数:调用gcf()函数返回对象的gca方法,返回值为Axes对象。
- plot()函数:调用gca()函数返回对象的plot方法。
- pyplot模块其他绘图函数:均调用gca()函数的相关方法。
因此,pyplot绘图模式,使用plot()函数或者其他绘图函数,如果没有现成图像对象,直接会先创建图像对象。
当然使用figure()函数、gcf()函数和gca()函数,如果没有现成图像对象,也会先创建图像对象。
更进一步,在matplotlib.pyplot模块源码中出现了如下代码,因此再查看matplotlib._pylab_helpers模块它的作用是追踪当前活动的画布及图像
figManager=_pylab_helpers.Gcf.get_fig_manager(num) figManager=_pylab_helpers.Gcf.get_active()
matplotlib._pylab_helpers模块作用是管理pyplot绘图模式中的图像。该模块只有一个类——Gcf,它的作用是追踪当前活动的画布及图像。
matplotlib.pyplot模块部分源码
deffigure(num=None,#autoincrementifNone,elseintegerfrom1-N figsize=None,#defaultstorcfigure.figsize dpi=None,#defaultstorcfigure.dpi facecolor=None,#defaultstorcfigure.facecolor edgecolor=None,#defaultstorcfigure.edgecolor frameon=True, FigureClass=Figure, clear=False, **kwargs ): figManager=_pylab_helpers.Gcf.get_fig_manager(num) iffigManagerisNone: max_open_warning=rcParams['figure.max_open_warning'] iflen(allnums)==max_open_warning>=1: cbook._warn_external( "Morethan%dfigureshavebeenopened.Figures" "createdthroughthepyplotinterface" "(`matplotlib.pyplot.figure`)areretaineduntil" "explicitlyclosedandmayconsumetoomuchmemory." "(Tocontrolthiswarning,seethercParam" "`figure.max_open_warning`)."% max_open_warning,RuntimeWarning) ifget_backend().lower()=='ps': dpi=72 figManager=new_figure_manager(num,figsize=figsize, dpi=dpi, facecolor=facecolor, edgecolor=edgecolor, frameon=frameon, FigureClass=FigureClass, **kwargs) returnfigManager.canvas.figure defplot(*args,scalex=True,scaley=True,data=None,**kwargs): returngca().plot( *args,scalex=scalex,scaley=scaley, **({"data":data}ifdataisnotNoneelse{}),**kwargs) defgcf(): """ Getthecurrentfigure. Ifnocurrentfigureexists,anewoneiscreatedusing `~.pyplot.figure()`. """ figManager=_pylab_helpers.Gcf.get_active() iffigManagerisnotNone: returnfigManager.canvas.figure else: returnfigure() defgca(**kwargs): returngcf().gca(**kwargs) defget_current_fig_manager(): """ Returnthefiguremanagerofthecurrentfigure. Thefiguremanagerisacontainerfortheactualbackend-dependedwindow thatdisplaysthefigureonscreen. Ififnocurrentfigureexists,anewoneiscreatedanitsfigure managerisreturned. Returns ------- `.FigureManagerBase`orbackend-dependentsubclassthereof """ returngcf().canvas.manager
Gcf类源码
classGcf: """ Singletontomaintaintherelationbetweenfiguresandtheirmanagers,and keeptrackofand"active"figureandmanager. Thecanvasofafigurecreatedthroughpyplotisassociatedwithafigure manager,whichhandlestheinteractionbetweenthefigureandthebackend. pyplotkeepstrackoffiguremanagersusinganidentifier,the"figure number"or"managernumber"(whichcanactuallybeanyhashablevalue); thisnumberisavailableasthe:attr:`number`attributeofthemanager. Thisclassisneverinstantiated;itconsistsofan`OrderedDict`mapping figure/managernumberstomanagers,andasetofclassmethodsthat manipulatethis`OrderedDict`. Attributes ---------- figs:OrderedDict `OrderedDict`mappingnumberstomanagers;theactivemanagerisatthe end. """
到此这篇关于详解matplotlib中pyplot和面向对象两种绘图模式之间的关系的文章就介绍到这了,更多相关matplotlib中pyplot和面向对象内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!