Python数据分析学习(三):Matplotlib
本教程涵盖了 Matplotlib 的一些基本用法和最佳实践,帮助你快速上手。
Matplotlib 快速入门指南
本教程涵盖了 Matplotlib 的一些基本用法和最佳实践,帮助你快速上手。
import matplotlib.pyplot as plt
import numpy as np
一个简单的例子
Matplotlib 将你的数据绘制在 Figure(图形)上(例如窗口、Jupyter 组件等),每个 Figure 可以包含一个或多个 Axes(轴域/子图),Axes 是一个可以在其中指定 x-y 坐标(或在极坐标图中用 theta-r,在 3D 图中用 x-y-z)的区域。创建包含一个 Axes 的 Figure 最简单的方法是使用 pyplot.subplots。然后我们可以使用 Axes.plot 在 Axes 上绘制一些数据,并用 show 显示图形:
fig, ax = plt.subplots() # 创建一个包含单个 Axes 的 Figure
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) # 在 Axes 上绘制一些数据
plt.show() # 显示图形
解释:
plt.subplots()返回两个对象:fig是整个图形画板,ax是图形中的一个子图(坐标系)。初学者可以先记住这个固定用法。ax.plot(x, y)将 x 和 y 数据画成折线图。plt.show()在脚本中需要显式调用才能显示图形;在 Jupyter Notebook 中通常可以省略,因为会自动显示。
图形的组成部分
下图展示了 Matplotlib 图形的各个组成部分:

Figure(图形)
整个图形。Figure 跟踪所有子 Axes、一组“特殊”的 Artist(标题、图例、颜色条等),甚至嵌套的子图形。
通常,你会通过以下函数之一创建一个新的 Figure:
fig = plt.figure() # 一个空的 Figure,没有 Axes
fig, ax = plt.subplots() # 一个 Figure,包含一个 Axes
fig, axs = plt.subplots(2, 2) # 一个 Figure,包含 2x2 的 Axes 网格
# 一个 Figure,左边一个 Axes,右边上下两个 Axes:
fig, axs = plt.subplot_mosaic([['left', 'right_top'],
['left', 'right_bottom']])
subplots() 和 subplot_mosaic 是创建 Figure 并同时生成其中 Axes 对象的便捷函数,但你也可以稍后手动添加 Axes。
初学者注意:
plt.figure()只创建画板,不创建坐标系,通常需要再手动添加 Axes。plt.subplots()是最常用的,因为它直接给你画板和子图对象。subplot_mosaic可以创建复杂的布局,用字符串矩阵定义每个子图的位置和名称。
Axes(轴域/子图)
Axes 是附加到 Figure 上的一个 Artist(绘图元素),它包含一个用于绘制数据的区域,通常包括两个(或 3D 情况下三个)Axis(轴)对象(注意 Axes 和 Axis 的区别),这些轴提供刻度(ticks)和刻度标签(tick labels),为 Axes 中的数据提供尺度。每个 Axes 还有一个标题(通过 set_title() 设置)、一个 x 轴标签(通过 set_xlabel())和一个 y 轴标签(通过 set_ylabel())。
Axes 的方法是配置绘图大部分内容的主要接口(添加数据、控制轴刻度和范围、添加标签等)。
Axis(轴)
这些对象设置尺度和范围,并生成刻度(轴上的标记)和刻度标签(标记的字符串标签)。刻度的位置由 Locator 对象决定,刻度标签的格式由 Formatter 对象决定。合适的 Locator 和 Formatter 组合可以非常精细地控制刻度的位置和标签。
Artist(绘图元素)
基本上,Figure 上可见的一切都是 Artist(甚至 Figure、Axes 和 Axis 对象本身)。这包括 Text 对象、Line2D 对象、collections 对象、Patch 对象等。当渲染 Figure 时,所有 Artist 都会被绘制到画布上。大多数 Artist 都与一个 Axes 相关联;这样的 Artist 不能由多个 Axes 共享,也不能从一个 Axes 移动到另一个。
绘图函数的输入类型
绘图函数期望输入为 numpy.array 或 numpy.ma.masked_array,或者可以传递给 numpy.asarray 的对象。类似于数组的类(例如 pandas 数据对象和 numpy.matrix)可能无法按预期工作。通常的约定是在绘图前将这些对象转换为 numpy.array 对象。例如,转换 numpy.matrix:
b = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b)
大多数方法也会解析类似字典、结构化 NumPy 数组或 pandas.DataFrame 这样的可字符串索引对象。Matplotlib 允许你提供 data 关键字参数,并传递对应于 x 和 y 变量的字符串来生成绘图。
np.random.seed(19680801) # 设置随机种子,使结果可重复
data = {'a': np.arange(50),
'c': np.random.randint(0, 50, 50),
'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.scatter('a', 'b', c='c', s='d', data=data) # 从 data 字典中按变量名取数据
ax.set_xlabel('entry a')
ax.set_ylabel('entry b')
解释:
figsize=(5, 2.7)指定图形大小(英寸)。layout='constrained'自动调整布局,防止标签重叠。ax.scatter绘制散点图,c参数控制颜色,s控制点的大小,它们可以引用数据字典中的键。- 这种方式让代码更简洁,尤其当数据在 DataFrame 中时非常方便。
编码风格
显式接口与隐式接口
如前所述,使用 Matplotlib 主要有两种方式:
- 显式创建 Figure 和 Axes,并调用它们的方法(面向对象风格,简称 OO 风格)。
- 依赖 pyplot 隐式创建和管理 Figure 与 Axes,并使用 pyplot 函数进行绘图。
两种方式各有优劣,详见 Matplotlib 应用接口(APIs)。官方建议对于复杂的绘图和打算重用的脚本,使用 OO 风格;对于快速交互式工作,pyplot 风格更方便。
OO 风格示例:
x = np.linspace(0, 2, 100) # 生成 0 到 2 之间的 100 个点
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.plot(x, x, label='linear') # 在 Axes 上绘制线性函数
ax.plot(x, x**2, label='quadratic') # 二次函数
ax.plot(x, x**3, label='cubic') # 三次函数
ax.set_xlabel('x label')
ax.set_ylabel('y label')
ax.set_title("Simple Plot")
ax.legend() # 显示图例
pyplot 风格示例:
x = np.linspace(0, 2, 100)
plt.figure(figsize=(5, 2.7), layout='constrained')
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
初学者注意:
- OO 风格中,我们通过
ax对象调用绘图方法,所有设置都针对这个特定的子图。 - pyplot 风格中,
plt.plot等函数会自动在“当前”子图上绘图,适合快速探索。 - 建议初学者先掌握 OO 风格,因为它更清晰,尤其在处理多个子图时不易混乱。
编写辅助函数
如果你需要反复绘制同一种图形,或者想轻松地封装 Matplotlib 方法,可以使用下面推荐的函数签名:
def my_plotter(ax, data1, data2, param_dict):
"""
一个辅助函数,用于绘制图形。
"""
out = ax.plot(data1, data2, **param_dict)
return out
然后你可以用这个函数填充两个子图:
data1, data2, data3, data4 = np.random.randn(4, 100) # 生成 4 组随机数据
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(5, 2.7))
my_plotter(ax1, data1, data2, {'marker': 'x'}) # 左子图画点用 'x' 标记
my_plotter(ax2, data3, data4, {'marker': 'o'}) # 右子图画点用 'o' 标记
样式化 Artist(绘图元素)
大多数绘图方法都有针对 Artist 的样式选项,可以在调用绘图方法时设置,也可以之后通过 Artist 的“setter”方法设置。在下面的例子中,我们手动设置了由 plot 创建的 Artist 的颜色、线宽和线型,并在绘制后通过 set_linestyle 设置了第二条线的线型。
fig, ax = plt.subplots(figsize=(5, 2.7))
x = np.arange(len(data1))
ax.plot(x, np.cumsum(data1), color='blue', linewidth=3, linestyle='--')
l, = ax.plot(x, np.cumsum(data2), color='orange', linewidth=2)
l.set_linestyle(':')
解释:
color:颜色,可以是颜色名称(如 ‘blue’)、缩写(如 ‘b’)或十六进制码。linewidth:线宽(点数)。linestyle:线型,'--'虚线,':'点线,'-'实线等。l, = ax.plot(...)中的逗号是因为plot返回一个包含一个 Line2D 对象的列表,我们通过解包取出该对象,以便后续修改。
颜色
Matplotlib 有非常灵活的颜色指定方式,大多数 Artist 都接受多种颜色定义(参见允许的颜色定义)。有些 Artist 可以接受多个颜色,例如散点图,标记的边缘颜色可以与内部颜色不同:
fig, ax = plt.subplots(figsize=(5, 2.7))
ax.scatter(data1, data2, s=50, facecolor='C0', edgecolor='k')
解释:
facecolor:标记内部颜色,'C0'是默认颜色循环的第一个颜色。edgecolor:标记边缘颜色,'k'表示黑色(black)。
线宽、线型和标记大小
线宽通常以印刷点(1 pt = 1/72 英寸)为单位,适用于有描边的 Artist。同样,描边线可以设置线型,参见线型示例。
标记大小取决于所用的方法。plot 中标记大小以点为单位,通常是标记的“直径”或宽度。scatter 中标记大小大致与标记的可视面积成比例。有多种标记样式可作为字符串代码使用(参见标记列表),用户也可以定义自己的 MarkerStyle(参见标记参考)。
fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(data1, 'o', label='data1') # 'o' 圆圈
ax.plot(data2, 'd', label='data2') # 'd' 菱形
ax.plot(data3, 'v', label='data3') # 'v' 下三角
ax.plot(data4, 's', label='data4') # 's' 正方形
ax.legend()
给图形添加标签
坐标轴标签和文本
set_xlabel、set_ylabel 和 set_title 用于在指定位置添加文本(更多讨论见 Matplotlib 中的文本)。文本也可以直接通过 text 添加到图上:
mu, sigma = 115, 15
x = mu + sigma * np.random.randn(10000)
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
# 绘制直方图
n, bins, patches = ax.hist(x, 50, density=True, facecolor='C0', alpha=0.75)
ax.set_xlabel('Length [cm]')
ax.set_ylabel('Probability')
ax.set_title('Aardvark lengths\n (not really)')
ax.text(75, .025, r'$\mu=115,\ \sigma=15$') # 在坐标 (75, 0.025) 处添加文本
ax.axis([55, 175, 0, 0.03]) # 设置坐标轴范围
ax.grid(True) # 显示网格
解释:
ax.hist绘制直方图,bins=50表示 50 个柱子,density=True归一化,alpha透明度。ax.text(x, y, s)在数据坐标 (x, y) 处添加字符串 s。ax.axis([xmin, xmax, ymin, ymax])设置坐标轴范围。- 字符串前的
r表示原始字符串,防止反斜杠被转义。
所有文本函数都返回一个 matplotlib.text.Text 实例。和前面的线条一样,你可以通过在文本函数中传入关键字参数来自定义属性:
t = ax.set_xlabel('my data', fontsize=14, color='red')
这些属性在 文本属性和布局 中有更详细的介绍。
在文本中使用数学表达式
Matplotlib 接受在任何文本表达式中使用 TeX 方程表达式。例如,要在标题中写入表达式 (\sigma_i=15),你可以将 TeX 表达式放在美元符号之间:
ax.set_title(r'$\sigma_i=15$')
这里的 r 表示原始字符串,避免 Python 将反斜杠当作转义字符。Matplotlib 内置了 TeX 表达式解析和布局引擎,并自带数学字体——详情参见编写数学表达式。你也可以直接使用 LaTeX 格式化文本,并将输出合并到显示的图形或保存的 postscript 中——参见使用 LaTeX 渲染文本。
注释
我们还可以在图上对点进行注释,通常是用箭头将指向点 xy 的箭头与位于 xytext 的文本连接起来:
fig, ax = plt.subplots(figsize=(5, 2.7))
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
line, = ax.plot(t, s, lw=2)
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05))
ax.set_ylim(-2, 2)
解释:
xy箭头指向的点(数据坐标)。xytext文本放置的位置(数据坐标)。arrowprops字典设置箭头属性,这里设置面颜色为黑色,并稍微收缩箭头。- 更多坐标系统和高级用法参见基础注释和高级注释。
图例
通常我们想通过图例标识线条或标记,使用 Axes.legend:
fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(np.arange(len(data1)), data1, label='data1')
ax.plot(np.arange(len(data2)), data2, label='data2')
ax.plot(np.arange(len(data3)), data3, 'd', label='data3')
ax.legend()
Matplotlib 的图例在布局、放置位置以及能代表哪些 Artist 方面非常灵活。详细讨论见图例指南。
坐标轴刻度和尺度
每个 Axes 有两个(或三个)Axis 对象,分别代表 x 轴和 y 轴。它们控制坐标轴的尺度、刻度定位器和刻度格式化器。可以附加额外的 Axes 来显示更多的 Axis 对象。
尺度
除了线性尺度,Matplotlib 还提供非线性尺度,例如对数尺度。由于对数尺度非常常用,也有直接的方法如 loglog、semilogx 和 semilogy。这里我们手动设置尺度:
fig, axs = plt.subplots(1, 2, figsize=(5, 2.7), layout='constrained')
xdata = np.arange(len(data1)) # 生成一个顺序索引
data = 10**data1
axs[0].plot(xdata, data) # 左子图线性尺度
axs[1].set_yscale('log') # 右子图设置 y 轴为对数尺度
axs[1].plot(xdata, data)
尺度定义了从数据值到轴上间距的映射。这个映射是双向的,并组合成一个变换(transform),这是 Matplotlib 将数据坐标映射到 Axes、Figure 或屏幕坐标的方式。参见变换教程。
刻度定位器和格式化器
每个 Axis 都有一个刻度定位器(locator)和格式化器(formatter),它们决定在轴上哪些位置放置刻度标记。简单的接口是 set_xticks:
fig, axs = plt.subplots(2, 1, layout='constrained')
axs[0].plot(xdata, data1)
axs[0].set_title('Automatic ticks')
axs[1].plot(xdata, data1)
axs[1].set_xticks(np.arange(0, 100, 30), ['zero', '30', 'sixty', '90'])
axs[1].set_yticks([-1.5, 0, 1.5]) # 注意不需要指定标签
axs[1].set_title('Manual ticks')
不同的尺度可能有不同的定位器和格式化器;例如上面的对数尺度使用 LogLocator 和 LogFormatter。其他格式化器和定位器以及如何编写自己的定位器/格式化器,参见刻度定位器和刻度格式化器。
绘制日期和字符串
Matplotlib 可以处理日期数组和字符串数组的绘图,以及浮点数。它们会使用适当的特殊定位器和格式化器。对于日期:
from matplotlib.dates import ConciseDateFormatter
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
dates = np.arange(np.datetime64('2021-11-15'), np.datetime64('2021-12-25'),
np.timedelta64(1, 'h')) # 从 11 月 15 日到 12 月 25 日,每小时一个点
data = np.cumsum(np.random.randn(len(dates)))
ax.plot(dates, data)
ax.xaxis.set_major_formatter(ConciseDateFormatter(ax.xaxis.get_major_locator()))
更多信息参见日期示例(例如日期刻度标签)。
对于字符串,可以进行分类绘图(参见绘制分类变量):
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
categories = ['turnips', 'rutabaga', 'cucumber', 'pumpkins']
ax.bar(categories, np.random.rand(len(categories)))
注意:分类绘图时需注意,某些解析文本文件的方法会返回字符串列表,即使这些字符串都表示数字或日期。如果你传递 1000 个字符串,Matplotlib 会认为你想要 1000 个类别,并会在图上添加 1000 个刻度!这会导致图形拥挤。通常需要转换为数值类型。
额外的坐标轴对象
在一个图表中绘制不同量级的数据可能需要另一个 y 轴。可以通过 twinx 创建一个新的 Axes,它具有不可见的 x 轴和一个位于右侧的 y 轴(类似地,twiny 用于 x 轴)。参见具有不同尺度的绘图另一个示例。
类似地,你可以添加一个与主坐标轴具有不同尺度的 secondary_xaxis 或 secondary_yaxis,以不同尺度或单位表示数据。参见次坐标轴更多示例。
fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(7, 2.7), layout='constrained')
l1, = ax1.plot(t, s)
ax2 = ax1.twinx() # 创建共享 x 轴的第二个 y 轴
l2, = ax2.plot(t, range(len(t)), 'C1')
ax2.legend([l1, l2], ['Sine (left)', 'Straight (right)'])
ax3.plot(t, s)
ax3.set_xlabel('Angle [rad]')
ax4 = ax3.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad))
ax4.set_xlabel('Angle [°]')
颜色映射数据
我们经常希望用颜色映射(colormap)中的颜色来表示图中的第三维数据。Matplotlib 有许多支持这种功能的绘图类型:
from matplotlib.colors import LogNorm
X, Y = np.meshgrid(np.linspace(-3, 3, 128), np.linspace(-3, 3, 128))
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
fig, axs = plt.subplots(2, 2, layout='constrained')
pc = axs[0, 0].pcolormesh(X, Y, Z, vmin=-1, vmax=1, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[0, 0])
axs[0, 0].set_title('pcolormesh()')
co = axs[0, 1].contourf(X, Y, Z, levels=np.linspace(-1.25, 1.25, 11))
fig.colorbar(co, ax=axs[0, 1])
axs[0, 1].set_title('contourf()')
pc = axs[1, 0].imshow(Z**2 * 100, cmap='plasma', norm=LogNorm(vmin=0.01, vmax=100))
fig.colorbar(pc, ax=axs[1, 0], extend='both')
axs[1, 0].set_title('imshow() with LogNorm()')
pc = axs[1, 1].scatter(data1, data2, c=data3, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[1, 1], extend='both')
axs[1, 1].set_title('scatter()')
解释:
pcolormesh创建伪彩色网格图。contourf填充等高线图。imshow显示图像数据。scatter中可以用c参数指定颜色映射的数据。
颜色映射
这些都是派生自 ScalarMappable 对象的 Artist。它们都可以设置 vmin 和 vmax 之间的线性映射到由 cmap 指定的颜色映射。Matplotlib 有许多颜色映射可供选择(选择颜色映射),你也可以创建自己的颜色映射(创建颜色映射)或下载第三方包。
归一化
有时我们希望数据到颜色映射的映射是非线性的,例如上面的 LogNorm 示例。我们通过向 ScalarMappable 提供 norm 参数而不是 vmin 和 vmax 来实现。更多归一化方法参见颜色映射归一化。
颜色条
添加颜色条可以为颜色与底层数据的关系提供图例。颜色条是图形级别的 Artist,附加到一个 ScalarMappable(从中获取关于归一化和颜色映射的信息),通常占用父 Axes 的空间。颜色条的放置可能复杂:详见放置颜色条。你还可以使用 extend 关键字在颜色条两端添加箭头,用 shrink 和 aspect 控制大小。最后,颜色条会具有适合该归一化的默认定位器和格式化器,可以像其他 Axis 对象一样修改。
使用多个图形和轴域
你可以多次调用 fig = plt.figure() 或 fig2, ax = plt.subplots() 来打开多个图形。通过保留对象引用,你可以向任一图形添加 Artist。
添加多个 Axes 有多种方式,最基本的是上面使用的 plt.subplots()。可以使用 subplot_mosaic 实现更复杂的布局,其中 Axes 对象可以跨越多行或多列。
fig, axd = plt.subplot_mosaic([['upleft', 'right'],
['lowleft', 'right']], layout='constrained')
axd['upleft'].set_title('upleft')
axd['lowleft'].set_title('lowleft')
axd['right'].set_title('right')
Matplotlib 有相当复杂的工具来安排 Axes:参见在 Figure 中排列多个 Axes 和 复杂且语义化的图形组合(subplot_mosaic)。
Matplotlib 常用函数速查表
这里整理了 Matplotlib 最常用的函数,按功能分类,方便你绘图时快速查找。假设你习惯使用面向对象风格(OO style),即通过 fig, ax = plt.subplots() 创建图形和坐标系后,使用 ax.xxx() 方法进行绘图和设置。部分函数也列出了对应的 pyplot 接口(plt.xxx())供参考。
1. 图形与子图创建
| 函数 | 说明 | 示例 |
|---|---|---|
plt.subplots() |
创建一个 Figure 和一个或多个 Axes(子图)。最常用的启动函数。 | fig, ax = plt.subplots()fig, axs = plt.subplots(2, 2, figsize=(8,6)) |
plt.figure() |
创建一个空 Figure,之后需要手动添加 Axes。 | fig = plt.figure()ax = fig.add_subplot(111) |
fig.add_subplot() |
向 Figure 添加一个 Axes。 | ax = fig.add_subplot(2, 2, 1) # 2x2 网格中第一个 |
plt.subplot_mosaic() |
创建复杂布局的 Axes,使用字符串矩阵定义位置。 | fig, axd = plt.subplot_mosaic([['top', 'top'], ['left', 'right']]) |
2. 常用绘图函数(Axes 方法)
| 函数 | 说明 | 示例 |
|---|---|---|
ax.plot(x, y) |
折线图 | ax.plot(x, y, color='red', linestyle='--', marker='o') |
ax.scatter(x, y) |
散点图 | ax.scatter(x, y, c=colors, s=sizes, alpha=0.5) |
ax.bar(x, height) |
垂直柱状图 | ax.bar(categories, values, color='skyblue') |
ax.barh(y, width) |
水平柱状图 | ax.barh(categories, values) |
ax.hist(x, bins) |
直方图 | ax.hist(data, bins=20, density=True, alpha=0.7) |
ax.boxplot(x) |
箱线图 | ax.boxplot([group1, group2], labels=['A','B']) |
ax.violinplot(x) |
小提琴图 | ax.violinplot(data, positions=[1,2,3]) |
ax.pie(x, labels) |
饼图(通常在 ax 上调用,但注意饼图需要 ax.axis('equal')) |
ax.pie(sizes, labels=labels, autopct='%1.1f%%') |
ax.imshow(X) |
显示图像或矩阵数据 | ax.imshow(image, cmap='gray', aspect='auto') |
ax.contour(X, Y, Z) |
等高线图 | ax.contour(X, Y, Z, levels=10, colors='black') |
ax.contourf(X, Y, Z) |
填充等高线图 | ax.contourf(X, Y, Z, cmap='viridis') |
ax.pcolormesh(X, Y, Z) |
伪彩色网格图(类似 imshow 但坐标可不等距) | ax.pcolormesh(X, Y, Z, cmap='RdBu_r', shading='auto') |
ax.fill_between(x, y1, y2) |
填充两条曲线之间的区域 | ax.fill_between(x, y1, y2, where=(y1>y2), color='gray', alpha=0.3) |
ax.stackplot(x, y) |
堆叠面积图 | ax.stackplot(x, y1, y2, y3, labels=['A','B','C']) |
ax.errorbar(x, y, yerr) |
带误差棒的折线图 | ax.errorbar(x, y, yerr=error, fmt='o', capsize=3) |
ax.axhline(y) |
添加水平线 | ax.axhline(y=0, color='black', linestyle='--') |
ax.axvline(x) |
添加垂直线 | ax.axvline(x=3, color='red') |
ax.axhspan(ymin, ymax) |
添加水平带 | ax.axhspan(0.2, 0.5, alpha=0.3) |
ax.axvspan(xmin, xmax) |
添加垂直带 | ax.axvspan(2, 4, alpha=0.3) |
3. 坐标轴与刻度设置
| 函数 | 说明 | 示例 |
|---|---|---|
ax.set_xlim(left, right) |
设置 x 轴范围 | ax.set_xlim(0, 100) |
ax.set_ylim(bottom, top) |
设置 y 轴范围 | ax.set_ylim(-1, 1) |
ax.set_xscale(scale) |
设置 x 轴尺度(‘linear’, ‘log’, ‘symlog’, ‘logit’) | ax.set_xscale('log') |
ax.set_yscale(scale) |
设置 y 轴尺度 | ax.set_yscale('log') |
ax.set_xticks(ticks) |
设置 x 轴刻度位置 | ax.set_xticks([0, 2, 4, 6]) |
ax.set_yticks(ticks) |
设置 y 轴刻度位置 | ax.set_yticks(np.arange(0, 1.1, 0.2)) |
ax.set_xticklabels(labels) |
设置 x 轴刻度标签,常与 set_xticks 配合 |
ax.set_xticklabels(['Jan','Feb','Mar'], rotation=45) |
ax.set_yticklabels(labels) |
设置 y 轴刻度标签 | ax.set_yticklabels(['low','medium','high']) |
ax.tick_params(axis, direction, length, width, colors, labelsize, rotation, ...) |
控制刻度线、标签的外观 | ax.tick_params(axis='x', rotation=45, labelsize=10) |
ax.xaxis.set_major_locator(locator) |
设置 x 轴主刻度定位器(如 MultipleLocator, AutoLocator) |
ax.xaxis.set_major_locator(plt.MultipleLocator(5)) |
ax.xaxis.set_major_formatter(formatter) |
设置 x 轴主刻度格式化器(如 FormatStrFormatter, DateFormatter) |
ax.xaxis.set_major_formatter('{x:.0f}°C') |
ax.secondary_xaxis(location) |
创建次 x 轴 | ax2 = ax.secondary_xaxis('top', functions=(np.deg2rad, np.rad2deg)) |
ax.secondary_yaxis(location) |
创建次 y 轴 | ax2 = ax.secondary_yaxis('right') |
4. 文本与标签
| 函数 | 说明 | 示例 |
|---|---|---|
ax.set_title(label) |
设置图形标题 | ax.set_title('My Plot', fontsize=16, color='blue') |
ax.set_xlabel(xlabel) |
设置 x 轴标签 | ax.set_xlabel('Time (s)') |
ax.set_ylabel(ylabel) |
设置 y 轴标签 | ax.set_ylabel('Amplitude') |
ax.text(x, y, s) |
在数据坐标 (x,y) 处添加文本 | ax.text(0.5, 0.8, 'Important point', transform=ax.transAxes) (使用轴坐标) |
ax.annotate(s, xy, xytext, arrowprops) |
添加带箭头的注释 | ax.annotate('Max', xy=(2,1), xytext=(3,1.5), arrowprops=dict(arrowstyle='->')) |
5. 图例、颜色条与注释
| 函数 | 说明 | 示例 |
|---|---|---|
ax.legend() |
显示图例(需在绘图时指定 label 参数) |
ax.legend(loc='upper left', fontsize=10) |
fig.colorbar(mappable, ax) |
添加颜色条(用于散点图、图像、等值线等) | sc = ax.scatter(x, y, c=z)fig.colorbar(sc, ax=ax, label='Temperature') |
ax.legend(handles, labels) |
手动创建图例 | from matplotlib.patches import Patchax.legend(handles=[Patch(color='red')], labels=['Red']) |
6. 图形外观与布局
| 函数 | 说明 | 示例 |
|---|---|---|
fig.set_size_inches(w, h) |
设置图形尺寸(英寸) | fig.set_size_inches(8, 6) |
fig.tight_layout() |
自动调整子图间距,防止标签重叠 | fig.tight_layout(pad=1.5) |
fig.subplots_adjust(left, bottom, right, top, wspace, hspace) |
手动调整子图边距和间距 | fig.subplots_adjust(wspace=0.3, hspace=0.2) |
ax.grid(visible) |
显示或隐藏网格 | ax.grid(True, linestyle='--', alpha=0.5) |
ax.set_facecolor(color) |
设置 Axes 背景颜色 | ax.set_facecolor('lightgray') |
fig.patch.set_facecolor(color) |
设置 Figure 背景颜色 | fig.patch.set_facecolor('white') |
ax.axison(flag) |
显示或隐藏坐标轴 | ax.axis('off') # 隐藏坐标轴 |
7. 样式与颜色
| 函数/属性 | 说明 | 示例 |
|---|---|---|
plt.style.use(style) |
应用预设样式 | plt.style.use('ggplot')plt.style.use(['dark_background', 'seaborn-v0_8']) |
plt.rcParams.update(params) |
全局修改默认参数 | plt.rcParams.update({'font.size': 12, 'lines.linewidth': 2}) |
| 颜色指定 | 颜色可以用名称、缩写、十六进制、RGB元组等 | color='red'color='#FF5733'color=(0.2, 0.4, 0.6) |
| 颜色映射(cmap) | 用于散点图、图像、等值线等 | cmap='viridis'(可选 'plasma', 'coolwarm', 'gray' 等) |
8. 图形保存与显示
| 函数 | 说明 | 示例 |
|---|---|---|
fig.savefig(fname) |
保存图形到文件 | fig.savefig('plot.png', dpi=300, bbox_inches='tight') |
plt.show() |
显示图形(脚本中必须调用,Jupyter 中可省略) | plt.show() |
plt.close(fig) |
关闭图形窗口,释放内存 | plt.close(fig) |
plt.close('all') |
关闭所有图形 | plt.close('all') |
9. 高级子图布局
| 函数 | 说明 | 示例 |
|---|---|---|
fig.add_gridspec(nrows, ncols) |
创建网格规格,实现更复杂的子图排列 | gs = fig.add_gridspec(3, 3)ax1 = fig.add_subplot(gs[0, :])ax2 = fig.add_subplot(gs[1, :-1]) |
plt.subplot_mosaic() |
见第 1 部分 | 同上 |
ax.inset_axes(rect) |
在 Axes 内部嵌入一个小坐标系 | axins = ax.inset_axes([0.6, 0.6, 0.3, 0.3]) |
ax.indicate_inset_zoom(inset_ax) |
指示嵌入放大的区域 | ax.indicate_inset_zoom(axins, edgecolor='black') |
常用辅助函数
| 函数 | 说明 | 示例 |
|---|---|---|
np.linspace(start, stop, num) |
生成等差数列,常用于生成 x 轴数据 | x = np.linspace(0, 10, 100) |
np.meshgrid(x, y) |
生成网格坐标矩阵,用于等高线、pcolormesh 等 | X, Y = np.meshgrid(x, y) |
plt.get_cmap(name) |
获取颜色映射对象 | cmap = plt.get_cmap('viridis') |
提示
- 如果不确定某个函数的具体参数,在 Jupyter 中输入函数名后加
?查看文档,例如ax.plot?。 - 许多函数都有对应的
pyplot版本(如plt.plot()),它会作用于“当前”坐标系。但推荐使用 OO 风格以避免混淆。 - 官方文档的示例库是极好的学习资源,遇到想画的图可以直接搜示例代码修改。
更多推荐
所有评论(0)