当前位置: 萬仟网 > IT编程>软件设计>面向对象 > 详解matplotlib中pyplot和面向对象两种绘图模式之间的关系

详解matplotlib中pyplot和面向对象两种绘图模式之间的关系

2021年01月22日  | 萬仟网IT编程  | 我要评论
matplotlib有两种绘图方式,一种是依托matplotlib.pyplot模块实现类似matlab绘图指令的绘图方式,一种是面向对象式绘图,依靠figurecanvas(画布)、 figure

matplotlib有两种绘图方式,一种是依托matplotlib.pyplot模块实现类似matlab绘图指令的绘图方式,一种是面向对象式绘图,依靠figurecanvas(画布)、 figure (图像)、 axes (轴域) 等对象绘图。

这两种方式之间并不是完全独立的,而是通过某种机制进行了联结,pylot绘图模式其实隐式创建了面向对象模式的相关对象,其中的关键是matplotlib._pylab_helpers模块中的单例类gcf,它的作用是追踪当前活动的画布及图像。

因此,可以说matplotlib绘图的基础是面向对象式绘图,pylot绘图模式只是一种简便绘图方式。

先不分析源码,先做实验!

实验

先通过实验,看一看我们常用的那些pyplot绘图模式

实验一
无绘图窗口显示

from matplotlib import pyplot as plt
plt.show()

实验二
出现绘图结果

from matplotlib import pyplot as plt
plt.plot([1,2])
plt.show()

实验三
出现绘图结果

from matplotlib import pyplot as plt
plt.gca()
plt.show()

实验四
出现绘图结果

from matplotlib import pyplot as plt
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模块部分源码

def figure(num=none, # autoincrement if none, else integer from 1-n
      figsize=none, # defaults to rc figure.figsize
      dpi=none, # defaults to rc figure.dpi
      facecolor=none, # defaults to rc figure.facecolor
      edgecolor=none, # defaults to rc figure.edgecolor
      frameon=true,
      figureclass=figure,
      clear=false,
      **kwargs
      ):

  figmanager = _pylab_helpers.gcf.get_fig_manager(num)
  if figmanager is none:
    max_open_warning = rcparams['figure.max_open_warning']

    if len(allnums) == max_open_warning >= 1:
      cbook._warn_external(
        "more than %d figures have been opened. figures "
        "created through the pyplot interface "
        "(`matplotlib.pyplot.figure`) are retained until "
        "explicitly closed and may consume too much memory. "
        "(to control this warning, see the rcparam "
        "`figure.max_open_warning`)." %
        max_open_warning, runtimewarning)

    if get_backend().lower() == 'ps':
      dpi = 72

    figmanager = new_figure_manager(num, figsize=figsize,
                    dpi=dpi,
                    facecolor=facecolor,
                    edgecolor=edgecolor,
                    frameon=frameon,
                    figureclass=figureclass,
                    **kwargs)
  return figmanager.canvas.figure

def plot(*args, scalex=true, scaley=true, data=none, **kwargs):
  return gca().plot(
    *args, scalex=scalex, scaley=scaley,
    **({"data": data} if data is not none else {}), **kwargs)

def gcf():
  """
  get the current figure.

  if no current figure exists, a new one is created using
  `~.pyplot.figure()`.
  """
  figmanager = _pylab_helpers.gcf.get_active()
  if figmanager is not none:
    return figmanager.canvas.figure
  else:
    return figure()

def gca(**kwargs):
  return gcf().gca(**kwargs)

def get_current_fig_manager():
  """
  return the figure manager of the current figure.

  the figure manager is a container for the actual backend-depended window
  that displays the figure on screen.

  if if no current figure exists, a new one is created an its figure
  manager is returned.

  returns
  -------
  `.figuremanagerbase` or backend-dependent subclass thereof
  """
  return gcf().canvas.manager

gcf类源码

class gcf:
  """
  singleton to maintain the relation between figures and their managers, and
  keep track of and "active" figure and manager.

  the canvas of a figure created through pyplot is associated with a figure
  manager, which handles the interaction between the figure and the backend.
  pyplot keeps track of figure managers using an identifier, the "figure
  number" or "manager number" (which can actually be any hashable value);
  this number is available as the :attr:`number` attribute of the manager.

  this class is never instantiated; it consists of an `ordereddict` mapping
  figure/manager numbers to managers, and a set of class methods that
  manipulate this `ordereddict`.

  attributes
  ----------
  figs : ordereddict
    `ordereddict` mapping numbers to managers; the active manager is at the
    end.
  """

到此这篇关于详解matplotlib中pyplot和面向对象两种绘图模式之间的关系的文章就介绍到这了,更多相关matplotlib中pyplot和面向对象内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • 第一篇博客(无关技术)

    第一篇博客(无关技术) 第一篇博客不知从何入手,有写博客的想法是因为想要记录自己学习Java的历程及总结,2019年7月21,写这篇博客的时间是大三... [阅读全文]
  • 面向对象浅见

    面向对象浅见

    面向对象面向对象的概念面向过程和面向对象的区别对象类面向对象实战思路类的创建创建对象使用对象创建对象的过程OOP... [阅读全文]
  • 项目模块--1.实现验证码功能

    简介: Java web项目中,在后端随机生成一个验证码,绘制成图像,并在图像上添加两条干扰线,发送到浏览器,供用户使用。 本片博文内容包括,功能实现的... [阅读全文]
  • 不正经的面向对象

    不正经的面向对象

    在刚开始学JAVA经常会被一些听上去高大上的术语所迷惑,比如:OOP,封装,继承,多态。 这些都是基于对象操作的,而理解了对象,对这三大特性就会好理... [阅读全文]
  • OO第三单元作业总结

    OO第三单元作业总结

    OO第三单元作业总结——JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适... [阅读全文]
  • java容器类3:set/HastSet/MapSet深入解读

    java容器类3:set/HastSet/MapSet深入解读

    介绍 Set:集合,是一个不包含重复数据的集合。(A collection that contains no duplicate elements.... [阅读全文]
  • 面向对象:异常处理

    面向对象:异常处理

    一,异常和错误 part1:程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改... [阅读全文]
  • 面向对象,三大基本特性,五大基本原则--转载

    透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是:封装,继承,多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把... [阅读全文]
  • java抽象类,接口与异常

    1.抽象类; 定义;包含一个抽象方法的类称称为抽象类,抽象类在class前使用adstract关键词修饰。 抽象方法;只声明未实现的方法称为抽象方法... [阅读全文]
  • 面向对象编程--1、类和对象

    面向对象编程--1、类和对象

    1. 面向对象编程的概念万物都对象什么是面向对象?=》面向对象指以==属性和行为==的观点去分析现实生活中的事物... [阅读全文]
验证码:
Copyright © 2017-2021  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com