subplot语法:
plt.subplot
是 Matplotlib 库中的一个非常有用的函数,用于在一个图形窗口中创建多个子图
plt.subplot
函数用于在当前图形窗口中创建并激活一个子图。其基本语法如下:
python">plt.subplot(nrows, ncols, index)
参数详解:
- nrows: 子图的行数。
- 这是指整个图形窗口将被分成多少行子图。
- ncols: 子图的列数。
- 这是指整个图形窗口将被分成多少列表子图。
- index: 当前激活的子图位置索引。
- 索引从1开始计数,按行优先顺序排列。
- 例如,在一个2x2的布局中,索引为1表示左上角的第一个子图,索引为2表示右上角的第二个子图,依此类推。
示例和可视化
为了更好地理解这些参数,我们可以通过一些示例来展示不同参数组合的效果
示例1: 1行2列布局
python">import matplotlib.pyplot as plt# 创建一个1行2列的子图布局
plt.figure(figsize=(12, 6))# 第一个子图
plt.subplot(1, 2, 1)
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('Subplot 1')# 第二个子图
plt.subplot(1, 2, 2)
plt.plot([1, 2, 3], [6, 5, 4], color='orange')
plt.title('Subplot 2')plt.tight_layout()
plt.show()
示例2: 2行1列布局
python">import matplotlib.pyplot as plt# 创建一个2行1列的子图布局
plt.figure(figsize=(6, 12))# 第一个子图
plt.subplot(2, 1, 1)
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('Subplot 1')# 第二个子图
plt.subplot(2, 1, 2)
plt.plot([1, 2, 3], [6, 5, 4], color='orange')
plt.title('Subplot 2')plt.tight_layout()
plt.show()
示例3: 2行2列布局
python">import matplotlib.pyplot as plt# 创建一个2行2列的子图布局
plt.figure(figsize=(12, 12))# 第一个子图
plt.subplot(2, 2, 1)
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('Subplot 1')# 第二个子图
plt.subplot(2, 2, 2)
plt.plot([1, 2, 3], [6, 5, 4], color='orange')
plt.title('Subplot 2')# 第三个子图
plt.subplot(2, 2, 3)
plt.plot([1, 2, 3], [7, 8, 9], color='green')
plt.title('Subplot 3')# 第四个子图
plt.subplot(2, 2, 4)
plt.plot([1, 2, 3], [9, 8, 7], color='red')
plt.title('Subplot 4')plt.tight_layout()
plt.show()
总结
nrows
: 决定了子图的行数。ncols
: 决定了子图的列数。index
: 决定了当前激活的子图位置,从1开始计数,按行优先顺序排列。
创建嵌套子图(即“图中图”):
在Matplotlib中,创建嵌套子图(即“图中图”)可以通过使用 plt.axes
或 plt.inset_axes
来实现
方法1: 使用 plt.axes
plt.axes
允许你在现有图形中创建一个新的坐标系,从而实现嵌套子图。
python">import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图
import numpy as np # 导入NumPy库,用于数值计算# 创建主图形
fig, ax = plt.subplots(figsize=(8, 6)) # 创建一个大小为8x6英寸的图形窗口,并返回图形对象和轴对象# 主图形数据
x = np.linspace(-10, 10, 400) # 创建从-10到10的400个等间距点
y = np.sin(x) # 计算这些点对应的sin(x)值# 绘制主图形
ax.plot(x, y, label='sin(x)', color='blue') # 绘制sin(x)曲线,并标注为'sin(x)',颜色为蓝色
ax.set_title('Main Plot: sin(x)') # 设置主图形标题为'Main Plot: sin(x)'
ax.set_xlabel('x') # 设置X轴标签为'x'
ax.set_ylabel('sin(x)') # 设置Y轴标签为'sin(x)'
ax.legend() # 显示图例
ax.grid(True) # 显示网格# 创建嵌套子图
inset_ax = fig.add_axes([0.5, 0.5, 0.3, 0.3]) # 在主图形中添加一个新的坐标系,位置和大小由[left, bottom, width, height]指定# 嵌套子图数据
x_inset = np.linspace(-2, 2, 400) # 创建从-2到2的400个等间距点
y_inset = np.cos(x_inset) # 计算这些点对应的cos(x)值# 绘制嵌套子图
inset_ax.plot(x_inset, y_inset, label='cos(x)', color='red') # 绘制cos(x)曲线,并标注为'cos(x)',颜色为红色
inset_ax.set_title('Inset Plot: cos(x)') # 设置嵌套子图标题为'Inset Plot: cos(x)'
inset_ax.set_xlabel('x') # 设置X轴标签为'x'
inset_ax.set_ylabel('cos(x)') # 设置Y轴标签为'cos(x)'
inset_ax.legend() # 显示图例
inset_ax.grid(True) # 显示网格plt.show() # 显示图形
方法2: 使用 plt.inset_axes
plt.inset_axes
提供了一种更灵活的方式来创建嵌套子图,特别是在需要相对于父坐标系进行定位时。
python">import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图
import numpy as np # 导入NumPy库,用于数值计算
from mpl_toolkits.axes_grid1.inset_locator import inset_axes # 导入inset_axes函数# 创建主图形
fig, ax = plt.subplots(figsize=(8, 6)) # 创建一个大小为8x6英寸的图形窗口,并返回图形对象和轴对象# 主图形数据
x = np.linspace(-10, 10, 400) # 创建从-10到10的400个等间距点
y = np.sin(x) # 计算这些点对应的sin(x)值# 绘制主图形
ax.plot(x, y, label='sin(x)', color='blue') # 绘制sin(x)曲线,并标注为'sin(x)',颜色为蓝色
ax.set_title('Main Plot: sin(x)') # 设置主图形标题为'Main Plot: sin(x)'
ax.set_xlabel('x') # 设置X轴标签为'x'
ax.set_ylabel('sin(x)') # 设置Y轴标签为'sin(x)'
ax.legend() # 显示图例
ax.grid(True) # 显示网格# 创建嵌套子图
inset_ax = inset_axes(ax, width="30%", height="30%", loc='upper right') # 在主图形中添加一个新的坐标系,宽度和高度为原图形的30%,位置在右上角# 嵌套子图数据
x_inset = np.linspace(-2, 2, 400) # 创建从-2到2的400个等间距点
y_inset = np.cos(x_inset) # 计算这些点对应的cos(x)值# 绘制嵌套子图
inset_ax.plot(x_inset, y_inset, label='cos(x)', color='red') # 绘制cos(x)曲线,并标注为'cos(x)',颜色为红色
inset_ax.set_title('Inset Plot: cos(x)') # 设置嵌套子图标题为'Inset Plot: cos(x)'
inset_ax.set_xlabel('x') # 设置X轴标签为'x'
inset_ax.set_ylabel('cos(x)') # 设置Y轴标签为'cos(x)'
inset_ax.legend() # 显示图例
inset_ax.grid(True) # 显示网格plt.show() # 显示图形
总结
plt.axes
: 直接在图形中添加一个新的坐标系,位置和大小由[left, bottom, width, height]
指定。plt.inset_axes
: 更灵活地在现有轴中添加嵌套子图,支持相对定位和百分比大小。- 详情:matplotlib.figure.Figure.text — Matplotlib 3.9.3 documentation
进阶编程
根据数据量,自动创建子图
代码示例:
python">import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图
import math # 导入math库,用于数学计算def sigmoid(x): # 定义Sigmoid函数return 1 / (1 + np.exp(-x)) # 返回Sigmoid函数的结果def sigmoid_derivative(x): # 定义Sigmoid函数的导数s = sigmoid(x) # 计算Sigmoid函数的值return s * (1 - s) # 返回Sigmoid函数导数的结果# 示例数据集
datasets = [{'name': 'Dataset 1', 'data': np.linspace(-10, 10, 400)}, # 数据集1{'name': 'Dataset 2', 'data': np.linspace(-5, 5, 400)}, # 数据集2{'name': 'Dataset 3', 'data': np.linspace(-2, 2, 400)}, # 数据集3{'name': 'Dataset 4', 'data': np.linspace(0, 10, 400)}, # 数据集4{'name': 'Dataset 5', 'data': np.linspace(0, 10, 400)}, # 数据集5{'name': 'Dataset 6', 'data': np.linspace(0, 10, 400)}, # 数据集6# {'name': 'Dataset 7', 'data': np.linspace(0, 10, 400)}, # 数据集4
# {'name': 'Dataset 8', 'data': np.linspace(0, 10, 400)}, # 数据集5
# # {'name': 'Dataset 9', 'data': np.linspace(0, 10, 400)} # 数据集6
]# 计算子图的行数和列数
num_plots = len(datasets) # 获取数据集的数量
cols = int(math.ceil(math.sqrt(num_plots))) # 计算列数,取平方根后向上取整
rows = int(math.ceil(num_plots / cols)) # 计算行数,确保所有数据集都能放入子图中# 创建图形窗口
plt.figure(figsize=(cols * 6, rows * 6)) # 创建一个新的图形窗口,大小根据子图数量调整for i, dataset in enumerate(datasets): # 遍历每个数据集x = dataset['data'] # 获取当前数据集的数据y = sigmoid(x) # 计算Sigmoid函数值dy = sigmoid_derivative(x) # 计算Sigmoid函数导数值# 激活下一个子图plt.subplot(rows, cols, i + 1) # 激活第(i+1)个子图plt.plot(x, y, label='Sigmoid Function') # 绘制Sigmoid函数曲线,并标注为'Sigmoid Function'plt.plot(x, dy, label='Derivative of Sigmoid', color='orange') # 绘制Sigmoid函数导数曲线,并标注为'Derivative of Sigmoid',颜色为橙色plt.title(f'{dataset["name"]} - Sigmoid and Derivative') # 设置图形标题为当前数据集名称plt.xlabel('x') # 设置X轴标签为'x'plt.ylabel('Value') # 设置Y轴标签为'Value'plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 显示图例 ,bbox_to_anchor=(1.05, 1),把图例放在图外plt.grid(True) # 显示网格plt.tight_layout() # 自动调整子图参数,使其填充整个图像区域
# plt.show() # 显示图形
plt.savefig('test.png')