Python-matplotlib库画不规则图
matplotlib库之画不规则图
- subplot2grid()实现灵活的网格布局
- GridSpec
- 基本参数
- 简单的不规则
在 Matplotlib 中绘制不规则排列的图形(如大小不同、跨行跨列的子图)
subplot2grid()实现灵活的网格布局
- 🏵️ 通过指定子图跨越的行数和列数实现不规则排列。
- 🏵️ plt.subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)。
- 🏵️ shape:网格的总行数和总列数,例如 (3, 3) 表示 3 行 3 列。
- 🏵️ loc:子图的左上角位置,格式为 (行索引, 列索引),索引从 0 开始。
- 🏵️ rowspan:子图跨越的行数(默认 1),colspan:子图跨越的列数(默认 1)。
- 🏵️ fig:指定要添加子图的 Figure 对象(默认使用当前 Figure)。
import matplotlib.pyplot as pltplt.figure(figsize=(10, 8))ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3) # 3行3列的图,从0行0列开始,占1行3列
ax1.set_title('rowspan=0, colspan=3')ax2 = plt.subplot2grid((3, 3), (1, 0), rowspan=2) # 3行3列的图,从1行0列开始,占2行1列
ax2.set_title('rowspan=2, colspan=1')ax3 = plt.subplot2grid((3, 3), (1, 1), rowspan=1, colspan=2) # 3行3列的图,从1行1列开始,占1行2列
ax3.set_title('rowspan=1, colspan=2')ax4 = plt.subplot2grid((3, 3), (2, 1)) # 3行3列的图,从2行1列开始,占1行1列
ax4.set_title('rowspan=1, colspan=1')ax5 = plt.subplot2grid((3, 3), (2, 2)) # 3行3列的图,从2行2列开始,占1行1列
ax5.set_title('rowspan=1, colspan=1')
plt.tight_layout()
plt.show()
GridSpec
- 🏵️ GridSpec 是一个强大的子图布局工具,用于创建灵活的不规则子图网格。
- 🏵️ subplot2grid() 相比,GridSpec 提供更精细的控制,适合复杂的布局需求。
- 🏵️ GridSpec 本质上是一个网格布局管理器,可以定义网格的总行数和列数,为每个子图分配网格区域(可跨行、跨列),调整子图之间的间距和边距。
- 🏵️ fig.add_subplot(gs[1, :2]) 指明了subplot占据的gs的网格。
- 🏵️ 先创建GridSpec,画图时使用ax1 = fig.add_subplot(gs[0, 0]) fig.add_subplot的参数是gs的网格位置。
基本参数
参数 | 说明 | 举例 |
---|---|---|
nrows | int 网格的总行数 | 3(创建 3 行网格) |
ncols | int 网格的总列数 | 4(创建 4 列网格) |
left | float 子图区域的左边界(相对于画布宽度的比例,范围 0-1) | 0.1(左侧保留 10% 空间) |
right | float 子图区域的右边界(相对于画布宽度的比例) | 0.9(右侧保留 10% 空间) |
bottom | float 子图区域的下边界(相对于画布高度的比例) | 0.1 |
top | float 子图区域的上边界(相对于画布高度的比例) | 0.9 |
wspace | float 列与列之间的间距(以平均子图宽度的比例表示) | 0.3(间距为子图宽度的 30%) |
hspace | float 行与行之间的间距(以平均子图高度的比例表示) | 0.4 |
width_ratios | list[float] 各列宽度的相对比例 | [2, 1, 1](第 1 列宽度是后两列的 2 倍) |
height_ratios | list[float] 各行高度的相对比例 | [1, 2](第 2 行高度是第 1 行的 2 倍) |
figure | Figure 指定要应用 GridSpec 的 Figure 对象(默认使用当前 Figure) | fig |
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpecfig = plt.figure(figsize=(8, 6))# 创建 GridSpec,设置各种参数
gs = GridSpec(nrows=2, ncols=3, # 2行3列figure=fig, # 指定 Figureleft=0.1, right=0.9, # 左右边距bottom=0.1, top=0.9, # 上下边距wspace=0.3, hspace=0.4, # 列间距和行间距width_ratios=[2, 1, 1], # 列宽比例height_ratios=[1, 2] # 行高比例
)ax1 = fig.add_subplot(gs[0, 0]) # 第一行第一列
ax2 = fig.add_subplot(gs[0, 1:]) # 第一行,第二和第三列
ax3 = fig.add_subplot(gs[1, :2]) # 第二行,第一和第二列
ax4 = fig.add_subplot(gs[1, 2]) # 第二行第三列
plt.suptitle("GridSpec")
plt.show()
简单的不规则
-🍁 在plt.subplots中gridspec_kw以字典的类型是说明各个参数的值,width_ratios, height_ratios说明了各个子图的大小。
-🍁 单独再画各个子图。
import matplotlib.pyplot as pltfig, axes = plt.subplots(2, 2, # 2行2列figsize=(8, 6),gridspec_kw={'left': 0.15, # 左侧保留15%空间'right': 0.95, # 右侧保留5%空间'bottom': 0.1, # 底部保留10%空间'top': 0.9, # 顶部保留10%空间'wspace': 0.3, # 列间距'hspace': 0.3, # 行间距'width_ratios': [3, 1], # 第一列宽度是第二列的3倍'height_ratios': [1, 2] # 第二行高度是第一行的2倍}
)
ax = axes.flatten()
ax[0].set_title('axes0')
ax[1].set_title('axes1')
ax[2].set_title('axes2')
ax[3].set_title('axes3')
fig.suptitle("gridspec_kw")
plt.show()