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 pltimport 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 索引的。