plt.subplots, 如何设置左右两张子图
时间: 2025-07-12 20:58:25 浏览: 4
<think>我们使用matplotlib的plt.subplots来创建多个子图。要设置左右两张子图,我们可以使用一行两列的子图布局(即1行2列)。下面是一个示例代码,展示如何创建左右两个子图,并分别设置它们的标题和坐标轴标签。同时,我们也会调整子图之间的间距,以避免重叠。</think>在 Matplotlib 中使用 `plt.subplots` 创建左右两张子图的完整方法如下:
```python
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 方法1:创建1行2列的子图布局(水平排列)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # 1行2列
# 设置左侧子图
ax1.plot(x, y1, 'b-', linewidth=2)
ax1.set_title('左侧子图: 正弦函数', fontsize=14)
ax1.set_xlabel('X轴', fontsize=12)
ax1.set_ylabel('sin(x)', fontsize=12)
ax1.grid(True, linestyle='--', alpha=0.7)
# 设置右侧子图
ax2.plot(x, y2, 'r--', linewidth=2)
ax2.set_title('右侧子图: 余弦函数', fontsize=14)
ax2.set_xlabel('X轴', fontsize=12)
ax2.set_ylabel('cos(x)', fontsize=12)
ax2.grid(True, linestyle='-.', alpha=0.7)
# 调整子图间距
plt.tight_layout(pad=3.0) # 增加子图之间的间距
plt.suptitle('左右子图对比', fontsize=16, y=1.02) # 添加总标题
plt.show()
```
### 关键参数详解:
1. **`nrows=1, ncols=2`**:
- 创建1行2列的水平布局(左右排列)
- 返回的`ax1`和`ax2`分别是左右两个坐标轴对象
2. **`figsize=(宽度, 高度)`**:
- 控制整个画布尺寸(宽度建议大于高度的2倍)
- 示例:`(12, 5)` 表示宽12英寸,高5英寸
3. **`tight_layout()`**:
- 自动调整子图间距,防止标签重叠
- `pad`参数控制整体边距
- `w_pad`控制水平间距,`h_pad`控制垂直间距
### 进阶设置:
1. **设置不同比例**:
```python
# 创建不等宽的子图(左侧占70%,右侧占30%)
fig = plt.figure(figsize=(12, 5))
gs = fig.add_gridspec(1, 2, width_ratios=[7, 3])
ax1 = fig.add_subplot(gs[0]) # 左侧宽图
ax2 = fig.add_subplot(gs[1]) # 右侧窄图
```
2. **共享Y轴**:
```python
# 共享Y轴(节省空间)
fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax2.set_ylabel('') # 隐藏右侧Y轴标签
```
3. **添加图例和注释**:
```python
# 在左侧图添加图例
ax1.plot(x, y1, label='sin(x)')
ax1.legend(loc='upper right')
# 在右侧图添加文本注释
ax2.annotate('最小值', xy=(np.pi, -1), xytext=(4, -0.8),
arrowprops=dict(facecolor='black', shrink=0.05))
```
4. **设置不同图表类型**:
```python
# 左侧折线图,右侧散点图
ax1.plot(x, y1)
ax2.scatter(x[::5], y2[::5], c='r', marker='o')
```
5. **保存高质量图像**:
```python
plt.savefig('左右子图.png', dpi=300, bbox_inches='tight')
```
### 常见问题解决:
1. **子图重叠**:使用`plt.tight_layout()`或调整`figsize`
2. **标签遮挡**:增加`pad`参数值(如`tight_layout(pad=4)`)
3. **坐标轴不对齐**:添加`sharex=True`或`sharey=True`参数
4. **子图大小不一致**:使用`GridSpec`的`width_ratios`参数
阅读全文
相关推荐


















