Python Matplotlib教程-Matplotlib 多子图布局

news2025/1/11 22:49:48

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 plt

plt.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 GridSpec

fig = 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.coloradmin.cn/o/2275157.html

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

相关文章

【Java项目】基于SpringBoot的【校园新闻系统】

【Java项目】基于SpringBoot的【校园新闻系统】 技术简介:本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介:主要包括二大功能模块,即用户功能模块和管理员功能模块。系统中的核心用户是管理员,管理员…

c++入门之 命名空间与输入输出

1、命名空间 1.1使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …

【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)

前言 大家好&#xff0c;我是demon 这是demon给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击教程。 本阶段主要讲解XSS攻击获取用户cookie和用户密码。 喜欢的朋友们&#xff0c;记得给晓晓点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 简介 该…

HarmonyOS开发:ArkTS初识

ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript&#xff08;简称TS&#xff09;相似&#xff0c;在TS的生态基础上进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 基本语法概述 扩展能力 基础语法&#xff1a…

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…

【python A* pygame 格式化 自定义起点、终点、障碍】

- pip install pygame test.py(chatgpt版本) 空格键&#xff1a;运行 A* 算法。CtrlC 键&#xff1a;清空路径。CtrlS 键&#xff1a;保存当前地图到 map.json 文件。CtrlL 键&#xff1a;从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…

xfs扩容目录lvm

pve增加磁盘&#xff1a; -bash-4.2# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─centos-root 253:0 …

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包&#xff0c;其会先下载KEGG官网上的通路图&#xff0c;然后整合输入数据对通路图进行再次渲染&#xff0c;从而对KEGG通路图进行一定程度上的个性化处理&#xff0c;并且丰富其信息展示。&#xff08;KEGG在线数…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

【PPT解密】ppt只读文档怎么改成可编辑文档

PPT文档打开是只读模式&#xff0c;如何改成可编辑文档呢&#xff1f;这需要分几种情况来说&#xff0c;所以今天将介绍几种方法帮助PPT只读文档改为可编辑文档。 方法一&#xff1a; 我们可以先查看一下文件属性&#xff0c;属性中有只读属性&#xff0c;当我们打开文档之后…

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…

ROS2+OpenCV综合应用--11. AprilTag标签码跟随

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车车体运动的功能&#xff0c;控制车体从而使摄像头会保持标签码在视觉中间左右运动&#xff0c;在根据物体在摄像头成像近大远小的原理根据这一特性&#xff0c;从而实现标签码跟随功能。 2. 启…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多项式的构造&#xff1a;MATLAB 实现代码&#xff1a;结果如图&#xff1a;注归一化变量的作用&#x…

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况&#xff0c;提供解决IPv6 无法获取的更硬核的方法&#xff0c;需要有ssh 工具。&#xff08;无安卓设备&#xff0c;测试环境win、mac、ios&#xff09; 首先明确一点&#xff0c;就是如果想让你的设备得到GUA 地址&#xff0c;即访问 6.i…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本&#xff1a;关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时&#xff0c;部分文档已经修改&#xff0c;而大部分没有修改&#xff0c;为了减少在众多已打开文档中来回跳转的不便&#xff0c;可以将没有修改的文档全部关闭&#xff0c;但目前提供的快速关闭窗…

IIS部署.NetCore/.Net8/.Net9项目(从装环境到配置Swagger)

一、介绍 随着.NetCore开源、以及版本的更新迭代&#xff0c;.NetCore的性能越来越好、功能也越来越丰富&#xff0c;作为纯后端提供Api已经变得越来越频繁&#xff0c;与之配套的接口组件Swagger也成为很多人的选择。下面介绍在IIS上部署Swagger的详细过程。 二、安装IIS服务…

第R4周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据集可视化4、数据集预处理5、设置X&#xff0c;y6、划分数据集7、构建模型8、定义训练函…

【python自写包模块的标准化方法】

目标: 自写一个包,提供关于字符串和文件的模块 要求对异常可以检测 str_tools.py: def str_reverse(s):""":param s: 传入的字符串:return: 反转后的字符串"""# i -1# j 0# s2 ""# while i > (-len(s)):# s2 s[i]# …

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B&#xff5c;开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行&#xff0c;在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…