【DS with Python】Matplotlib入门(一):架构概述、面向对象编程绘图与函数式绘图基础


前言

很多人入手Matplot库的时候是从matplotlib.pyplot入手的,因为看起来操作简单,但这实际上只能快速产图,如果想要对图片进行调整,例如,调整画布尺寸、调整横轴或者纵轴刻度,或者隐藏横轴或者纵轴标签等等,就会无从下手,实际上,matplotlib架构共分为三层:Backend(后端)、Artist(美工)、Scripting(脚本),待本文一一介绍。


一、Matplotlib架构概述

  Matplotlib中包含和管理给定图形中所有元素的顶级对象称为Figure(可以理解为画板),matplotlib 的核心架构任务之一是实现一个用于展现操作 Figure的框架,并与将Figure呈现到用户界面窗口或硬拷贝的行为进行分离。实现这一点的架构在逻辑上分为三层,可以看作是一个堆栈。位于另一层之上的每一层都知道如何与它下面的层对话,但较低的层不知道它上面的层。从下到上三层是:Backend(后端)、Artist(美工)、Scripting(脚本)。


1.1 Backend(后端)

  实际上,调用Matplotlib的方式可以大不相同:有些人从 Python shell 交互式地使用 Matplotlib,他们键入命令时会弹出绘图窗口,有些人在 Jupyter Notebook用%matplotlib inline或者%matplotlib notebook的magic code绘制内联图或者交互式图表以进行快速数据分析;还有人将 Matplotlib 嵌入到 PyQt 或 PyGObject 等图形用户界面中以构建丰富的应用程序;或者有一些人运行 Web 应用程序服务器来动态提供图形等等。

  为了支持所有这些用例,Matplotlib 可以针对不同的输出,这些不同的输出每一种都称为一种后端;“前端”是面向用户的代码,即绘图代码,而“后端”则在幕后完成所有艰苦的工作来制作图形。有两种类型的后端第一种后端是用户界面后端(user interface backends):用于 PyQt/PySide、PyGObject、Tkinter、wxPython 或 macOS/Cocoa,也称为“交互式后端(interactive backends)”我们在jupyter notebook中用的%matplotlib notebook就属于这一种;另一种后端是硬拷贝后端:用以制作图像文件PNG、SVG、PDF、PS,也称为“非交互式后端(non-interactive backends)”

后端也分为三块

  • FigureCanvas 封装了要绘制的表面的概念(可以理解为画纸)
  • Renderer 渲染器 (可以理解为用来画画的画笔)
  • Event 处理用户输入,例如键盘的输入和鼠标的移动与悬停。

  本文是在Jupyter Notebook的基础上,用%matplotlib notebook的magic code形成的交互式图像,在这里,我们查看所用的后端:

%matplotlib notebook
import matplotlib as mpl
mpl.get_backend()

--Outputs:
'nbAgg'

  如果需要调整后端,可以参看官方网站:matplotlib.Backends,一般情况下,使用默认的后端即可


1.2 Artist(美工)

  Artist是Matplotlib的中间层,也是很多繁重的情况发生的地方,后端FigureCanvas是画纸,Artist是知道如何拿起Renderer(画笔)并将墨水涂在画布上的对象,你在Matplotlib的Figure都是Artist的实例包括title, lines, tick labels, images等等,他们都属于基类matplotlib.artist.Artist,而Artistbackend之间的关联发生在draw方法中。由于Renderer有一个指向其画布FigureCanvas的指针,并知道如何在其上绘画,因此draw方法可以将抽象的指令转换Artist为像素缓冲区中的颜色、SVG 文件中的路径或任何具体表示。
  我们用两张图来理解Artist的各个实例与层次,在这张图中,我们给出了主要的实例:Figure(图)、Axes(轴域)、Text(文本)、2Dline(二维线条)、XAxis(X轴)、YAxis(Y轴)、Xlabel(X轴标签)、Xticks(X轴刻度)、Ylabel(Y轴标签)、Yticks(Y轴刻度),注意,Axes中的ax.set_xticklabels()设置的就是plt.xticks()我们接下来将一一介绍他们的具体用法:

在这里插入图片描述
  他们的关系如下所示:
在这里插入图片描述
  最大的一类是Figure,其次是Axes,再其次是Axes中的一些实例,轴、文本、线条等等,Text可以包含图的标题、图注、图标等等一切的文本。
  另外需要注意这些美工实例又分为原始型美工(Primitive artists)复合型美工(Composite artists),例如前面提到的Text、以及背景的Rectangle、Circle都是原始型美工,而Axis、Tick、labels、Axes、Figure则是复合型美工,一个复合型美工可以包含多个复合型美工或者原始型美工,例如,Figure可以包含包含一个或多个Axes并且Figure的背景是一个基元Rectangle

  接下来我们对这些实例进行一一介绍:


1.2.1 Figure、Subplot与Axes

  • Figure

  我们可以将Figure看成是一张大的画板,可以matplotlib.figure中的fig=Figure()来创建一张画板fig,也可以在函数式绘图中用fig=plt.figure()来建立fig

在这里插入图片描述

  但有个画板还不够,好比你要画油画,你不能画在画板上吧,至少需要一张画纸,这里的画纸就可以理解为以横纵坐标轴为长和宽所建立起来的矩形,2D的图像都在这个矩形内。可以用canvas = FigureCanvas(fig)来产生一张画纸,或者如果你用fig=plt.figure(),那他会默认产生一张画纸。如果你觉得一张画纸不够,要在一张画板上多用几张画纸,也是可以的,可以用fig.add_subplot或plt.subplots(子图),或者fig.add_axes(轴域)来产生多的画纸,他们会将原来大的画纸进行拆分,拆分成若干张小画纸,画纸和画纸间可以嵌套,可以并列放置,我们接下来对这两者进行介绍与区分:

  • Subplot

  首先介绍Subplot,Subplot负责将整个画板分割成几块,用ax = fig.add_subplot(abc) 来创建子图,里面的参数abc代表是产生a行b列一共a*b个子图区域,c表示给这个区域添加子图。
  例如:ax1 = fig.add_subplot(221) , ax2 = fig.add_subplot(222) , ax4 = fig.add_subplot(224)就是在2*2个区域中,在左上,右上和右下建立子图:

from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas

fig = Figure()
canvas = FigureCanvas(fig)

ax1 = fig.add_subplot(221) 
ax2 = fig.add_subplot(222) 
ax4 = fig.add_subplot(224)

canvas.print_png('test1.png')

  借用%%html来在网页上查看图片,红色字迹为注释,非做在图上的。

%%html
<img src='test1.png' />

在这里插入图片描述

  Subplot建立子图的方式比较基础而且整洁,另一种形式Axes则较为灵活:

  • Axes

  Axes,个人翻译为轴域,可以通过fig.add_axes([left,bottom,width,height])添加子图的左边界、下边界、宽度和高度来在合适的位置上添加子图:

from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas

fig    = Figure()
canvas = FigureCanvas(fig)

ax1    = fig.add_axes([0.1, 0.1, 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值