Matplotlib是用于Python绘图的一个第三方开源库,其官网[2]上这样描述:Matplotlib是一个Python可视化库,用于实现静态、动画以及交互式可视化。Matplotlib使简单的东西更简单,使困难的东西变得可能。Python现有的大多数第三方库都基于Matplotlib,例如Pandas的绘图模块。这次笔记预计实现几个Matplotlib绘图模板,首先对Matplotlib进行大体了解。
绘制基本函数图-指数函数
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5) # 设置横坐标
y = np.exp(x) # 设置纵坐标及函数
fig, ax = plt.subplots() # 创建包含一个坐标系的图
ax.plot(x, y) # 绘制图形
plt.show() # 显示图片
Figure的组成&函数解释[3]
官网上给出的一个Matplotlib Figure的结构图如下:
这里对上一小节的实例进行注解:
Figure:保存整张图。包含所有元素——子axes、标题、图例、色块、嵌套子图等。举个栗子:
fig = plt.figure() # an empty figure with no Axes
fig, ax = plt.subplots() # a figure with a single Axes
fig, axs = plt.subplots(2, 2) # a figure with a 2x2 grid of Axes
plt.figure()函数参数如下(点击函数可看源API):
plt.figure( num=None, # 图ID,若该ID已存在,则返回;若不存在,则创建。(int/str/figure类型,可选参数) figsize=None, # 宽高(单位:英寸)。((float, float)类型,默认[6.4, 4.8]) dpi=None, # 图形分辨率(单位:点/英寸)。(float类型,默认100.0) facecolor=None, # 背景色。(color类型,默认white) edgecolor=None, # 边界颜色。(color类型,默认white) frameon=True, # 图形框架。(bool类型,默认True绘制) FigureClass=<class 'matplotlib.figure.Figure'>, clear=False, # 清除图。(bool类型,默认False) **kwargs )
plt.subplots()函数创建一张图及一组子图,很实用。参数如下:
plt.subplots( nrows=1, ncols=1, # 子图网格的行/列数(int类型,默认1) *, sharex=False, sharey=False, # 控制沿某坐标轴相关属性的共享。(bool/ {'none', 'all', 'row', 'col'}类型,默认False) squeeze=True, # 控制返回维度。(bool类型,默认True) subplot_kw=None, gridspec_kw=None, **fig_kw )
Axes:是一个附着于一个Figure的Artist,包含一个绘图区域、两个坐标轴axis对象(3D中3个)、一个标题(title可设置set_title())、一个x轴标签(set_xlabel()设置)、一个y轴标签(set_ylabel()设置)。
Axis:设置坐标刻度、刻度范围、刻度标签、轴标签,刻度位置可Locator对象确定,刻度标签可由Formatter对象格式化。Axis是及其成员函数是大多数OOP接口的主要入口点,其上定义了许多绘图方法。
Artist:这个概念可以说是matplotlib的基本概念。Figure中的任何可视部件都是artist(包括Figure、Axes、Axis对象都是artist),图在渲染时所有artist都将绘制到画布上。
两种绘图接口
matplotlib提供了两种最常用的绘图接口,一种面向对象(OO模式),一种依赖pyplot自动创建figure和axes以及绘图。
OO模式(object-oriented style)实例:
# 面向对象方法
x = np.linspace(0, 3, 100)
fig, ax = plt.subplots()
ax.plot(x, x, label='linear')
ax.plot(x, x ** 3, label='cubic')
ax.plot(x, np.exp(x), label='exponential')
ax.set_xlabel('x label')
ax.set_ylabel('y label')
ax.set_title("Simple Plot")
ax.legend()
依赖pyplot创建实例:
# 自动创建方法
x = np.linspace(0, 3, 100)
plt.plot(x, x, label='linear')
plt.plot(x, x ** 3, label='cubic')
plt.plot(x, np.exp(x), label='exponential')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
这两个简单例子结果相同,看起来好像第二种代码更简介一些(少了生成figure和axes的步骤),事实并非如此[4]:
第一种方法同时生成figure(实际上是一张画布)和axes(画布上的一片作图区域),并使用axes对象在其区域内作图;
第二种方法首先生成一张画布,然后通过pyplot隐式地生成作图区域(也生成了,但是不直观体现在代码中)作图。
因为上面两个例子都很简单,不需要过多的操作,因此二者效果相同;事实上,如果要对多个子图中的多个部件参数进行设置,用第二种会很麻烦,而第一种就是面向对象思维,对开发者更友好。
Matplotlib绘图模板
这里先使用Datawhale项目[1]中的模板,待学完所有任务再创建自己的模板。
# 来源[1]
# step1 准备数据
x = np.linspace(0, 2, 100)
y = x**2
# step2 设置绘图样式,这一模块的扩展参考第五章进一步学习,这一步不是必须的,样式也可以在绘制图像是进行设置
mpl.rc('lines', linewidth=4, linestyle='-.')
# step3 定义布局, 这一模块的扩展参考第三章进一步学习
fig, ax = plt.subplots()
# step4 绘制图像, 这一模块的扩展参考第二章进一步学习
ax.plot(x, y, label='linear')
# step5 添加标签,文字和图例,这一模块的扩展参考第四章进一步学习
ax.set_xlabel('x label')
ax.set_ylabel('y label')
ax.set_title("Simple Plot")
ax.legend()
参考资料
[1] Datawhale数据可视化开源小组. Fantastic-Matplotlib, 第一回:Matplotlib初相识. 2022.01
[2] Matplotlib官网