Matplotlib绘制子图subplot+自定义子图网格布局subplot2grid

本文介绍如何使用Matplotlib的subplot和subplot2grid函数创建子图,详细解释了subplot的参数设定及subplot2grid的网格布局技巧,帮助读者掌握更灵活的绘图布局。

一、 subplot绘制子图

使用matplotlib绘图时通常会绘制子图用于清晰展示,我们通过subplot来绘制子图位置即可。
subplot通常用来定位的参数有三个(行数,列数,子图索引),三个参数用‘,’隔开,也可简化不写“,” 实例代码例如:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
def f(x):
    '''定义要绘制的函数'''
    return x**2


plt.figure(figsize=(10,10))#设置画布大小
x= np.linspace(0,2)
# 将画布分成2x1的布局,占用第1个(即第2行第1列的子图)
plt.subplot(211)
plt.plot(x,f(x))
plt.title("第一幅子图")
# 将画布分成2x3的布局,占用第4个(即第2行第1列的子图)
plt.subplot(234)
plt.plot(x,f(x))
plt.title("第二幅子图")
# 将画布分成2x3的布局,占用第5个(即第2行第2列的子图)
plt.subplot(235)
plt.plot(x,f(x))
plt.title("第三幅子图")

在这里插入图片描述
但是这种方法有个缺点,比如我想把上述的第三幅子图占据后面的两个子图的位置,用subplot的三个参数是无法做到的,那么这时我们就需要子图的网格布局

二、自定义网格布局subplot2grid

2.1参数说明

subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)

shape:网格的尺寸
loc:绘制子图位置
rowspan:轴向下跨距的列数。
colspan:轴向右跨距的行数。

2.2示例

为了实现让第三幅子图占两行,我们使用subplot2grid进行网格布局,

plt.figure(figsize=(12,8))

#在2行3列的表格中,第一行第一列的位置绘制一个轴向右跨距为3的子图
plt.subplot2grid((2,3) ,(0, 0), colspan=3)
plt.title("第一幅子图")
plt.plot(x,f(x))

#在2行3列的表格中,第2行第1列的位置绘制一个子图
plt.subplot2grid((2,3), (1, 0))
plt.title("第二幅子图")
plt.plot(x,f(x))

plt.subplot2grid((2,3) ,(1, 1), colspan=2)
plt.title("第三幅子图")
plt.plot(x,f(x))

在这里插入图片描述

更多布局:

fig = plt.figure(figsize=(15,15))
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.set_title("第一幅子图")
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax2.set_title("第二幅子图")
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax3.set_title("第三幅子图")
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.set_title("第四幅子图")
ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.set_title("第五幅子图")
plt.show()

在这里插入图片描述

<think>我们被要求回答关于matplotlib设置参数的方法。根据提供的引用,我们可以总结出几种设置的方法和参数。 引用中提到了几种创建的方法: 1. 使用`plt.subplot()`函数,通过指定行数、列数和位置索引来创建(如引用[2]和[4]所示)。 2. 使用`figure.add_subplot()`方法(引用[1])。 3. 使用`gridspec`模块进行更复杂的布局(引用[3]和[5])。 4. 使用`plt.subplots()`函数(虽然引用中没有直接示例,但这是常用方法,我们也可以提及)。 另外,我们还可以调整之间的间距,如引用[4]中使用了`plt.subplots_adjust()`。 因此,我们可以从以下几个方面回答: 1. 使用`plt.subplot()`创建单个2. 使用`plt.subplots()`一次性创建多个(返回一个包含所有的数组)。 3. 使用`gridspec`进行复杂布局。 4. 调整间距的参数(如hspace, wspace, left, right, top, bottom等)。 注意:用户的问题是关于“设置参数”的方法,所以我们需要重点介绍创建时或创建后可以调整哪些参数。 根据引用,我们可以总结如下参数设置: - 创建时,可以指定的位置(行、列、索引)。 - 使用`subplots_adjust`调整之间的间距以及与边界的距离。 - 使用`tight_layout`自动调整参数以避免重叠。 另外,在`gridspec`中,我们可以通过设置`width_ratios`和`height_ratios`来调整的大小比例。 下面我们将组织回答: 1. 介绍基本方法:`plt.subplot()`和`figure.add_subplot()` 2. 介绍`plt.subplots()`方法 3. 介绍`gridspec`方法 4. 调整间距和边距的方法(`subplots_adjust`和`tight_layout`) 注意:我们使用中文回答,并且按照要求,行内数学公式用$...$,独立公式用$$...$$(但这个问题可能较少涉及数学公式,我们视情况使用)。 同时,我们需要生成相关问题。 我们参考引用中的示例代码,但注意不要直接复制,而是总结方法。</think>### Matplotlib 参数设置方法详解 在 Matplotlib 中设置参数主要通过以下几种方法实现: #### 1. **`plt.subplot()` 基础方法** 通过指定网格布局的行数、列数和当前位置索引来创建: ```python import matplotlib.pyplot as plt # 创建 2x2 网格的 plt.subplot(2, 2, 1) # 第1行第1列 plt.plot([1,2,3], label='1') plt.title("1") plt.subplot(2, 2, 2) # 第1行第2列 plt.scatter([1,2,3], [3,2,1]) plt.title("2") plt.subplot(2, 2, 3) # 第2行第1列 plt.bar(['A','B','C'], [5,7,3]) plt.title("3") plt.tight_layout() # 自动调整间距 plt.show() ``` 参数说明: - 前两个参数:网格的行数和列数(如 $2\times2$) - 第三个参数:位置索引(从1开始) - 可简写为三位数格式如 `plt.subplot(223)`[^4] #### 2. **`plt.subplots()` 面向对象方法** 一次性创建网格布局并返回数组: ```python fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,8)) # 设置参数 axes[0,0].plot(x, y1, color='blue') axes[0,0].set_title('正弦函数', fontsize=12) axes[0,1].scatter(x, y2, color='red') axes[0,1].set_xlabel('X轴', fontsize=10) # 设置全局参数 fig.suptitle('多示例', fontsize=16) fig.subplots_adjust(wspace=0.3, hspace=0.4) # 调整间距 ``` 关键参数: - `nrows`/`ncols`:行列数 - `figsize`:画布尺寸 $(width, height)$ - `sharex`/`sharey`:共享坐标轴 #### 3. **`GridSpec` 高级布局** 实现不规则布局: ```python import matplotlib.gridspec as gridspec fig = plt.figure(figsize=(12,6)) gs = gridspec.GridSpec(2, 3, width_ratios=[1,2,1], height_ratios=[2,1]) ax1 = fig.add_subplot(gs[0,:]) # 首行全宽 ax1.plot(x, y1) ax2 = fig.add_subplot(gs[1,0]) # 第二行第一列 ax2.hist(data) ax3 = fig.add_subplot(gs[1,1:]) # 第二行后两列 ax3.boxplot(data) ``` 布局参数: - `width_ratios`:列宽比例 $[w_1, w_2, ...]$ - `height_ratios`:行高比例 $[h_1, h_2, ...]$ - 索引切片:`gs[行范围, 列范围]`[^5] #### 4. **间距调整方法** ```python # 整体调整(适用于所有) plt.subplots_adjust( left=0.1, # 左边距 right=0.9, # 右边距 bottom=0.1, # 底边距 top=0.9, # 顶边距 wspace=0.4, # 水平间距 hspace=0.3 # 垂直间距 ) # 自动调整(推荐) plt.tight_layout(pad=3.0) # pad参数控制边距 ``` #### 5. **专属参数设置** 每个可单独设置: ```python ax = plt.subplot(111) ax.set(xlim=(0,10), # 坐标轴范围 ylabel='Y标签', # 轴标签 title='主标题', # 标题 facecolor='#f0f0f0') # 背景色 ax.grid(True, linestyle='--') # 网格线 ``` ### 关键参数总结表 | 参数类型 | 方法 | 常用参数 | |----------------|---------------------|-----------------------------------| | 布局定义 | `subplot()` | 行数, 列数, 索引 | | | `subplots()` | nrows, ncols, figsize | | | `GridSpec()` | width_ratios, height_ratios | | 间距调整 | `subplots_adjust()` | left, right, wspace, hspace | | | `tight_layout()` | pad, h_pad, w_pad | | 属性 | `ax.set()` | xlabel, ylim, title, facecolor | [^1]: `add_subplot()` 是 Matplotlib 中创建的核心方法 [^2]: 基础布局示例展示多种表类型 [^3]: `GridSpec` 提供灵活的网格布局能力 [^4]: `subplot(221)` 简写格式说明 [^5]: 复杂网格布局的切片索引方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demonslzh6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值