锋哥原创的Matplotlib3 Python数据可视化视频教程:

2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili

课程介绍


本课程讲解利用python进行数据可视化 科研绘图-Matplotlib,学习Matplotlib图形参数基本设置,绘图参数及主要函数,以及Matplotlib基础绘图,和Matplotlib高级绘图。

多子图及布局实现

Matplotlib 提供了多种创建多子图布局的方式,适用于数据对比、多维度可视化等场景。以下是三种核心方法及示例:

方法一:plt.subplots()(推荐)

适用场景:创建均匀网格布局的子图

plt.subplots() 是 Matplotlib 中用于批量创建图形(Figure)和子图(Axes)的核心函数。它简化了多子图的布局管理,比传统的 plt.subplot() 更灵活高效。下面从功能、参数到示例详细解析:

fig, axes = plt.subplots(nrows=1,           # 子图行数 (默认1)ncols=1,           # 子图列数 (默认1)sharex=False,      # 是否共享x轴sharey=False,      # 是否共享y轴figsize=None,      # 图形大小 (元组: (宽, 高))constrained_layout=False,  # 自动调整布局**kwargs           # 其他Figure参数 (如dpi, facecolor等)
)

我们看一个示例:

import matplotlib.pyplot as plt
import numpy as np
​
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
​
# 生成数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 8)
​
# 创建2×2子图布局 (返回Figure对象和Axes数组)
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
fig.suptitle('2×2 子图示例', fontsize=16)
​
# 绘制第一个子图
axs[0, 0].plot(x, y1, 'r-')
axs[0, 0].set_title('正弦函数')
axs[0, 0].grid(True)
​
# 绘制第二个子图
axs[0, 1].plot(x, y2, 'b--')
axs[0, 1].set_title('余弦函数')
axs[0, 1].set_facecolor('#f0f0f0')  # 设置背景色
​
# 绘制第三个子图 (对数坐标)
axs[1, 0].semilogy(x, y4, 'g-')
axs[1, 0].set_title('指数函数(对数Y轴)')
axs[1, 0].set_xlabel('X轴')
​
# 绘制第四个子图 (设置Y轴范围)
axs[1, 1].plot(x, y3, 'm-.')
axs[1, 1].set_title('正切函数')
axs[1, 1].set_ylim(-5, 5)  # 限制Y轴范围
​
# 调整布局
plt.tight_layout(rect=[0, 0, 1, 0.96])  # 为总标题留空间
plt.show()

运行截图:

方法二:GridSpec(复杂布局)

适用场景:创建不规则大小的子图

GridSpec 是 Matplotlib 中用于创建复杂、非均匀子图布局的高级工具。它提供了比 plt.subplots() 更精细的控制,允许你定义不同大小的子图、跨行列的子图以及复杂的布局比例。

核心概念

GridSpec 通过定义一个网格系统来工作:

  • 将整个图形区域划分为行和列的网格

  • 允许子图跨越多个网格单元

  • 支持设置行和列的相对大小比例

基本语法:

from matplotlib.gridspec import GridSpec
​
# 创建 GridSpec 对象
gs = GridSpec(nrows,              # 网格总行数ncols,              # 网格总列数figure=None,        # 关联的 Figure 对象left=None,          # 网格左侧位置 (0-1)right=None,         # 网格右侧位置 (0-1)bottom=None,        # 网格底部位置 (0-1)top=None,           # 网格顶部位置 (0-1)wspace=None,        # 列间距 (宽度比例)hspace=None,        # 行间距 (高度比例)width_ratios=None,  # 列宽度比例列表height_ratios=None, # 行高度比例列表
)

我们看一个示例:

import matplotlib.pyplot as plt
import numpy as np
​
from matplotlib.gridspec import GridSpec
​
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
​
# 生成数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 8)
​
fig = plt.figure(figsize=(12, 8))
gs = GridSpec(3, 3, figure=fig)  # 3×3网格
​
# 创建跨行列的子图
ax1 = fig.add_subplot(gs[0, :])  # 首行全宽
ax2 = fig.add_subplot(gs[1, :-1])  # 第二行左侧两列
ax3 = fig.add_subplot(gs[1:, 2])  # 后两行最右列
ax4 = fig.add_subplot(gs[2, 0])  # 第三行首列
ax5 = fig.add_subplot(gs[2, 1])  # 第三行第二列
​
# 填充子图内容
ax1.plot(x, y1, color='tab:blue')
ax1.set_title('全宽标题区')
​
ax2.scatter(x, y2, c=y4, cmap='viridis')
ax2.set_title('散点图(带颜色映射)')
​
ax3.barh(x[:10], y4[:10], height=0.3)
ax3.set_title('横向柱状图')
​
ax4.pie([15, 30, 45, 10], labels=['A', 'B', 'C', 'D'])
ax4.set_title('饼图')
​
ax5.hist(np.random.randn(1000), bins=30)
ax5.set_title('直方图')
​
plt.suptitle('GridSpec 不规则布局', fontsize=16)
plt.tight_layout()
plt.show()

运行截图:

方法三:subplot2grid(传统方法)

适用场景:快速实现简单不规则布局

subplot2grid() 是 Matplotlib 中用于创建复杂子图布局的灵活方法,特别适合构建非均匀网格布局。它结合了 subplot() 的简单性和 GridSpec 的灵活性,是创建自定义布局的高效工具。

核心概念

subplot2grid() 允许你:

  1. 定义一个网格系统(行和列)

  2. 指定子图的起始位置(行索引和列索引)

  3. 设置子图跨越的行数和列数

  4. 直接创建 Axes 对象

基本语法:

ax = plt.subplot2grid(shape,          # 网格形状 (行数, 列数)loc,            # 子图起始位置 (行索引, 列索引)rowspan=1,      # 子图跨越的行数(默认为1)colspan=1,      # 子图跨越的列数(默认为1)fig=None,       # 关联的Figure对象**kwargs        # 其他Axes参数
)

我们看一个示例:

import matplotlib.pyplot as plt
import numpy as np
​
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
​
# 生成数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 8)
​
plt.figure(figsize=(10, 6))
​
# 定义网格形状 (3×3)
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0))
ax4 = plt.subplot2grid((3, 3), (1, 1))
ax5 = plt.subplot2grid((3, 3), (2, 0), colspan=3)
​
# 填充内容
ax1.fill_between(x, y1, y2, alpha=0.3)
ax2.plot(x, y3, 'r--', linewidth=2)
ax3.scatter(x[::5], y4[::5], s=50)
ax4.boxplot([np.random.normal(0, std, 100) for std in range(1, 4)])
ax5.stackplot(x, y1, y2, labels=['sin', 'cos'])
​
# 添加图例和标题
ax5.legend(loc='lower right')
plt.suptitle('subplot2grid 布局示例', fontsize=14)
plt.tight_layout()
plt.show()

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

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

相关文章

Spark执行计划与UI分析

文章目录1.Spark任务阶段划分1.1 job,stage与task1.2 job划分1.3 stage和task划分2.任务执行时机3.task内部数据存储与流动4.根据sparkUI了解Spark执行计划4.1查看job和stage4.2 查看DAG图4.3查看task1.Spark任务阶段划分 1.1 job,stage与task 首先根据…

16-docker的容器监控方案-prometheus实战篇

文章目录一.前置知识1.监控与报警2.监控系统的设计3.监控系统的分类二、prometheus概述1.什么是prometheus2.prometheus的历史3.为什么要学习prometheus4.prometheus的使用场景5.prometheus的宏观架构图6.prometheus软件下载地址三、部署prometheus server监控软件1.同步集群时…

集成电路学习:什么是Image Processing图像处理

Image Processing,即图像处理,是计算机视觉、人工智能、多媒体等领域的重要基础。它利用计算机对图像进行分析、加工和处理,以达到预期目的的技术。以下是对图像处理的详细解析: 一、定义与分类 定义: 图像处理是指用计算机对图像进行分析,以达到所需结果的技术,又称…

基于Android的随身小管家APP的设计与实现/基于SSM框架的财务管理系统/android Studio/java/原生开发

基于Android的随身小管家APP的设计与实现/基于SSM框架/android Studio/java/原生开发

Web 开发 16

1 在 JavaScript(包括 JSX)中,函数体的写法和返回值处理在 JavaScript(包括 JSX)中,函数体的写法和返回值处理确实有一些简洁的语法规则,尤其是在箭头函数中。这些规则常常让人混淆,…

超高车辆碰撞预警系统如何帮助提升城市立交隧道安全?

超高车辆带来的安全隐患立交桥和隧道的设计通常基于常规车辆的高度标准。然而,随着重型运输业和超高货车的增加,很多超高车辆会误入这些限高区域,造成潜在的安全隐患。超高车辆与立交桥梁或隧道顶盖发生碰撞时,可能导致结构受损&a…

三种变量类型在局部与全局作用域的区别

一、基本概念作用域(Scope): 全局作用域:定义在所有函数外部的变量或函数,具有文件作用域,生命周期为整个程序运行期间。局部作用域:定义在函数、块(如 {})或类内部的变量…

InfluxDB 数据迁移工具:跨数据库同步方案(二)

六、基于 API 的同步方案实战6.1 API 原理介绍InfluxDB 提供的 HTTP API 是实现数据迁移的重要途径。通过这个 API,我们可以向 InfluxDB 发送 HTTP 请求,以实现数据的读取和写入操作。在数据读取方面,使用GET请求,通过指定数据库名…

JVM安全点轮询汇编函数解析

OpenJDK 17 源码的实现逻辑,handle_polling_page_exception 函数在方法返回时的调用流程如下:调用流程分析:栈水印检查触发跳转:当线程执行方法返回前的安全点轮询时(MacroAssembler::safepoint_poll 中 at_returntrue…

Linux怎么查看服务器开放和启用的端口

在 Linux 系统中,可以通过以下方法查看 服务器开放和启用的端口。以下是详细的步骤和工具,适用于不同场景。1. 使用 ss 查看开放的端口ss 是一个现代化工具,用于显示网络连接和监听的端口。1.1 查看正在监听的端口运行以下命令:ba…

XF 306-2025 阻燃耐火电线电缆检测

近几年随着我国经济快速的发展,电气火灾呈现高发趋势,鉴于电线电缆火灾的危险性,国家制定了阻燃,耐火电线电缆的标准,为企业,建设方,施工方等的生产,选材提供了指引。XF 306-2025 阻…

【Java|第二十篇】面向对象(十)——枚举类

目录 (四)面向对象: 12、枚举类: (1)概述: (2)枚举类的定义格式: (3)编译与反编译: (4)Enum类…

第二十一天-OLED显示实验

一、OLED显示原理1、OLED名词解释OLED可以自发光,无需背光光源。2、正点原子OLED模块模块总体概述模块接口模式选择MCU与模块外部连接8080并口读写过程OLED显存因为要进行显示,所以需要有显存。显存容量为128 x 8 byte,一个点用一位表示。SSD…

会议系统核心流程详解:创建、加入与消息交互

一、系统架构概览 会议系统采用"主进程线程池进程池"的分层架构,实现高并发与业务隔离: #mermaid-svg-fDJ5Ja5L3rqPkby0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fDJ5Ja5L3r…

Spring 创建 Bean 的 8 种主要方式

Spring(尤其是 Spring Boot)提供了多种方式来让容器创建和管理 Bean。Component、Configuration Bean、EnableConfigurationProperties 都是常见方式。 下面我为你系统地梳理 Spring 创建 Bean 的所有主要方式,并说明它们的使用场景和区别。…

React 第七十节 Router中matchRoutes的使用详解及注意事项

前言 matchRoutes 是 React Router v6 提供的一个核心工具函数,主要用于匹配路由配置与当前路径。它在服务端渲染(SSR)、数据预加载、权限校验等场景中非常实用。下面详细解析其用法、注意事项和案例分析: 1、基本用法 import { m…

iSCSI服务配置全指南(含服务器与客户端)

iSCSI服务配置全指南(含服务器与客户端)一、iSCSI简介 1. 概念 互联网小型计算机系统接口(Internet Small Computer System Interface,简称iSCSI)是一种基于TCP/IP的协议,其核心功能是通过IP网络仿真SCSI高…

堆(Heap):高效的优先级队列实现

什么是堆?堆是一种特殊的完全二叉树,满足以下性质:堆序性:每个节点的值与其子节点满足特定关系最小堆:父节点 ≤ 子节点(根最小)最大堆:父节点 ≥ 子节点(根最大&#xf…

朝花夕拾(四) --------python中的os库全指南

目录 Python os模块完全指南:从基础到高阶文件操作 1. 引言:为什么需要os模块? 1.1 os模块的重要性 1.2 适用场景 1.3 os模块的"瑞士军刀"特性 2. os模块基础功能 2.1 文件与目录操作 2.1.1 核心方法介绍 2.1.2 避坑指南 …

uniappx 安卓端本地打包的一些总结

本人之前没用过android studio,因为有打包到安卓端的需求,所以有了这篇文章。下面一些内容不正常工作,也不报错,是很烦的,根本不知道是哪里出了问题。比如对应的aar包没有引入。或者没有注册信息。 在实现过程中我遇到…