matplotlib库的设计哲学:
Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.
matplotlib是一个用来创建静态,动画,和可交互的可视化库。Matplotlib让简单的事情简单化,让困难的事情变可能。
基本绘图单元和概念
figure:画布
axes:坐标系
axis:坐标轴
artist:艺术品,负责所有可视化元素的绘制和渲染,所有图形中能看到的东西,都是artist对象的衍生品。
The whole figure. The Figure keeps track of all the child Axes
, a group of ‘special’ Artists (titles, figure legends, colorbars, etc), and even nested subfigures.
figure是所绘制图像的容器,它保持对画布中所有的坐标系和绘画对象的跟踪,以及画布中嵌套的子画布。
如下官方给出的示意图:
整个图形中范围最大的就是figure1,图形中所有绘制的组件都放在figure画布之上。在画布之上绘制图形需要至少一个坐标系(axes2),如果要把多个图像放在一张画布上,可以往画布上添加多个坐标系。一个坐标系中包含的坐标轴取决于绘图种类,常见的x-y坐标系就是两个坐标轴,3D图像就是3个坐标轴,极坐标系3就是一个半径加一个角度两个轴。通过axes对象,我们就可以修改这个坐标系中的所有组件,包括坐标轴,坐标轴标签,基于坐标轴绘制的曲线或图形,数据标签,图例,注释文字等等。另外,一个画布可以包含子画布4,也就是可以把一个画布分割成多个分别进行绘制,每个子画布中可以设定不同的绘画风格,这就进一步增强了图形绘制的灵活性。
一副图形中包含的画布,坐标系,坐标轴,曲线等等元素,在绘制和渲染之前,都是内存中的数据。渲染时,图形中的各个组件根据自己的属性配置,分别完成自己的可视化渲染,这就是artist的作用。所以在调用plt.show()
之前,我们就只是在更改图像的所有组件的属性。
编码风格(显示调用和隐式调用)
面相对象风格
面相对象风格就是使用面相对象的风格编程,所有的操作都是基于绘图对象的API和属性。
x = np.linspace(0, 2, 100) # Sample data.# Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.plot(x, x, label='linear') # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic') # Plot more data on the axes...
ax.plot(x, x**3, label='cubic') # ... and some more.
ax.set_xlabel('x label') # Add an x-label to the axes.
ax.set_ylabel('y label') # Add a y-label to the axes.
ax.set_title("Simple Plot") # Add a title to the axes.
ax.legend() # Add a legend.
pyplot-style
pyplot风格,使用pyplot顶层接口直接操作图像,pyplot会隐式调用内部接口实现相关操作。
x = np.linspace(0, 2, 100) # Sample data.plt.figure(figsize=(5, 2.7), layout='constrained')
plt.plot(x, x, label='linear') # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic') # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
两种风格绘制出的图像是一样的:
Pylot风格比较直观易用,在于大多数场景能够快速出图,但是功能丰富度不够,要想完全使用顶层接口实现图形的精细化控制非常困难。官方也推荐使用面相对象风格,可以对画布中的所有控件进行精细化控制。
不论是使用那种风格,使用代码绘制图形的步骤是一样的。使用OO风格,调用.pyplot.figure
来创建空画布,pyplot风格是使用plt.figure
来创建画布,两种方法都会返回一个空画布。plt.subplots
同时帮我们创建了空画布和坐标系。plt.plot
函数在绘制时如果画布中没有坐标系,会自动创建新的坐标系。
在编程时,如果使用面相对象风格,要准确控制图形控件中的内容是比较清晰的,相关的API函数也很容易查阅,所以推荐使用功能这种风格。
Introduction to Figures — Matplotlib 3.8.3 documentation ↩︎
Introduction to Axes (or Subplots) — Matplotlib 3.8.3 documentation ↩︎
Polar plot — Matplotlib 3.8.3 documentation ↩︎
Figure subfigures — Matplotlib 3.8.3 documentation ↩︎