【Python数据可视化】matplotlib之设置子图:绘制子图、子图共享x轴坐标、调整子图间距、设置图片大小

文章传送门

Python 数据可视化
matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图
matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值
matplotlib之增加图形内容:设置图例、设置中文标题、设置网格效果
matplotlib之设置子图:绘制子图、子图共享x轴坐标、调整子图间距、设置图片大小
matplotlib之绘制高级图形:散点图、热力图、等值线图、极坐标图
matplotlib之绘制三维图形:三维散点图、三维柱状图、三维曲面图

目录

  • 简述 / 前言
  • 1. 通过 add_subplot 方法绘制子图
  • 2. 通过 subplot 方法绘制子图
  • 3. 两种绘制子图方法的区别
  • 4. 子图嵌套
  • 5. 子图共享x轴坐标
  • 6. 调整子图间距
  • 7. 设置图片大小

简述 / 前言

这篇将分享数据可视化最重要也最常用的一个部分——子图,下面将会分享一些常用的方法:绘制子图、子图共享x轴坐标。


1. 通过 add_subplot 方法绘制子图

首先需要新建一个 figure 对象,然后使用 matplotlib.pyplot.figure().add_subplot() 方法绘制子图。

matplotlib.pyplot.figure().add_subplot() 方法有3个参数,第一个参数是把图表划分为几行,第二个参数是把图表划分为几列,第三个参数是当前图形要放在那个区域,比如下面的 add_subplot(2, 2, 1) 就是指图层被划分为2行2列4个区域,该子图在第一个位置创建。

:图层区域的位置是按照行排序的,即2行2列的区域位置分布如下:

第一个区域(2, 2, 1)      第二个区域(2, 2, 2)
第三个区域(2, 2, 3)      第四个区域(2, 2, 4)

示例:

import matplotlib.pyplot as plt
import numpy as npx = np.arange(0, 10, 0.1)
fig = plt.figure()      # 新建figure对象
# 子图1
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(x, x, label='y=x', color='red')
ax1.legend()
# 子图2
ax2 = fig.add_subplot(2, 2, 3)
ax2.plot(x, 2 * x, label='y=2x', color='blue')
ax2.legend()
# 子图3
ax3 = fig.add_subplot(2, 2, 4)
ax3.plot(x, 4 * x, label='y=4x', color='green')
ax3.legend()
plt.show()

输出:
请添加图片描述

2. 通过 subplot 方法绘制子图

除了使用 matplotlib.pyplot.figure().add_subplot() 方法绘制子图,还能使用 matplotlib.pyplotsubplot() 方法绘制子图。

matplotlib.pyplot.figure().add_subplot() 方法一样,matplotlib.pyplot.subplot() 方法也有3个参数,第一个参数是把图表划分为几行,第二个参数是把图表划分为几列,第三个参数是当前图形要放在那个区域,比如下面的 subplot(2, 2, 1) 就是指图层被划分为2行2列4个区域,该子图在第一个位置创建。

:图层区域的位置是按照行排序的,即2行2列的区域位置分布如下:

第一个区域(2, 2, 1)      第二个区域(2, 2, 2)
第三个区域(2, 2, 3)      第四个区域(2, 2, 4)

示例:

import matplotlib.pyplot as plt
import numpy as npx = np.arange(0, 10, 0.1)
plt.subplot(2, 1, 1)  # 第一个子图在2*1的第1个位置
plt.plot(x, x, label='y=x', color='red')
plt.legend()
plt.subplot(2, 2, 3)  # 第二个子图在2*2的第3个位置
plt.plot(x, 2 * x, label='y=2x', color='green')
plt.legend()
plt.subplot(2, 2, 4)  # 第三个子图在2*2的第4个位置
plt.plot(x, 4 * x, label='y=4x', color='blue')
plt.legend()
plt.show()

输出:
请添加图片描述

3. 两种绘制子图方法的区别

  1. 从上面的两个例子可以看出两张输出的图像还是不同的。

    • matplotlib.pyplot.figure().add_subplot() 方法绘制的子图是完全在一个区域内绘制的;
    • matplotlib.pyplot.subplot() 方法绘制的子图虽然也是在一个区域内绘制,但是若发现附近区域没有绘制子图,它会占据旁边的子图空间,让图像看起来更自然。
  2. 假设我们有4个区域,但是只有1、3、4号区域绘制子图:

    • matplotlib.pyplot.figure().add_subplot() 方法绘制的子图格式如下:
      第一个子图(2, 2, 1)      子图为空!(2, 2, 2)
      第三个子图(2, 2, 3)      第四个子图(2, 2, 4)
      
    • matplotlib.pyplot.subplot() 方法绘制的子图虽然也是在一个区域内绘制,但是若发现附近区域没有绘制子图,它会占据旁边的子图空间,让图像看起来更自然。
           第一个子图(2, 2, 1&2)【把第二个空子图区域合并了】
      第三个子图(2, 2, 3)      第四个子图(2, 2, 4)
      

4. 子图嵌套

方法就是通过调用 figure 对象的 add_axes 方法创建子图,不管是主图还是嵌套图形都用 add_axes 方法创建子图。

用法:matplotlib.pyplot.figure().add_axes(x, y, len_x, len_y),各参数含义如下:

参数含义
x子图x轴距离整张图片在下角多远的位置(水平)
y子图y轴距离整张图片在下角多远的位置(垂直)
len_x子图x轴的长度
len_y子图y轴的长度

以上4个参数的取值范围为:[0, 1],虽然取此范围以外的数字不报错,但是生成的子图将不在图片中。这个其实类似于 HTML 里面的一个相对位置比例,都是相对于整张图片左下角的顶点进行参照的。

值得注意的是,嵌套的子图的参数取值范围应该是:(0, 1)。

不理解的可以自己写代码,调参数画个图就知道了。

示例:

import matplotlib.pyplot as plt
import numpy as npfig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.9, 0.9])			# 大图位置
child_ax = fig.add_axes([0.45, 0.7, 0.2, 0.2])	# 嵌套子图的位置
x = np.arange(0, 10, 0.1)
ax.plot(x, np.sin(x), color='g')
# 子图
childX = np.arange(0, 10, 0.1)
child_ax.plot(childX, np.sin(childX), color='b')
plt.show()

输出:
请添加图片描述

5. 子图共享x轴坐标

顾名思义,这个就是指好几张垂直摆放的图,它们的 x 轴都是一样的,那么我们只要在最下面那一张图画 x 轴就好了。

  • 关键语句:matplotlib.pyplot.subplots()

  • 关键参数:sharex=True

  • 一般用法:figure, (axClass1, axClass2, ...) = matplotlib.pyplot.subplots(nrows=nrows, ncols=ncols, sharex=True, figsize=(len_x, len_y)),各参数含义如下:

    参数含义
    axClass1第一个子图
    axClass2第二个子图
    nrows行数
    nclos列数
    sharex布尔值(默认为:False,每个子图都显示x轴的数值),一般改为:True
    figsize子图大小
    len_x子图长度【一般取值范围为:[1, ∞)】
    len_y子图高度【一般取值范围为:[1, ∞)】

示例:

import matplotlib.pyplot as plt
import numpy as np# 两个子图共享x轴
figure, (axClass1, axClass2) = plt.subplots(2, sharex=True, figsize=(10, 4))x = np.arange(0, 10, 0.1)
axClass1.plot(x, np.sin(x), color='g')
axClass2.plot(x, np.cos(x), color='b')
axClass1.set_title("$sin(x)$")
axClass2.set_title("$cos(x)$")
plt.show()

输出:
请添加图片描述

6. 调整子图间距

虽然我们可以设置很多子图,但是一旦子图过多,那么显示图案就会重叠在一起,比如这样:

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(2024)
data = np.random.rand(100, 2) * 10
x = data[:, 0]
y = data[:, 1]# 新建figure对象
plt.subplot(131)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("原始数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 计算极大值
max_d = np.max(data, axis=0)
# 计算极小值
min_d = np.min(data, axis=0)
# 减去均值,除以标准差
newData = (data - min_d) / (max_d - min_d)
x = newData[:, 0]
y = newData[:, 1]# 新建figure对象
plt.subplot(132)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("归一化后的数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 新建figure对象
plt.subplot(133)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title(f"归一化后的数据\n(放大版)", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.grid()
plt.show()

输出:
请添加图片描述

那么我们可以通过 matplotlib.pyplot.subplots_adjust(wspace=wspace, hspace=hspace) 来调整子图之间的间距,参数解释如下:

参数含义
wspace子图每一列之间的间隔
hspace子图每一行之间的间隔

改进代码:

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(2024)
data = np.random.rand(100, 2) * 10
x = data[:, 0]
y = data[:, 1]# 新建figure对象
plt.subplot(131)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("原始数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 计算极大值
max_d = np.max(data, axis=0)
# 计算极小值
min_d = np.min(data, axis=0)
# 减去均值,除以标准差
newData = (data - min_d) / (max_d - min_d)
x = newData[:, 0]
y = newData[:, 1]# 新建figure对象
plt.subplot(132)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("归一化后的数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 新建figure对象
plt.subplot(133)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title(f"归一化后的数据\n(放大版)", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.grid()# wspace 控制子图列间距, hspace 控制子图横间距
plt.subplots_adjust(wspace=0.5, hspace=0)
plt.show()

输出:
请添加图片描述

7. 设置图片大小

关键方法:matplotlib.pyplot.figure(figsize=(x, y)),x和y为画布的长和宽,可自行调整。

特别注意:该语句要在画图前设置,不能画完图后才写这句话(因为这样就会生成2张画布,画好的画在第一张画布)。

示例:

import numpy as np
import matplotlib.pyplot as pltplt.figure(figsize=(6, 6))np.random.seed(2024)
data = np.random.rand(100, 2) * 10
x = data[:, 0]
y = data[:, 1]# 新建figure对象
plt.subplot(231)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("原始数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 计算极大值
max_d = np.max(data, axis=0)
# 计算极小值
min_d = np.min(data, axis=0)
# 减去均值,除以标准差
newData = (data - min_d) / (max_d - min_d)
x = newData[:, 0]
y = newData[:, 1]# 新建figure对象
plt.subplot(232)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("归一化后的数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 新建figure对象
plt.subplot(233)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title(f"归一化后的数据\n(放大版)", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.grid()# 新建figure对象
plt.subplot(234)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title(f"归一化后的数据\n(放大版)", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.grid()# wspace 控制子图列间距, hspace 控制子图横间距
plt.subplots_adjust(wspace=0.5, hspace=1)
plt.show()

输出:
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open CASCADE学习|显示模型

目录 1、编写代码 Viewer.h Viewer.cpp ViewerInteractor.h ViewerInteractor.cpp helloworld.cpp 2、配置 3、编译运行 1、编写代码 Viewer.h #pragma once ​ #ifdef _WIN32 #include <Windows.h> #endif ​ // Local includes #include "ViewerInteract…

Redis 服务器 命令

目录 1.Redis Client Pause 命令 - 在指定时间内终止运行来自客户端的命令简介语法可用版本: > 2.9.50返回值: 返回 OK。如果 timeout 参数是非法的返回错误。 示例 2.Redis Debug Object 命令 - 获取 key 的调试信息简介语法可用版本: > 1.0.0返回值: 当 key 存在时&…

MySQL下对[库]的操作

目录 创建数据库 创建一个数据库案例&#xff1a; 字符集和校验规则&#xff1a; 默认字符集&#xff1a; 默认校验规则&#xff1a; 查看数据库支持的字符集&#xff1a; 查看数据库支持的字符集校验规则&#xff1a; 校验规则对数据库的影响&#xff1a; 操作数据…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…

树莓派4B+ubuntu20.04+ros1桌面配置(一)

烧录系统至树莓派 下载系统&#xff1a; 方案一 https://ubuntu.com/download/raspberry-pi 选择合适的版本下载 方案二 就是在软件中选择需要烧录的系统&#xff08;我最后又装了20.04的ubuntu server系统&#xff0c;因为22的系统不能装ros1&#xff09; 方案三(采用…

子类的构造函数和析构函数调用顺序

看代码&#xff1a; class A { public:A() { cout << __FUNCTION__ << endl; }~A() { cout << __FUNCTION__ << endl; } };class B { public:B() { cout << __FUNCTION__ << endl; }~B() { cout << __FUNCTION__ << endl; …

学习JavaEE的日子 day11 初识面相对象

day11 1.初识面相对象 1.1 类和对象的理解 类 * 类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合 * 简单理解&#xff1a;类就是对现实事物的一种描述 类的组成 * 属性&#xff1a;指事物的特征&#xff0c;例如&#xff1a;手机事物&#xff08;品牌…

c语言 编译与链接

编译与链接 翻译环境和执行环境翻译环境1.1预编译1.2编译1.3汇编&#xff08;ASM&#xff09;2.链接 执行环境最后给大家附上一张关于本节知识内容的图供大家更好理解~ ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/522d488885ba44d99aa504d6b21c88d5.png) &…

【FastAPI】路径参数(二)

预设值 如果你有一个接收路径参数的路径操作&#xff0c;但你希望预先设定可能的有效参数值&#xff0c;则可以使用标准的 Python Enum 类型。 导入 Enum 并创建一个继承自 str 和 Enum 的子类。通过从 str 继承&#xff0c;API 文档将能够知道这些值必须为 string 类型并且能…

交友系统程序开发,前后端源码交付,允许二开,UI配色新颖,APP小程序H5随心搭配!

在开发设计与测试阶段&#xff0c;主要包括了程序开发、测试和上线运营等环节。根据产品经理确定的功能需求&#xff0c;开发团队开始进行具体的编程和开发工作。这个过程中需要考虑到不同设备、不同系统和不同版本的需求&#xff0c;确保软件可以在不同平台上稳定运行。 测试是…

WiNGPT2突破:国产140亿参数医疗AI模型

模型介绍 WiNGPT2是基于GPT架构开发的医疗垂直领域大模型&#xff0c;其主要目标是将医学知识、医疗信息和数据进行深度融合&#xff0c;以提供智能化的医疗服务。该模型拥有70亿和140亿两种参数规模的版本&#xff0c;使其能够处理更复杂的医疗场景和需求。 Huggingface模型下…

【Docker】Docker基础教程

&#x1f996;我是Sam9029&#xff0c;一个前端 &#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求收藏&#xff0c;求评论&#xff0c;求一个大大的赞&#xff01;&#x1f44d; 基…

嵌入式学习-网络编程-Day4

思维导图 广播通信模型 #include <myhead.h> int main(int argc, char const *argv[]) {int rfd socket(AF_INET,SOCK_DGRAM,0);if(rfd-1){perror("socket error");return -1;}//填充地址信息结构体struct sockaddr_in rin;rin.sin_familyAF_INET;rin.sin_por…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

安泰功率信号源设计方法有哪些

在电子系统中&#xff0c;功率信号源是一个关键的组成部分&#xff0c;用于提供稳定、可靠的电能。这篇文章将详细介绍功率信号源的设计方法&#xff0c;包括选择功率源类型、设计电源拓扑结构、提高效率和管理电磁干扰等方面。 1.功率源类型的选择 选择适当的功率源类型是功率…

MSSQL-识别扩展extended event(扩展事件)中的时间单位

经常使用sqlserver extended event(扩展事件)&#xff0c;但是总是忘记扩展事件使用的时间单位&#xff0c;不确定它们是 秒、毫秒、还是微秒&#xff1f; 以下下代码能够从 相关DMV中提取description字段内容来识别时间单位&#xff1a; SELECT [p].[name] [package_name],[o…

07. 面向对象编程(一)

目录 1、前言 2、类和对象 2.1、定义类 2.2、定义方法 2.3、创建对象 2.4、访问控制 2.4.1、公共变量 2.4.2、私有变量 2.4.3、保护成员 2.4.4、总结 3、封装 4、继承 5、多态 6、小结 1、前言 在Python中&#xff0c;面向对象编程&#xff08;Object-Oriented …

vuex的初步使用-1

1. 介绍 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 简单讲&#xff1a;Vuex 就是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。相对于一个仓库&#xff1a;存放组件共享的数据。 2. 安装 vuex 安装vuex与vue-router类似&…

基于Mapbox的Mvt矢量瓦片集成实践

目录 前言 一、数据说明 1、基本数据 2、属性数据 二、Mapbox集成Mvt矢量瓦片 1、关于访问令牌 2、定义html 3、初始地图 4、加载矢量瓦片 5、效果展示 总结 前言 熟悉矢量瓦片的朋友一定知道&#xff0c;在Webgis当中&#xff0c;矢量瓦片的格式除了pbf的格式&#x…

docker:环境安装

系列文章目录 docker&#xff1a;环境安装 文章目录 系列文章目录前言一、Debian安装1.镜像下载2.VM安装3.Debian安装 二、docker安装1.Debian12换源2.docker安装3.docker测试4.docker换源 总结 前言 因为CentOS7确定停服时间为6月30日&#xff0c;虽然对我这种小虾米没啥影响…