深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法

    • 一 add_axes( **kwargs):
      • 1.1 函数介绍
      • 1.2 示例一 创建第一张子图
      • 1.2 示例二 polar参数的运用
      • 1.3 示例三 创建多张子图
    • 二 add_subplot(*args, **kwargs):
      • 2.1 函数介绍
      • 2.2 示例一
    • 三 两种方法的区别
      • 3.1 参数形式
      • 3.2 布局灵活性
      • 3.3 适用场景
      • 3.4 返回对象类型
      • 3.5 类比
    • 四 两种方法的优缺点
      • 4.1 add_axes()
      • 4.2 add_subplot()
    • 五 总结

前言

Hello 大家好!我是甜美的江。

在这里插入图片描述

今天我们将 深入了解Matplotlib中的子图的创建方法

而子图是Matplotlib中的一个重要概念,它们为我们提供了在同一图形中容纳多个独立图表的便捷方式。通过灵活运用子图,我们能够呈现更为丰富和详尽的信息,让数据背后的故事更为生动。

本篇博客将深入探讨Matplotlib中有关在Figure中创建子图的方法。我们将了解如何基于行、列和索引来布局子图。

无论你是数据科学家、工程师还是对数据可视化感兴趣的初学者,这篇博客都将为你提供全面的指导,助你在Matplotlib的世界中游刃有余。让我们开始这段关于子图创作的探险吧!

至于配置子图的各种属性,以及通过不同的绘图方法在子图中展示数据,由于篇幅问题,我将会通过后面的文章展示,也请大家点点关注,不要迷路哦。

在这里插入图片描述

接下来就让我们进入正文吧!

在Matplotlib提供了两种主要的子图创建方法:add_subplot()和add_axes()。

add_subplot()方法通过指定网格的行、列和子图的位置索引来创建子图,
而add_axes()方法则通过指定子图在整个图形区域中的相对位置和大小的方式创建子图。

add_subplot()更适合简单的子图布局,适用于均匀划分的网格结构,而add_axes()则更加灵活,允许直接指定子图的精确位置和大小,适用于复杂和自定义的布局需求。

选择合适的方法取决于具体的绘图目标和布局要求,这两种方法共同为用户提供了在Matplotlib中灵活创建和配置子图的手段。

接下来我们将具体介绍这两种方法。

一 add_axes( **kwargs):

add_axes()方法是Matplotlib中用于在Figure对象中创建子图(Axes对象)的函数。它允许用户以更为灵活的方式指定子图在整个图形区域中的位置和大小。

1.1 函数介绍

语法:

add_axes(rect, projection=None, polar=False, **kwargs)

参数:

  • rect: 用于指定新添加的 Axes 对象的位置和大小,是一个包含四个值的列表或元组,分别表示左、底、宽度和高度。这些值的范围都应该在
    [0, 1] 之间,表示相对于 Figure 的比例。
  • projection: 指定 Axes 对象的投影类型,通常用于创建特定类型的图,例如 3D 图等。默认为 None。
  • polar: 一个布尔值,指定是否使用极坐标系。默认为 False。
  • **kwargs: 其他关键字参数,用于设置 Axes 对象的属性。

返回值:

返回一个Axes对象,可以通过该对象进行进一步的配置和绘制。

类比:

假设我们有一个大的画廊(Figure)代表整个可用的绘图空间。我们想在这个画廊上挂上一些画(Axes对象)。add_axes
方法就像在画廊的特定位置挂上一幅完全自定义大小和位置的画。

在这里插入图片描述

1.2 示例一 创建第一张子图

代码:

import matplotlib.pyplot as plt

# 创建一个画廊(Figure),就像是一面大墙
fig = plt.figure()

# 在画廊上选择一个完全自定义的位置和大小,添加一个新的子图
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.plot([0, 1], [0, 1])
ax.set_title('Custom Painting')

# 展示画廊
plt.show()

代码分析:

在这段代码中,我们使用 Matplotlib 创建一个画廊(Figure),类比为一面大墙,然后在画廊上选择一个完全自定义的位置和大小,添加了一个新的子图(Axes 对象)。

通过 fig.add_axes([0.1, 0.1, 0.8, 0.8]),在画廊的位置(左下角起始点为 (0, 0),右上角为 (1, 1))指定了一个相对位置和大小,创建了一个具有自定义尺寸和位置的子图 ax。

在该子图上,通过 ax.plot([0, 1], [0, 1]) 绘制了一条线,表示画的内容,然后使用 ax.set_title(‘Custom Painting’) 设置了子图的标题为 ‘Custom Painting’。

最后,通过 plt.show() 展示整个画廊,将这个自定义位置和大小的子图呈现在一个窗口中。这种方式使得可以更灵活地控制图形的布局,适用于需要特定尺寸和位置的图形显示场景。

运行结果:

在这里插入图片描述

1.2 示例二 polar参数的运用

代码:

import matplotlib.pyplot as plt
import numpy as np

# 生成一些示例数据
theta = np.linspace(0, 2*np.pi, 100)
r = theta  # 极坐标下的半径

# 创建极坐标图
plt.polar(theta, r, label='Example Polar Plot')

# 添加标题和图例
plt.title('Polar Plot Example')
plt.legend()

# 显示图形
plt.show()

代码分析:

这个例子中,theta 是角度的数组,r 是极坐标下的半径。通过使用 plt.polar() 函数,我们可以创建一个极坐标图。polar=True 参数告诉 Matplotlib 使用极坐标系。

这个简单的例子绘制了一个以角度为横坐标、半径为纵坐标的极坐标图。在这个图中,半径随着角度的增加而增加,因此图形呈螺旋状。

运行结果:
在这里插入图片描述

1.3 示例三 创建多张子图

使用add_axes()方法创建不同位置和大小的多个子图涉及指定每个子图在整个Figure中的位置和大小。

代码:

import matplotlib.pyplot as plt

# 创建Figure对象
fig = plt.figure()

# 使用add_axes()方法创建第一个子图
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])  # 左、底、宽、高的比例

# 使用add_axes()方法创建第二个子图
ax2 = fig.add_axes([0.2, 0.5, 0.4, 0.3])  # 左、底、宽、高的比例

# 对子图进行配置和绘制操作
ax1.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Subplot 1')
ax2.plot([1, 2, 3, 4], [30, 25, 20, 10], label='Subplot 2')

# 显示图例
ax1.legend()
ax2.legend()

# 显示图形
plt.show()

代码分析:

这段代码使用Matplotlib创建了一个包含两个子图的图形。首先,通过plt.figure()创建了一个Figure对象。

然后,使用add_axes()方法分别创建了两个子图ax1和ax2,并通过指定左、底、宽、高的比例来定义它们的位置和大小。

在配置和绘制子图方面,ax1和ax2分别使用plot()方法绘制了不同的曲线,并通过label参数为每个曲线指定标签。

随后,通过ax1.legend()和ax2.legend()分别在两个子图上显示图例。

最后,通过plt.show()显示整个图形。这段代码展示了如何在一个图形中创建多个自定义位置和大小的子图,并在子图上绘制不同的数据,同时添加图例以提供数据标识。

运行结果
在这里插入图片描述
从结果中,我们可以看到,虽然我们成功创建了两张子图,但是很明显,两张子图有着重叠,这也是add_axes()的一个缺点,add_axes()提供了相对底层的接口,需要手动指定每个子图的位置和大小。

对于初学者而言,可能需要花更多的时间理解和调整参数,所以在创建多个子图的时候,建议使用add_subplot()方法,接下来就让我们进入对它的学习吧。

在这里插入图片描述

二 add_subplot(*args, **kwargs):

add_subplot(*args, **kwargs)是Matplotlib中用于在Figure对象中创建子图(AxesSubplot对象)的方法。它允许用户通过指定行数、列数和子图位置索引等参数,在整个图形区域中创建均匀划分的子图网格。

2.1 函数介绍

语法

add_subplot(nrows, ncols, index, **kwargs)

参数

  • nrows: 子图网格的行数。
  • ncols: 子图网格的列数。
  • index: 要添加的子图的位置,从左上角开始逐行逐列计数,例如,3 表示第三个位置。
  • **kwargs: 其他关键字参数,用于设置 Axes 对象的属性。

返回值

返回值是一个AxesSubplot对象。
AxesSubplot是SubplotBase的子类,它表示在Figure中创建的子图。通过返回的AxesSubplot对象,可以对子图进行各种配置和绘制操作,例如添加数据、设置坐标轴标签、调整子图布局等。
这样的对象可以用于在创建的子图上执行各种定制化的任务,使用户能够灵活控制图形的外观和内容。

可以将 add_subplot 方法类比为将一张画布(Figure)分成若干小块,每个小块就是一个子图(Axes)。这个方法是在画布上规划子图的位置和布局,然后返回一个代表特定子图的 Axes 对象,以便在该子图上进行绘图。

类比:画廊的墙上挂画

想象你有一面大墙(Figure),你想在这面墙上挂上几幅画。你可以将这面墙分成若干小块,每个小块就是一个子图(Axes)。

add_subplot 就像是在这面墙上选择一个小块的位置,然后返回一个代表这个小块的画布。

2.2 示例一

import matplotlib.pyplot as plt

# 创建一个画布(Figure),就像是一面大墙
fig = plt.figure()

# 在这面墙上选择一个位置,添加一个子图
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot([0, 1], [0, 1])
ax1.set_title('Painting 1')

# 在另一个位置添加另一个子图
ax4 = fig.add_subplot(2, 2, 4)
ax4.plot([0, 1], [0, -1])
ax4.set_title('Painting 4')

# 继续添加更多子图...

# 调整整个墙上挂画的布局
plt.tight_layout()

# 展示画廊
plt.show()

代码分析:

这段代码使用 Matplotlib 创建一个画布(Figure),类比为一面大墙,然后在墙上选择两个位置并分别添加两个子图。

首先,通过 plt.figure() 创建一个画布 fig,这是整个图形的容器。接着,使用 fig.add_subplot(2, 2, 1) 在画布上选择第一个位置,创建一个子图 ax1,并使用 ax1.plot([0, 1], [0, 1]) 在该子图上绘制一条线。设置子图标题为 ‘Painting 1’。

接着,使用 fig.add_subplot(2, 2, 4) 在画布上选择第四个位置,创建另一个子图 ax4,并使用 ax4.plot([0, 1], [0, -1]) 在该子图上绘制另一条线。设置子图标题为 ‘Painting 4’。

代码中有注释提示可以继续添加更多子图,然后通过 plt.tight_layout() 调整整个画布上挂画的布局,确保子图之间的间距适当。

最后,使用 plt.show() 展示整个画廊,将所有的子图呈现在一个窗口中。这种方式使得可以在同一个画布上创建一个复杂的图形布局,类似于在一面墙上挂多幅画。

运行结果:

在这里插入图片描述

在这个类比中,add_subplot 就是在画廊的墙上选择一个位置,并返回一个代表这个位置的画布。然后,你可以在这个画布上绘制你想要的图像(挂上你想要的画)。通过在不同的位置添加子图,你就可以在一张大墙上创建一个复杂的画廊。

三 两种方法的区别

add_subplot()和add_axes()是Matplotlib中用于创建子图的两种主要方法,它们之间有以下区别:

3.1 参数形式

add_subplot()方法接受行数、列数和子图位置索引等参数,用于在整个图形区域中创建均匀划分的子图网格。

add_axes()方法接受一个包含四个浮点数的列表作为参数,用于指定子图在整个图形区域中的位置和大小。

3.2 布局灵活性

add_subplot()方法适用于创建简单的网格布局子图,它会将图形区域均匀划分为行数乘以列数的网格,并根据指定的索引位置创建子图。

add_axes()方法更加灵活,允许用户直接指定子图的位置和大小,可以实现各种复杂和自定义的布局。

3.3 适用场景

add_subplot()适用于一般的绘图需求,特别是当子图需要按照规则的网格布局时,比较方便和简洁。

add_axes()适用于需要更精确控制子图位置和大小的情况,特别是对于非均匀划分或自定义布局的需求,具有更大的灵活性和定制性。

3.4 返回对象类型

add_subplot()方法返回的是AxesSubplot对象,是SubplotBase的子类,用于操作子图。

add_axes()方法返回的是Axes对象,用于对子图进行各种配置和绘制操作。

总的来说,add_subplot()适用于简单的网格布局,而add_axes()则适用于需要更灵活和精确控制子图位置和大小的情况。选择合适的方法取决于具体的绘图需求和布局要求。

3.5 类比

想象你正在设计一个相册布局,其中包含多张照片。

这个相册是一个整体的画布,而每张照片则是画布上的子图。

在这个情境下,add_subplot()就好比是将相册的画布均匀地分成行数和列数,然后在每个子区域中放置一张照片,形成一个规整的网格。这种方式适用于希望照片按照规则排列的情况,比如按行或按列排列。

而相对应地,add_axes()则像是你手动地选择并指定每张照片在相册上的位置和大小。

这使得你能够更加灵活地设计相册,可以实现非均匀划分的布局,也能够自定义每张照片的具体位置和大小,创造出更为个性化和复杂的相册布局。

这种方式适用于希望有更多设计自由度、精确控制布局的需求,比如要在相册中添加一张大幅照片或者自由排列的小照片。

因此,在这个相册设计的例子中,add_subplot()类似于规则的照片网格布局,而add_axes()提供了更灵活、更自定义的照片摆放方式,适应了不同的设计需求。

四 两种方法的优缺点

4.1 add_axes()

优点:

灵活性:
add_axes()方法提供了很高的灵活性,允许用户直接指定子图的位置和大小。这意味着你可以实现各种复杂和自定义的布局,包括非均匀划分和自由排列的子图。

定制性:
由于你可以精确控制每个子图的位置和大小,因此可以实现非常定制化的布局,适应各种特殊需求和设计。

多子图场景:
适用于需要在同一Figure中创建多个不同位置和大小的子图的场景,每个子图可以独立地进行配置和绘制。

缺点:

相对复杂:
相对于add_subplot()等简单规则布局的方法,add_axes()可能需要更多的手动调整和计算,特别是在创建多个子图时。这可能使代码相对复杂,并增加错误的可能性。

不适用于简单规律布局:
如果你的需求是在整个画布上创建简单的规律布局,像是网格形式的子图,那么add_axes()可能会显得过于繁琐,此时使用add_subplot()可能更为方便。

相对底层:
add_axes()提供了相对底层的接口,需要手动指定每个子图的位置和大小。对于初学者而言,可能需要花更多的时间理解和调整参数。

总体来说,选择使用add_axes()方法还是其他方法取决于你的具体需求。如果你需要更大的灵活性和定制性,并且能够处理较为复杂的布局,那么add_axes()可能是一个不错的选择。如果你的需求是相对简单的规律布局,那么其他方法可能更为便捷。

4.2 add_subplot()

优点:

简单易用:
add_subplot()方法是一种简单而直观的方式创建子图。你只需要指定子图的行数、列数以及子图的索引位置即可,而无需手动指定位置和大小。

规律布局:
适用于需要在整个Figure上创建规律布局的场景,例如网格形式的子图。通过指定行数和列数,Matplotlib会自动计算每个子图的位置,无需手动计算。

易于理解:
对于初学者而言,add_subplot()提供了更为直观的接口,减少了对位置和大小参数的手动调整,有助于降低代码的复杂性。

缺点:

灵活性受限:
相对于add_axes()等方法,add_subplot()的灵活性较低。虽然适用于规律布局,但在需要非常定制化的布局时可能不够灵活。

位置和大小难以调整:
对于每个子图,你只能通过add_subplot()的参数来指定其在整个Figure中的位置,但无法直接控制其大小。如果有对子图位置和大小有更精细要求的情况,可能需要借助其他方法或手动调整。

不适用于复杂布局:
当需要在同一Figure中创建多个不同位置和大小的子图,并且布局较为复杂时,add_subplot()可能显得不够灵活。

总体来说,add_subplot()适用于相对简单的规律布局,提供了一个直观而易用的接口。然而,在需要更大灵活性和定制性的场景下,可能需要使用其他方法,例如add_axes()。选择使用哪种方法取决于你的具体需求和代码的复杂性

五 总结

到这里,我们对Matplotlib中的子图创建方法的学习就完成啦

在这里插入图片描述
在本博客中,我们深入了解了Matplotlib中的子图创建方法,主要聚焦于add_axes()和add_subplot()两种常用方法。这两种方法在创建子图时各具优缺点,选择合适的方法取决于具体的需求和布局要求。

综上所述,了解Matplotlib中的子图创建方法是使用该库进行数据可视化的关键一步。通过熟练掌握这些方法,我们能够更好地控制图形的外观和布局,提高可视化效果和表达能力。希望这篇博客能够为你在Matplotlib中创建子图提供清晰的指导,让您更加自如地进行数据展示和分析。

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是甜美的江,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/357017.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:多项式回归(Python)

多元线性回归闭式解: closed_form_sol.py import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化…

verdaccio搭建npm私服

一、安装verdaccio 注:加上–unsafe-perm的原因是防止报grywarn权限的错 npm install -g verdaccio --unsafe-perm 二、启动verdaccio verdaccio 三、配置文件 找到config.yml一般情况下都在用户下的这个文件夹下面 注:首次启动后才会生成 C:\Users\h…

/etc/profile错误,命令失效

source /etc/profile后所有命令失效 执行 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 修改后 执行:wq! 执行:w !sudo tee %

怎么控制Element的数据树形表格展开所有行;递归操作,打造万能数据表格折叠。

HTML <el-button type"success" size"small" click"expandStatusFun"> <span v-show"expandStatusfalse"><i class"el-icon-folder-opened"></i>展开全部</span><span v-show"expan…

鸿蒙原生应用开发已全面启动,你还在等什么?

2019年&#xff0c;鸿蒙系统首次公开亮相&#xff0c;你们说&#xff0c;等等看&#xff0c;还不成熟&#xff1b; 2021年&#xff0c;鸿蒙系统首次在手机端升级&#xff0c;你们说&#xff0c;等等看&#xff0c;还不完善&#xff1b; 2024年&#xff0c;鸿飞计划发布&#…

STM32以太网接口在TCP/IP通信中的应用案例

在STM32的以太网通信中&#xff0c;TCP/IP协议广泛应用于各种领域&#xff0c;如远程监控、物联网、工业控制等。下面以一个STM32基于TCP/IP协议的以太网通信的应用案例为例进行介绍。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注…

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…

如何使用Python Flask搭建一个web页面并实现远程访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

Java强训day10(选择题编程题)

选择题 public class Test01 {public static void main(String[] args) {try{int i 100 / 0;System.out.print(i);}catch(Exception e){System.out.print(1);throw new RuntimeException();}finally{System.out.print(2);}System.out.print(3);} }编程题 题目1 import jav…

day 59 503.下一个更大元素II 42. 接雨水

vector的扩充要熟悉 vector<int> numsT(nums.begin(),nums.end()); nums.insert(nums.end(),numsT.begin(),numsT.end()); class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;vector<int> nums…

C++入门(一)— 使用VScode开发简介

文章目录 C 介绍C 擅长领域C 程序是如何开发编译器、链接器和库编译预处理编译阶段汇编阶段链接阶段 安装集成开发环境 &#xff08;IDE&#xff09;配置编译器&#xff1a;构建配置配置编译器&#xff1a;编译器扩展配置编译器&#xff1a;警告和错误级别配置编译器&#xff1…

自动驾驶代客泊车AVP决策规划详细设计

背景 随着产品的不断迭代&#xff0c;外部停车场的铺开&#xff0c;PAVP车辆需要应对的场景将越来越复杂&#xff0c;因此整体算法泛化能力的提升显得尤为关键。为了打磨巡航规划的能力&#xff0c;算法架构应当设计的更为灵活&#xff0c;可以针对使用场景迁入更为先进有效的算…

Springboot 快速集成 ES

1、Springboot 官网给出的版本选择标准 2、选择版本依赖 我的 elasticsearch 服务版本为 7.17.13&#xff0c;所以 springboot 版本我选用 2.7.10 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies<…

电脑上如何压缩图片?这个方法简单又方便

电脑上如何压缩图片&#xff1f;我们在需要压缩图片大小的时候&#xff0c;最经常使用的就是下载安装一些图片处理软件&#xff0c;这样的方法不仅耽误时间&#xff0c;有些软件的操作步骤还特别繁琐&#xff0c;对新手小白非常不友好&#xff0c;所以小编今天就给大家介绍一个…

巴厘行记(四)——乌布漫游

欢迎览阅《巴厘行记》系列文章 巴厘行记巴厘行记&#xff08;一&#xff09;——海神庙 巴厘行记&#xff08;二&#xff09;——乌布之夜 巴厘行记&#xff08;三&#xff09;——Auntie和Mudi 巴厘行记&#xff08;四&#xff09;——乌布漫游 巴厘行记&#xff08;五&a…

Spring MVC 基本知识

知识回顾 Tomcat 是 Servlet 容器&#xff0c;会解析 Java Web 应用下的 WEB-INF/web.xml 文件&#xff0c;得到相关的 Servlet 组件。 原理解析 Spring MVC 实际是定义了一个 DispatcherSevlet 来统一管理当前 Web 应用下的 Path 路径。在 DispatchSevlet 中持有了一个 Spr…

Mybatis-plus原生pages分页未生效的解决方案

文章目录 前言原因1、Mybatis Plus版本的问题2、Mapper.xml文件中SQL语句格式问题3、Mybatis Plus默认分页拦截器问题4、分页参数传参问题5、分页配置的问题 解决方案1、升级对应的Mybatis-plus版本分页插件配置问题3、自定义分页拦截器4、正确的参数5、不同版本的配置文件3.4.…

笨蛋总结JVM

笨蛋总结JVM 由于Java语言将自己的内存控制权交给了虚拟机&#xff0c;所以需要了解虚拟机的运行机制 &#xff08;主要用于回顾JVM&#xff09; 笨蛋总结JVM 笨蛋总结JVM1.运行时数据区域线程私有区域程序计数器Java虚拟机栈本地方法栈 线程共享区域堆方法区 1.2程序计数器…

Jmeter学习系列之二:工具面板必知必会

目录 前言 一、菜单栏 二、功能区 ​编辑 2.读入数据 总结 前言 Jmeter面板一共分为4个区域&#xff0c;分别是菜单栏、功能区、视图区和内容区。 菜单栏&#xff1a;主要功能包括新建测计划&#xff0c;添加线程组、测试脚本&#xff0c;分布式运行相关&#xff0c;查看…