【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.rhkb.cn/news/240128.html

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

相关文章

SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理,schema描述等功能,ORM构筑于其上。本章介绍创建 Engine对象,使用基本的…

vscode无法自动补全

前提:安装c/c插件 c/c插件功能非常强大,几乎能满足日常编码过程中常用的功能;因此也包含自动补全的功能,开启方法如下: 文件->首选项->设置: 扩展->c/c->Intellisense,找到Intell…

252:vue+openlayers 绘制锥形渐变填充色的圆形

第252个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有锥形渐变填充色的圆形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共131行)相关API参考专栏目标示例效果 </

【Android开发】不同Activity之间的数据回传实例(一)摘桃子游戏

一、功能介绍 该项目实现的功能主要有&#xff1a; 在首页显示一个按钮点击该按钮跳转到桃园页面在桃园页面&#xff0c;点击桃子会弹窗显示摘到几个桃子&#xff0c;同时被点击桃子消失&#xff0c;总桃子数1点击退出桃园会返回首页&#xff0c;首页桃子数会根据点击的桃子数…

提高支撑座效率的重要性

自动化机械设备在运行过程中需要消耗大量的能源和资源&#xff0c;提高效率意味着更有效地利用这些资源&#xff0c;降低运行成本&#xff0c;而支撑座作为自动化机械设备中重要的传动元件&#xff0c;提高支撑座的效率对于自动化机械设备的可持续发展和企业的竞争力具有重要意…

Python密码本连接wifi

有时候我们会忘记自己的Wi-Fi密码&#xff0c;或者需要连接某个Wi-Fi网络以满足合法需求。本文将介绍如何使用Python编程语言编写一个简单的连接Wi-Fi的程序。 一、密码本准备 在进行wifi猜测时&#xff0c;其实就是列出各种可能的密码&#xff0c;用来尝试去访问目标wifi&…

linux安装QQ(官方正版)

QQ官网上有支持linux系统的版本&#xff0c;所以去官网直接下载正版就好。 安装步骤&#xff1a; 1.进入官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 2.选择版本&#xff1a;X86版下载dep 如下所示&#xff1a; 3.下载qq安装包&#xff1a; 4.使用命令安装qq s…

【踩坑】flask_uploads报错cannot import name ‘secure_filename‘

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 截至目前&#xff0c;用新版的flask实现文件上传(用到flask_uploads库)&#xff0c;会出现这个问题。 问题原因 版本问题&#xff0c;新的werkzeug已经把secure_filename的位置改了。 解决方法 手动修改…

腾讯云学生机云+校园计划详细解读(图文解说)

腾讯云学生服务器优惠活动「云校园」轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置112元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G3M公网带宽配置842.4元一年&#xff0c;腾讯云服务器网txyfwq.com分享2…

【python入门】day27: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

UL2034详细介绍UL 安全单站和多站一氧化碳报警器标准

在介绍相关标准之前先介绍一下UL认证和UL测试报告的区别&#xff0c;检测认证行业6年老司机 UL认证是自愿性的认证&#xff0c;需要检测产品和审核工厂&#xff0c;每个季度审核一次&#xff0c;费用高、时间久&#xff0c;而且审厂非常的严格。 UL测试报告是根据产品选用相应…

Spring Boot - Application Events 的发布顺序_ApplicationFailedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

Matlab字符识别实验

Matlab 字符识别OCR实验 图像来源于屏幕截图&#xff0c;要求黑底白字。数据来源是任意二进制文件&#xff0c;内容以16进制打印输出&#xff0c;0-9a-f’字符被16个可打印字符替代&#xff0c;这些替代字符经过挑选&#xff0c;使其相对容易被识别。 第一步进行线分割和字符…

docker screen 常用基础命令

1.docker基础命令 1.1开启docker systemctl start docker #开启docker service docker restart #重启docker systemctl stop docker #关闭docker 1.2查看命令 docker images #查看docker镜像docker ps #查看正在运行的镜像或者容器docker ps -a #查看所有容器1.3运…

Spring | Spring框架最基本核心的jar包、Spring的入门程序、依赖注入

目录&#xff1a; 1.Spring框架最基本、最核心的jar包2.Spring的入门程序3.依赖注入3.1 依赖注入的概念3.2 依赖注入的实现方式 1.Spring框架最基本、最核心的jar包 Spring是一个轻量级框架&#xff0c;Spring最基本、最核心的的jar包括 : beans、context、core、expression。 …

import { ArrowRight } from “@element-plus/icons-vue“;

今天下午快被这个问题折磨疯了 虽然知道这个问题怎么产生的 但项目里那个碍眼的红线就是去不掉 后来才发现 这是插件的锅 我的心情 你知道我想要说什么的 想必能看到这篇文章的 也知道这个问题是怎么产生的 vue3ts使用的时候 默认是需要带上文件名的 但是引入el组件时 …

CSS 水浪按钮

<template><view class="content"><button class="button"><view class="liquid"></view><view class="btn-txt">水浪按钮</view></button></view></template><scrip…

计算机导论05-计算机网络

文章目录 计算机网络基础计算机网络概述计算机网络的概念计算机网络的功能计算机网络的组成 计算机网络的发展计算机网络的类型 网络体系结构网络互联模型OSI/RM结构与功能TCP/IP结构模型TCP/IP与OSI/RM的比较 网络地址与分配IP地址构成子网的划分IPv6 传输介质与网络设备网络传…

异常处理注解 @ExceptionHandler

今天记录下 SpringBoot 中 ExceptionHandler 的使用。 场景 有一个员工表(employee)&#xff0c;且给表中的 username 属性设置了唯一性。 -- auto-generated definition create table employee (id bigint auto_increment comment 主键primary key,name va…

word写标书的疑难杂症总结

最近在解决方案工作&#xff0c;与office工具经常打交道&#xff0c;各种问题&#xff0c;在此最下记录&#xff1a; 1.word中文档距离文档顶端有距离调整不了 1.疑难杂症问题1&#xff0c;多个空格都是不能解决 #解决办法&#xff1a;word中--布局-下拉框---“版式”--“垂直…