如何在单个Figure中创建两个子图:多曲线子图与单曲线子图
解决Matplotlib左右分栏子图布局问题
要实现左右分栏的子图布局,核心是明确指定每个曲线所属的子图对象,而不是直接用全局的plt.plot(它会默认绘制在当前活跃的子图上)。以下是完整的实现代码和说明:
步骤1:导入依赖库
import numpy as np import matplotlib.pyplot as plt
步骤2:准备数据
- 左侧子图A的x范围(0,5),生成足够多的点保证曲线平滑:
x_a = np.linspace(0, 5, 100) y1 = x_a y2 = 2 * x_a - 1 y3 = 3 * x_a**2 + 2 * x_a - 1
- 右侧子图B的x范围(-0.5,0.5),注意要避开x=0(避免
3*pi/x出现除以0错误):
x_b = np.linspace(-0.5, 0.5, 2000) # 过滤掉x=0的点 x_b = x_b[x_b != 0] y_b = np.sin(3 * np.pi / x_b)
步骤3:创建分栏子图并绘制曲线
使用plt.subplots创建1行2列的子图布局,得到两个子图对象ax1(左侧)和ax2(右侧),然后分别在对应子图上调用plot方法:
# 创建1行2列的子图,figsize设置整体画布大小 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # 左侧子图A绘制3条曲线 ax1.plot(x_a, y1, label='y=x') ax1.plot(x_a, y2, label='y=2x-1') ax1.plot(x_a, y3, label='y=3x²+2x-1') # 添加图例、标题和坐标轴标签 ax1.legend() ax1.set_title('子图A') ax1.set_xlabel('x') ax1.set_ylabel('y') # 右侧子图B绘制曲线 ax2.plot(x_b, y_b, color='red') ax2.set_title('子图B') ax2.set_xlabel('x') ax2.set_ylabel('y') # 调整子图间距,避免标签重叠 plt.tight_layout() # 显示图像 plt.show()
关键说明
- 之前的问题根源是:直接调用
plt.plot会默认使用当前的子图(初始是第一个子图),所以所有曲线都画在了同一个子图里。 - 通过获取子图对象
ax1、ax2,并调用它们的plot方法,就能精准控制每个曲线的绘制位置。
内容的提问来源于stack exchange,提问作者Reza Taheri
相关产品推荐
相关产品推荐

