【matplotlib】 图解pyplot figure、subplot、axes、axis的区别

本文详细介绍了matplotlib.pyplot中figure、subplot、axes和axis的区别。figure用于创建或调用画图板,axes指定图形区的位置和大小,subplot是图形区的高级封装,axis设置图形的视窗大小。文章强调了就近原则和缺省资源的概念,并通过实例解析了这些概念。

码字不易,未经授权谢绝转载!

图解matplotlib.pyplot figure、subplot、axes、axis的区别


基本概念

用matplotlib.pyplot绘图需要知道以下几个概念:

画图板/画布:这是一个基础载体,类似实际的画图板,用pyplot.figure()函数创建,程序中允许创建多个画图板,具体操作的画板遵循就近原则(操作是在最近一次调用的画图板上实现),缺省条件下内部默认调用pyplot.figure(1)。

图形区/绘图区:用来绘图的实际区域,一般不直接获取,直接设定方式为pyplot.axes([x, y, w, h]),即axes函数直接确定了该区域在画图板/画布中的位置为x,y 尺寸为w,h

标签区:用来展示图形相关标签的地方,一般不直接设定(未仔细研究过),该区域根据图形区进行扩展,与该区域有关联的函数是pyplot.xlabel()、pyplot.ylabel()、pyplot.title()等

以上描述如下图所示

对比

figure (1) VS figure()

figure()操作就是创建或者调用画图板,缺省情况下系统会创建figure(1)作为画图板。使用时遵循就近原则,所有画图操作是在最近一次调用的画图板上实现。

axes() VS subplot()

pyplot.axes([x, y, w, h])是用来在画图板上确认图形区的位置和大小的函数,x,y表示图形区左下角相对于画图板的坐标,w,h表示图形区的宽高。(缺省时该操作在figure(1)上操作)

pyplot.subplot(abc)本质也是用来确认图形区在画图板上位置大小的函数,区别是该函数将画图板按a行b列等分,然后逐行编号,并选择编号为c的区域作为图形区用来绘图。这是一个axes()操作的高级封装,方便用户使用。subplot(233)表示2行3列的第3个位置(即,第1行第三个区域)

注:subplot重复操作时如果前后两次的划分方式不一致时,会做必要的历史图形清理。

同时,pyplot.show()实际展示的区域是画图板上所有图形区的最小包围区,不是整个画图板,即如果仅仅调用了subplot(224)结果只展示右下角的4号区域,而不是1、2、3、4都展示,因此会存在一定的错觉。

axes() VS axis()

axes([x, y, w, h])用来设定图形区

axis([x_left, x_right, y_bottom, y_top])是用来设置所绘制图形的视窗大小的,表示直接展示的图形是需要满足参数中范围的值,直观表现是绘图区实际展示的坐标范围。

注:axis作用的图形区依旧遵守就近原则。

subplot() VS plot()

subplot用来生成图形区

plot是实际使用的绘图函数,类似的函数还有hist等,plot操作遵守就近原则,即作用在最近一次使用的图形区上。

 

缺省资源

缺省是指无主动指明的情况下,系统自动提供的资源。

画图板的缺省是:figure(1)

图形区的缺省是:subplot(111)

 

就近原则

就近原则:在每个函数操作时对上一层资源的依赖遵守最近原则,举例如下:

subplot()作用在最近使用的画图板上,有可能是缺省的画图板figure(1)。

axes()作用在最近使用的画图板上,有可能是缺省的画图板figure(1)。

axis()作用在最近使用的图形区上,可能来自subplot、axes等

plot()作用在最近使用的图形区上,可能来自subplot、axes等

 

更多的参考链接:

matplotlib.pyplot 绘图基础结构分析

### 导入matplotlib.pyplot库的作用 在使用CIFAR10数据集训练卷积神经网络模型的代码中,导入`matplotlib.pyplot`库主要有以下作用: - **数据可视化**:可以显示CIFAR10数据集中的图像,帮助直观了解数据集的内容。例如,显示训练集前9个图像,能对数据有一个初步的认识,方便后续的模型训练和调试工作 [^1]。 ```python import matplotlib.pyplot as plt import torchvision import torchvision.transforms as transforms # 定义数据预处理 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # 加载训练集 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) # 显示训练集前9个图像 fig, axes = plt.subplots(3, 3, figsize=(6, 6)) for i in range(9): img, label = trainset[i] img = img / 2 + 0.5 # 反归一化 img = img.numpy().transpose((1, 2, 0)) axes[i // 3, i % 3].imshow(img) axes[i // 3, i % 3].axis('off') plt.show() ``` - **训练结果可视化**:可以绘制训练过程中的损失曲线、准确率曲线等,帮助分析模型的训练情况。通过观察这些曲线,能够判断模型是否收敛、是否过拟合等,从而对模型进行调整和优化 [^1]。 ```python import matplotlib.pyplot as plt # 假设train_losses和train_accuracies分别是训练过程中的损失和准确率列表 train_losses = [1.5, 1.2, 1.0, 0.8, 0.6] train_accuracies = [0.3, 0.4, 0.5, 0.6, 0.7] # 绘制损失曲线 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.plot(train_losses, label='Training Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() # 绘制准确率曲线 plt.subplot(1, 2, 2) plt.plot(train_accuracies, label='Training Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() plt.show() ``` ### 可能出现的问题及解决方法 #### 1. 库未安装 问题描述:在导入`matplotlib.pyplot`库时,可能会出现`ModuleNotFoundError`错误,提示找不到该模块。 解决方法:使用`pip`或`conda`安装`matplotlib`库。 ```bash pip install matplotlib ``` 或 ```bash conda install matplotlib ``` #### 2. 图形显示问题 问题描述:在某些环境中,如服务器环境或某些IDE中,可能会出现图形无法正常显示的问题,例如弹出空白窗口或无响应。 解决方法: - 对于服务器环境,可以使用`matplotlib`的非交互式后端,如`Agg`,将图形保存为文件。 ```python import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt # 绘制图形 plt.plot([1, 2, 3, 4]) plt.savefig('plot.png') ``` - 对于某些IDE,可以尝试更新`matplotlib`版本或检查IDE的图形显示设置。 #### 3. 中文显示问题 问题描述:在图形中使用中文标签时,可能会出现乱码的情况。 解决方法:设置`matplotlib`的字体为支持中文的字体,如`SimHei`。 ```python import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 设置字体 plt.rcParams['font.family'] = 'SimHei' # 绘制包含中文标签的图形 plt.plot([1, 2, 3, 4]) plt.xlabel('横轴') plt.ylabel('纵轴') plt.title('示例图形') plt.show() ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值