Python-matplotlib库画不规则图

在 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 plt

plt.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的网格位置。

基本参数

参数说明举例
nrowsint 网格的总行数3(创建 3 行网格)
ncolsint 网格的总列数4(创建 4 列网格)
leftfloat 子图区域的左边界(相对于画布宽度的比例,范围 0-1)0.1(左侧保留 10% 空间)
rightfloat 子图区域的右边界(相对于画布宽度的比例)0.9(右侧保留 10% 空间)
bottomfloat 子图区域的下边界(相对于画布高度的比例)0.1
topfloat 子图区域的上边界(相对于画布高度的比例)0.9
wspacefloat 列与列之间的间距(以平均子图宽度的比例表示)0.3(间距为子图宽度的 30%)
hspacefloat 行与行之间的间距(以平均子图高度的比例表示)0.4
width_ratioslist[float] 各列宽度的相对比例[2, 1, 1](第 1 列宽度是后两列的 2 倍)
height_ratioslist[float] 各行高度的相对比例[1, 2](第 2 行高度是第 1 行的 2 倍)
figureFigure 指定要应用 GridSpec 的 Figure 对象(默认使用当前 Figure)fig
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

fig = plt.figure(figsize=(8, 6))

# 创建 GridSpec,设置各种参数
gs = GridSpec(
    nrows=2, ncols=3,           # 2行3列
    figure=fig,                 # 指定 Figure
    left=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 plt

fig, 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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值