Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局

Matplotlib 是 Python 中最常用的数据可视化库,它提供了强大的功能来绘制不同类型的图表。在实际应用中,通常需要将多个图表绘制在同一个画布上,这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplotlib 来创建多子图布局,包括常见的子图排列方式、子图之间的间距调整以及如何精细控制各个子图的外观。通过这些方法,我们可以在同一窗口中展示多个图表,帮助更好地比较和分析数据。

在这里插入图片描述

目录

  • 什么是多子图布局
  • Matplotlib 子图布局的基础
  • 使用 subplot 创建多子图
  • 使用 subplots 创建多子图
  • 调整子图间距
  • 子图的共享轴
  • 多子图中的绘制与定制
  • 使用 GridSpec 进行灵活布局
  • 如何在子图中添加标题和标签
  • 高级布局技巧与应用
  • 总结与建议

什么是多子图布局

多子图布局是指在一个画布(Figure)上创建多个子区域(Subplot),每个子区域可以独立地显示一个图表。Matplotlib 提供了多个方法来创建多子图布局,这些方法使得多个图表的展示更加直观并且高效。

多子图布局通常用于以下情况:

  1. 比较不同数据:例如,展示不同时间段的数据分布。
  2. 数据多维展示:例如,展示不同参数组合下的表现。
  3. 多维数据分析:例如,在同一窗口中展示不同类型的图表来对比数据。

Matplotlib 子图布局的基础

在 Matplotlib 中,子图的布局是通过 subplot()subplots() 来实现的。

  • subplot() 用于在画布上创建一个单独的子图,并允许你在指定的位置上放置不同的图。
  • subplots() 则是更常用的一种方法,它可以一次性创建多个子图,并返回一个包含所有子图的 axes 对象。

使用 subplot()

subplot() 方法的基本语法如下:

plt.subplot(nrows, ncols, index)
  • nrows:子图的行数。
  • ncols:子图的列数。
  • index:当前子图的位置,从 1 开始按行优先顺序编号。

使用 subplots()

subplots() 方法返回一个包含多个子图的数组,基本语法如下:

fig, axes = plt.subplots(nrows, ncols)
  • fig:返回的 Figure 对象,用于控制整个画布。
  • axes:返回的 Axes 数组,可以通过索引来访问每个子图。

使用 subplot 创建多子图

创建 2 行 2 列的子图

我们可以使用 subplot() 来创建一个 2 行 2 列的布局:

import matplotlib.pyplot as pltplt.figure(figsize=(10, 8))plt.subplot(2, 2, 1)  # 第一个子图
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('子图1')plt.subplot(2, 2, 2)  # 第二个子图
plt.plot([1, 2, 3], [6, 5, 4])
plt.title('子图2')plt.subplot(2, 2, 3)  # 第三个子图
plt.plot([1, 2, 3], [4, 5, 4])
plt.title('子图3')plt.subplot(2, 2, 4)  # 第四个子图
plt.plot([1, 2, 3], [3, 5, 7])
plt.title('子图4')plt.tight_layout()  # 自动调整子图间距
plt.show()

此代码会在一个画布上显示 4 个子图,它们的排列方式为 2 行 2 列。

创建 3 行 3 列的子图

类似地,可以创建一个 3 行 3 列的子图布局:

plt.figure(figsize=(12, 10))for i in range(1, 10):plt.subplot(3, 3, i)plt.plot([1, 2, 3], [i, i+1, i+2])plt.title(f'子图{i}')plt.tight_layout()
plt.show()

使用 subplots 创建多子图

subplots() 方法提供了一种更灵活的方式来创建多个子图,适用于较复杂的布局。

创建 2 行 2 列的子图

fig, axes = plt.subplots(2, 2, figsize=(10, 8))axes[0, 0].plot([1, 2, 3], [4, 5, 6])
axes[0, 0].set_title('子图1')axes[0, 1].plot([1, 2, 3], [6, 5, 4])
axes[0, 1].set_title('子图2')axes[1, 0].plot([1, 2, 3], [4, 5, 4])
axes[1, 0].set_title('子图3')axes[1, 1].plot([1, 2, 3], [3, 5, 7])
axes[1, 1].set_title('子图4')plt.tight_layout()
plt.show()

创建更多子图

fig, axes = plt.subplots(3, 3, figsize=(12, 10))for i, ax in enumerate(axes.flat, 1):ax.plot([1, 2, 3], [i, i+1, i+2])ax.set_title(f'子图{i}')plt.tight_layout()
plt.show()

调整子图间距

创建多个子图时,子图之间的间距可能会影响整体的可读性。Matplotlib 提供了几种方法来调整子图之间的间距:

使用 tight_layout()

tight_layout() 会自动调整子图之间的间距,使得布局更加紧凑:

plt.tight_layout()

手动调整子图间距

我们也可以使用 subplots_adjust() 方法手动控制子图间距:

plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1, wspace=0.3, hspace=0.3)
  • leftrighttopbottom 用于设置子图的边距。
  • wspacehspace 用于控制子图之间的水平和垂直间距。

子图的共享轴

在多个子图之间共享坐标轴有助于更好地比较数据,Matplotlib 允许子图共享 X 轴或 Y 轴,甚至同时共享两者。

共享 X 轴

fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=True)axes[0].plot([1, 2, 3], [4, 5, 6])
axes[0].set_title('子图1')axes[1].plot([1, 2, 3], [6, 5, 4])
axes[1].set_title('子图2')plt.tight_layout()
plt.show()

共享 Y 轴

fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharey=True)axes[0].plot([1, 2, 3], [4, 5, 6])
axes[0].set_title('子图1')axes[1].plot([1, 2, 3], [6, 5, 4])
axes[1].set_title('子图2')plt.tight_layout()
plt.show()

多子图中的绘制与定制

每个子图都是 Axes 对象,它们允许我们进行详细的定制,包括设置标题、标签、图例、网格等。

fig, axes = plt.subplots(2, 2, figsize=(10, 8))axes[0, 0].plot([1, 2, 3], [4, 5, 6])
axes[0, 0].set_title('子图1')
axes[0, 0].set_xlabel('X轴')
axes[0, 0].set_ylabel('Y轴')axes[0, 1].plot([1, 2, 3], [6, 5, 4])
axes[0, 1].set_title('子图2')axes[1, 0].plot([1, 2, 3], [4, 5, 4])
axes[1, 0].set_title('子图3')axes[1, 1].plot([1, 2, 3], [3, 5, 7])
axes[1, 1].set_title('子图4')plt.tight_layout()
plt.show()

使用 GridSpec 进行灵活布局

GridSpec 允许更灵活地调整每个子图的大小和位置,可以在复杂布局中提供更多的控制。

from matplotlib.gridspec import GridSpecfig = plt.figure(figsize=(12, 10))
gs = GridSpec(3, 3, figure=fig)ax1 = fig.add_subplot(gs[0, :])  # 第一行,跨列
ax2 = fig.add_subplot(gs[1, :-1])  # 第二行,除了最后一列
ax3 = fig.add_subplot(gs[1:, -1])  # 最后一列,跨行
ax4 = fig.add_subplot(gs[-1, 0])  # 最后一行,第一列ax1.plot([1, 2, 3], [1, 2, 3])
ax2.plot([1, 2, 3], [3, 2, 1])
ax3.plot([1, 2, 3], [2, 3, 1])
ax4.plot([1, 2, 3], [1, 3, 2])plt.tight_layout()
plt.show()

如何在子图中添加标题和标签

在每个子图中,我们可以分别添加标题、X 轴标签、Y 轴标签,或者图例等。

fig, axes = plt.subplots(2, 2, figsize=(10, 8))axes[0, 0].plot([1, 2, 3], [4, 5, 6])
axes[0, 0].set_title('子图1')
axes[0, 0].set_xlabel('X轴1')
axes[0, 0].set_ylabel('Y轴1')axes[0, 1].plot([1, 2, 3], [6, 5, 4])
axes[0, 1].set_title('子图2')axes[1, 0].plot([1, 2, 3], [4, 5, 4])
axes[1, 0].set_title('子图3')axes[1, 1].plot([1, 2, 3], [3, 5, 7])
axes[1, 1].set_title('子图4')plt.tight_layout()
plt.show()

高级布局技巧与应用

除了常规的布局方式,Matplotlib 还支持复杂的布局,如共享坐标轴、子图间的灵活调整、以及动态更新子图等。通过不断练习这些技巧,您将能够轻松地处理更复杂的可视化任务。


总结与建议

本篇文章介绍了如何使用 Matplotlib 创建多子图布局,包括使用 subplotsubplots 方法、调整子图间距、共享坐标轴以及如何进行细粒度的定制。掌握这些技巧后,您将能够在同一个画布上展示多个图表,以便更好地比较和分析数据。

建议在实际应用中多进行练习,尝

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

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

相关文章

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列:原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下,分布式系统架构愈发复杂,消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”,在古代,各地的信件、物资运…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码:PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 (环境为:本地局域网 无外网情况 ) …

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据,实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍: 1.RabbitMQ 特点: • 基于AMQP&#…

51单片机(二)中断系统与外部中断实验

中断即单片机因为某些原因E暂定现在的工作P0,转去做其他的工作P1,完了之后继续之前的事P0,其他工作P1就是中断程序,原因E就是中断事件,原因由外部发生,程序不能预测到的是硬中断,可以由程度触发…

python-42-使用selenium-wire爬取微信公众号下的所有文章列表

文章目录 1 seleniumwire1.1 selenium-wire简介1.2 获取请求和响应信息2 操作2.1 自动获取token和cookie和agent2.3 获取所有清单3 异常解决3.1 请求url失败的问题3.2 访问链接不安全的问题4 参考附录1 seleniumwire Selenium WebDriver本身并不直接提供获取HTTP请求头(header…

汽车信息安全 -- S32K1如何更新BOOT_MAC

目录 1.安全启动模式回顾 2.为什么要讨论BOOT_MAC 3.S32K1如何更新? 1.安全启动模式回顾 之前提到过,S32K1系列提供了Crypto Service Engine硬件加密模块(简称CSEc),大家可以通过该芯片系统寄存器SDID.FEATURES(System Device Identification Register)来判断自己的片子…

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如,int a 10;、printf("Hello, World!");。分号是语句的一部分,用于…

理解Unity脚本编译过程:程序集

https://docs.unity3d.com/Manual/script-compilation.html 关于Unity C#脚本编译的细节,其中一个比较重要的知识点就是如何自定义Assembly。 预定义的assembly 默认情况下,Unity会按照这个规则进行编译。 PhaseAssembly nameScript files1Assembly-…

Linux内核TTY子系统有什么(6)

接前一篇文章:Linux内核TTY子系统有什么(5) 本文内容参考: Linux TTY子系统框架-CSDN博客 一文彻底讲清Linux tty子系统架构及编程实例-CSDN博客 linux TTY子系统(3) - tty driver_sys tty device driver-CSDN博客 Linux TTY …

《代码随想录》Day31打卡!

《代码随想录》贪心算法:合并区间 本题的完整题目如下所示: 本题的完整思路如下所示: 1.本题依然是先对数组的左边界进行排序。将数组的第一个元素赋值给current。 2.遍历数组,判断current中的右边界和当前元素的左边界是否有重叠…

KL 散度:多维度解读概率分布间的隐秘 “距离”

深入理解KL散度:从多维度全面剖析 损失函数相关文章(置顶) 1. KL 散度:多维度解读概率分布间的隐秘 “距离” 2. 熵与交叉熵:从不确定性角度理解 KL 散度 3. 机器学习、深度学习关于熵你所需要知道的一切 引言 KL散即…

node-sass@4.14.1报错的最终解决方案分享

输入npm i全安装文件所需的依赖的时候,博主是使用sass去书写的,使用的是node-sass4.14.1和sass-loader7.3.1的版本的,安装的时候老是出现错误, node-sass4.14.1版本不再被支持的原因 node-sass 是一个基于 LibSass 的 Node.js 绑…

设计模式(观察者模式)

设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…

PyCharm 的安装与使用(Window)

1 PyCharm 简介 PyCharm 是一款由 JetBrains 公司开发的专门用于 Python 语言开发的集成开发环境(IDE)。以下是其相关介绍: 1.1 特点与功能 智能代码编辑:提供高度智能化的代码编辑器,支持语法高亮、自动补全、代码重…

(vue)el-table-column type=“selection“表格选框怎么根据条件添加禁选

(vue)el-table-column type"selection"表格选框怎么根据条件添加禁选 html <el-table:data"tableData"style"width: 100%"><el-table-columntype"selection"width"55":selectable"checkSelectable">…

C# 之某度协议登录,JS逆向,手机号绑定,获取CK

.NET兼职社区 .NET兼职社区 .NET兼职社区 .NET兼职社区 有需要指导&#xff0c;请私信我留言V或者去社区找客服。

深入Android架构(从线程到AIDL)_20 IPC的Proxy-Stub设计模式02

2、 IBinder接口的一般用途 前言 一般用途 Android的IPC框架仰赖单一的IBinder接口。此时Client端调用IBinder接口的transact()函数&#xff0c;透过IPC机制而调用到远方(Remote)的onTransact()函数。在Java层框架里&#xff0c; IBinder接口实现于Binder基类&#xff0c;如下…

初学stm32 --- ADC单通道采集

目录 ADC寄存器介绍&#xff08;F1&#xff09; ADC控制寄存器 1(ADC_CR1) ADC控制寄存器 2(ADC_CR2) ADC采样时间寄存器1(ADC_SMPR1) ADC采样时间寄存器2(ADC_SMPR2) ADC规则序列寄存器 1(ADC_SQR1) ADC规则序列寄存器 2(ADC_SQR2) ADC规则序列寄存器 3(ADC_SQR3) AD…

FPGA技术的深度理解

目录 引言 FPGA的基本原理 结构组成 工作原理 FPGA的设计流程 设计阶段 编程阶段 实现阶段 FPGA的应用领域 FPGA编程技巧和示例代码 编程技巧 示例代码 结论 引言 FPGA&#xff08;现场可编程门阵列&#xff09;是一种可编程的集成电路&#xff0c;它允许用户根据…

【经典神经网络架构解析篇】【1】LeNet网络详解:模型结构解析、优点、实现代码

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…