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

subplot语法:

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

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

plt.subplot(nrows, ncols, index)

参数详解:

  1. nrows: 子图的行数。
  2. 这是指整个图形窗口将被分成多少行子图。
  3. ncols: 子图的列数。
  4. 这是指整个图形窗口将被分成多少列表子图。
  5. index: 当前激活的子图位置索引。
  6. 索引从1开始计数,按行优先顺序排列。
  7. 例如,在一个2×2的布局中,索引为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()
示例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()
示例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()

总结

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

    作者:Aa123456789_55

    物联沃分享整理
    物联沃-IOTWORD物联网 » python subplot函数应用 – 创建多个子图

    发表回复