python subplot函数应用 - 创建多个子图

subplot语法:

plt.subplot 是 Matplotlib 库中的一个非常有用的函数,用于在一个图形窗口中创建多个子图

plt.subplot 函数用于在当前图形窗口中创建并激活一个子图。其基本语法如下

plt.subplot(nrows, ncols, index)

参数详解:

  1. nrows: 子图的行数。
    • 这是指整个图形窗口将被分成多少行子图。
  2. ncols: 子图的列数。
    • 这是指整个图形窗口将被分成多少列表子图。
  3. index: 当前激活的子图位置索引。
    • 索引从1开始计数,按行优先顺序排列。
    • 例如,在一个2x2的布局中,索引为1表示左上角的第一个子图,索引为2表示右上角的第二个子图,依此类推。

示例和可视化

为了更好地理解这些参数,我们可以通过一些示例来展示不同参数组合的效果

示例1: 1行2列布局
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()
python subplot函数应用 - 创建多个子图_第1张图片
示例2: 2行1列布局
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()
python subplot函数应用 - 创建多个子图_第2张图片
示例3: 2行2列布局
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()

python subplot函数应用 - 创建多个子图_第3张图片

总结

  • nrows: 决定了子图的行数。
  • ncols: 决定了子图的列数。
  • index: 决定了当前激活的子图位置,从1开始计数,按行优先顺序排列。

创建嵌套子图(即“图中图”):

在Matplotlib中,创建嵌套子图(即“图中图”)可以通过使用 plt.axesplt.inset_axes 来实现

方法1: 使用 plt.axes

plt.axes 允许你在现有图形中创建一个新的坐标系,从而实现嵌套子图。

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 提供了一种更灵活的方式来创建嵌套子图,特别是在需要相对于父坐标系进行定位时。

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

进阶编程

根据数据量,自动创建子图

代码示例:

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')

python subplot函数应用 - 创建多个子图_第4张图片

你可能感兴趣的:(图形展示,代码学习,python,开发语言)