Skip to content

Matplotlib - Subplot2grid() 函数

Matplotlib - 使用 subplot2grid() 处理复杂布局

Section titled “Matplotlib - 使用 subplot2grid() 处理复杂布局”

虽然 plt.subplots() 非常适合创建规则网格,但有时你需要更复杂的布局,其中子图可能跨越多行或多列。plt.subplot2grid() 函数提供了这种灵活性。

它允许你将一个 Axes 对象放置到概念网格上,指定其起始位置以及应占据的行/列数。

ax = plt.subplot2grid(shape, loc, rowspan=1, colspan=1)

参数:

  • shape:一个元组 (nrows, ncols),定义整个网格的几何形状。
  • loc:一个元组 (row, col),指定子图在网格内的起始单元格(0 索引)。
  • rowspan:整数(默认值 1),指示子图应从 loc 向下跨越多少行。
  • colspan:整数(默认值 1),指示子图应从 loc 向右跨越多少列。

**注意:**虽然 subplot2grid 提供了灵活性,但对于高度复杂或嵌套的网格布局,matplotlib.gridspec 模块通常提供了更强大且可以说更易读的方法。然而,subplot2grid 对于中等复杂度的布局非常有用。

示例:创建一个包含不同大小子图的布局。

import matplotlib.pyplot as plt
import numpy as np
# 准备一些数据
x = np.arange(1, 10)
plt.figure(figsize=(9, 6)) # 首先创建 Figure
# --- 使用 subplot2grid 定义子图布局 ---
# 图 1:在 3x3 网格的第一行中跨越 2 列
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
ax1.plot(x, np.exp(x/3), color='blue')
ax1.set_title('Plot 1 (exp, colspan=2)')
# 图 2:在 3x3 网格的最后一列中跨越 3 行
ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=3)
ax2.plot(x, x*x, color='red')
ax2.set_title('Plot 2 (square, rowspan=3)')
# 图 3:从第 1 行、第 0 列开始,跨越 2 行和 2 列
ax3 = plt.subplot2grid((3, 3), (1, 0), rowspan=2, colspan=2)
ax3.plot(x, np.log(x), color='green')
ax3.set_title('Plot 3 (log, rowspan=2, colspan=2)')
# --- 最终调整 ---
plt.suptitle('Complex Layout with subplot2grid()', fontsize=16)
# 调整布局以防止标题/标签重叠
plt.tight_layout(rect=[0, 0, 1, 0.95]) # 调整 rect 以容纳 suptitle
plt.show()

在此示例中,我们定义了一个概念上的 3x3 网格。

  • ax1 从 (0, 0) 开始,跨越 2 列 (colspan=2)。
  • ax2 从 (0, 2) 开始,跨越 3 行 (rowspan=3)。
  • ax3 从 (1, 0) 开始,跨越 2 行 (rowspan=2) 和 2 列 (colspan=2)。

subplot2grid 允许创建使用简单的 plt.subplots() 调用难以或不可能实现的非均匀布局。请记住,坐标 (loc) 是 0 索引的。