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

server/2024/12/22 12:57:01/

subplot语法:

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

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

python">plt.subplot(nrows, ncols, index)

参数详解:

  1. nrows: 子图的行数。
    • 这是指整个图形窗口将被分成多少行子图。
  2. ncols: 子图的列数。
    • 这是指整个图形窗口将被分成多少列表子图。
  3. 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.axesplt.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')


http://www.ppmy.cn/server/152236.html

相关文章

数据仓库有哪些?

数据仓库有多种类型,每种类型都有其特定的应用场景和优势。以下是一些常见的数据仓库类型: 企业数据仓库(EDW): 是最为关键的数据仓库类型,提供一个集中的存储库,集成来自不同来源的数据&#x…

MicroPython+ESP32:五.PC远程控制LED灯

1. 整体思路 2. 代码 # 整体流程 # 1. 链接wifi # 2. 启动网络功能(UDP) # 3. 接收网络数据 # 4. 处理接收的数据import socket import time import network import machinedef do_connect():wlan network.WLAN(network.STA_IF)wlan.active(True)if no…

Apache SeaTunnel 增强对csv读取时分割字段的能力

概述 本次修改基于 SeaTunnel-2.3.4 版本 在产品的业务里面,需要一个通过 CSV 来同步数据的功能,但 SeaTunnel 的 CSV 读取功能,并没有根据 CSV 规则来分隔字符串,而是简单的用换行符来分隔行,用 String.split 方法来分…

【序】前端监控:打造高效稳定的用户体验

前端监控:打造高效稳定的用户体验 为什么需要前端监控? 在现代前端开发中,用户体验至关重要。无论是页面性能问题、JavaScript 报错,还是网络请求的失败,都可能影响用户的满意度。前端监控可以帮助我们: …

Android-相对布局RelativeLayout

相对布局在摆放子视图位置时,按照指定的参考系来摆放子视图的位置,默认以屏幕左上角(0,0)位置作为参考系摆放位置 了解一下接下来都会以代码的方式可视化出来 属性 可选值 说明 layout_alignParentTop true/false 是否让控件相对于父容器顶部对齐 …

【Rust自学】4.2. 所有权规则、内存与分配

4.2.0 写在正文之前 在学习了Rust的通用编程概念后,就来到了整个Rust的重中之重——所有权,它跟其他语言都不太一样,很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有三小节: 所有权&#xff1…

弹性裸金属服务器(神龙):助力企业腾飞的云计算“黑科技”

在云计算飞速发展的今天,企业对于计算资源的需求早已不再满足于简单的“够用”,而是追求极致的性能、灵活的伸缩和数据安全的保障。那么,问题来了:如何在性能与弹性之间取得完美的平衡? 答案就是——阿里云弹性裸金属…

负载均衡+LNMP+rsync+NFS+lsync部署流程

负载均衡LNMPNFSrsynclsync部署流程 文章目录 负载均衡LNMPNFSrsynclsync部署流程服务器准备需求配置过程1.nfs服务器配置动态资源公共存储磁盘/data/wordpress2.db01服务器配置存放静态资源的数据库服务3.web两台服务器部署nginxPHP服务4.web两台服务器编写业务配置文件&#…