详解matplotlib隐式pyplot法和显式axes法

Python的matplotlib提供了pyplot隐式方法和显式Axes方法,这让很多人在选择时感到困惑。本文用9000字彻底解析两种方法的区别与适用场景,节选自👉Python matplotlib保姆级教程


matplotlib隐式绘图方法(pyplot)

matplotlib隐式绘图方法(请结合上文章节“4.3.1.1 Python隐式”学习),类似MATLAB,是一种基于函数调用的方法,这类方法的工具都位于matplotlib的pyplot中(下文以pyplot代指matplotlib隐式方法),pyplot中代码有4000+行(matplotlib/lib/matplotlib/pyplot.py at v3.9.2 · matplotlib/matplotlib · GitHub),代码里面有大量def定义的函数方法,绘图时就是调用pyplot中的函数方法,

如果使用 pyplot方法,它帮你自动创建Figure、准备好你需要的Axes,你只需要告诉pyplot你要画什么,它就会自动完成其他一切。

举个绘制两个子图的代码例子,

## 4.3.2.1_01
import matplotlib.pyplot as plt
import numpy as npplt.figure(figsize=(10, 5))  # 隐式创建一个Figure
# 在隐式接口中,虽然没有返回具体的Figure对象,但pyplot会自动管理当前Figureplt.subplot(1, 2, 1)  # 激活第1个子图,隐式创建子图(axes),准备在此子图上绘制heatmap图
# 每个subplot调用会创建一个新的axes(子图)对象,但该对象是隐式管理的data = np.random.random((10, 10))
plt.imshow(data, cmap='viridis')
plt.colorbar()
plt.title('Heatmap')plt.subplot(1, 2, 2)  # 激活第2个子图,隐式创建一个新的axes,并在其中绘制Pie图
plt.pie([30, 40, 30], labels=['A', 'B', 'C'], autopct='%1.1f%%')
plt.title('Pie Chart')plt.show()

​该类方法中,通过plt.figure和plt.subplot自动隐式的创建Figure和axes子图,绘图函数直接作用于当前激活的Figure和axes子图,持续跟踪“当前的”Figure和axes,Figure和axes具有“实效性”,见下图文字。

 再通过一个复杂例子介绍matplotlib pyplot方法中如何设置常用的绘图元素,

# 添加画布Figure,图中红框包围的部分为一个Figure
fig = plt.figure(figsize=(9, 8), facecolor='1', dpi=150)# 为Figure添加标题
fig.suptitle('Matplotlib-pyplot法', x=0.46, fontsize=20, ha='right')# 设置子图Axes背景色等
plt.axes([marg, marg, 1 - 1.8 * marg, 1 - 1.8 * marg],aspect=1,facecolor='0.9')# 同一个axes上绘图
plt.plot(X, Y1, c='orange', lw=1, label="Orange signal", zorder=10)
plt.plot(X[::3],Y3[::3],linewidth=0,markersize=6,marker='*',markerfacecolor='none',markeredgecolor='black',markeredgewidth=1)# 设置子图标题
plt.title("Matplotlib图形元素", fontsize=15, verticalalignment='bottom')# 设置图例
plt.legend(loc="upper right", fontsize=10)# 设置坐标轴标题
plt.xlabel("x轴标题", fontsize=12)
plt.ylabel("y轴标题", fontsize=12)# 设置x,y轴刻度间隔
plt.gca().xaxis.set_major_locator(MultipleLocator(1.000))  # x轴主刻度间隔
plt.gca().xaxis.set_minor_locator(AutoMinorLocator(4))  # x轴副刻度间隔plt.gca().yaxis.set_major_locator(MultipleLocator(1.000))
plt.gca().yaxis.set_minor_locator(AutoMinorLocator(4))# 设置x轴副刻度格式,小数点后位数
plt.gca().xaxis.set_minor_formatter(minor_tick)# 设置x,y轴刻度范围
plt.xlim(0, 4)
plt.ylim(0, 4)# 设置x,y轴刻度字号、颜色等
plt.tick_params(which='major', width=1.0, labelsize=12)
plt.tick_params(which='major', length=10, labelsize=12)
plt.tick_params(which='minor', width=1.0, labelsize=10)
plt.tick_params(which='minor', length=5, labelsize=6, labelcolor='0.5')# 设置网格线
plt.grid(linestyle="--", linewidth=0.5, color='.25', zorder=-10)# 文本、箭头
plt.annotate("",xy=(4, 4),xytext=(4.2, 2.2),color=(0.25, 0.25, 1.00),weight="regular",arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="black"),
)plt.annotate("",xy=(4, 0),xytext=(4.2, 1.8),color=(0.25, 0.25, 1.00),weight="regular",arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="black"),
)
plt.show()

​上图中蓝色字体部分展示如何利用matplotlib pyplot中的方法设置绘图元素:

Figure部分:

  • 通过plt.figure添加Figure,通过figsize设置Figure的长宽,通过facecolor设置背景色,通过dpi设置分辨率;
  • 通过plt.figure.suptitle添加Figure的标题为“Matplotlib-pyplot法”,通过x设置标题与y轴的距离,通过fontsize设置标题字号;
  • 通过plt.figure.add_artist添加Figure的红色外框;

Axes部分:

  • 通过plt.axes设置子图的属性,[marg, marg, 1 - 1.8 * marg, 1 - 1.8 * marg]四个值依次为[坐标轴离图形左边的距离,坐标轴离图形底部的距离,x坐标轴的长度,y坐标轴的长度],aspect设置xy坐标轴的长度比例,facecolor设置子图背景色;
  • 通过第一个plt.plot在子图上绘制折线图;
  • 通过第二个plt.plot在子图上绘制折线图,linewidth=0隐藏折线,marker='*'添加标记;
  • 通过plt.title设置子图标题;

Axis部分:

  • 通过plt.gca().xaxis取出x坐标轴并进一步设置;
  • 通过plt.xlabel设置x坐标轴标题;
  • 通过plt.xlim设置x坐标轴范围;
  • 通过plt.gca().xaxis.set_major_locator(MultipleLocator(1.000)) 设置x坐标轴主刻度间隔;
  • 通过plt.gca().xaxis.set_minor_locator(AutoMinorLocator(4)) 设置x坐标轴副刻度间隔;
  • 通过plt.gca().yaxis取出y坐标轴并进一步设置;
  • 通过plt.ylabel设置y轴标题;
  • 通过plt.ylim设置y坐标轴范围;
  • 通过plt.gca().yaxis.set_major_locator(MultipleLocator(1.000))设置y坐标轴主刻度间隔;
  • 通过plt.gca().yaxis.set_minor_locator(AutoMinorLocator(4))设置y坐标轴副刻度间隔;

其它Aritst部分

  • 通过plt.legend设置图例;
  • 通过plt.grid设置网格线;
  • 通过plt.annotate设置标记,如图中箭头,常用于标注数据点;
  • 通过plt.text设置文本标签,如图中的蓝色文字说明;

在python社区默认通过“import matplotlib.pyplot as plt”将matplotlib.pyplot简写为plt,这种方法通过plt.+对应元素名称调用方法(例如,plt.title设置子图标题)。

这么多元素方法名称,记不住怎么办,没关系,因为matplotlib设计之初,大部分都设置了默认值,不用一个个设定,比如,你绘制一个line图,

## 4.3.2.1_03
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [10, 20, 25, 30])
plt.show()

当然,你也可以通过python dir函数查看元素的所有方法名称,例如查看x坐标轴中的元素方法,

## 4.3.2.1_04
print(dir(plt.gca().xaxis)) #查看x坐标轴中所有元素方法

展示部分结果 

['get_major_ticks', 'get_majorticklabels', 'get_majorticklines', 'get_majorticklocs', 'get_minorticklocs', 'get_minpos', 'get_mouseover', 'get_offset_text', 'get_path_effects', .......'get_units', 'get_url', 'get_view_interval', 'get_visible', 'get_window_extent', 'get_zorder', 'grid', 'have_units']

这里简单介绍,后续章节详细介绍主要元素方法的使用。  


matplotlib显式绘图方法(axes 

matplotlib显式方法(请结合上文章节“4.3.1.2 Python显式”学习),是一种基于面向对象的方法(object-oriented),这类方法的工具都位于matplotlib的Figure和Axes接口中(下文以axes代指matplotlib显式方法)。

如果使用 axes方法,你需要自己创建Figure,然后创建子图axes,并且每一步都需要明确指定。

举个绘制两个子图的代码例子,

##4.3.2.2_01
import matplotlib.pyplot as plt
import numpy as np# 显式创建一个figure对象fig;
# 显式创建两个子图(axes)对象,ax1和ax2
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))# 在子图ax1上创建Heatmap图
data = np.random.random((10, 10))
im = ax1.imshow(data, cmap='viridis')  # 在ax1子图上绘制heatmap,并使用'viridis'颜色映射
ax1.set_title('Heatmap')# 为heatmap添加颜色条,指定fig管理该颜色条,并将其与ax1关联
fig.colorbar(im, ax=ax1)# 在子图ax2上创建Pie图
ax2.pie([30, 40, 30], labels=['A', 'B', 'C'], autopct='%1.1f%%')
ax2.set_title('Pie Chart')plt.show()

该方法中,通过 fig, (ax1, ax2) 的形式直接创建Figure和axes子图,代码结构化,易于管理和扩展手动管理,ax1ax2 分别代表两个子图(heatmap 和 pie)。

该方法中,画图函数不再受到当前“活动”的Figure和axes的限制,而变成了显式的 Figure 和 Axes 的方法,你可以直接随处对它们进行操作,Figure和axes不具有“实效性”,见下图文字。

这里也再通过一个复杂例子介绍matplotlib axes方法中如何设置常用的绘图元素, 

# 为Figure添加标题
fig.suptitle('Matplotlib面向对象法', x=0.46, fontsize=20, ha='right')# 在Figure上添加子图Axes
marg = 0.15
ax = fig.add_axes([marg, marg, 1 - 1.8 * marg, 1 - 1.8 * marg],aspect=1,facecolor='0.9')# 同一个axes上绘图
ax.plot(X, Y1, c='orange', lw=1, label="Orange signal", zorder=10)
ax.plot(X[::3],Y3[::3],linewidth=0,markersize=6,marker='*',markerfacecolor='none',markeredgecolor='black',markeredgewidth=1)# 设置子图标题
ax.set_title("Matplotlib图形元素", fontsize=15, verticalalignment='bottom')# 设置图例
ax.legend(loc="upper right", fontsize=10)# 设置坐标轴标题
ax.set_xlabel("x轴标题", fontsize=12)
ax.set_ylabel("y轴标题", fontsize=12)# 设置x,y轴刻度间隔
ax.xaxis.set_major_locator(MultipleLocator(1.000))  # x轴主刻度间隔
ax.xaxis.set_minor_locator(AutoMinorLocator(4))  # x轴副刻度间隔ax.yaxis.set_major_locator(MultipleLocator(1.000))
ax.yaxis.set_minor_locator(AutoMinorLocator(4))# 设置x轴副刻度格式
ax.xaxis.set_minor_formatter(minor_tick)# 设置x,y轴刻度范围
ax.set_xlim(0, 4)
ax.set_ylim(0, 4)# 设置x,y轴刻度字号、颜色等
ax.tick_params(which='major', width=1.0, labelsize=12)
ax.tick_params(which='major', length=10, labelsize=12)
ax.tick_params(which='minor', width=1.0, labelsize=10)
ax.tick_params(which='minor', length=5, labelsize=6, labelcolor='0.5')# 设置网格线
ax.grid(linestyle="--", linewidth=0.5, color='.25', zorder=-10)# 文本、箭头
ax.annotate("",xy=(4, 4),xytext=(4.2, 2.2),color=(0.25, 0.25, 1.00),weight="regular",arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="black"),
)ax.annotate("",xy=(4, 0),xytext=(4.2, 1.8),color=(0.25, 0.25, 1.00),weight="regular",arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="black"),
)# 矩形外框
fig.add_artist(Rectangle((0, 0),width=1,height=1,facecolor='none',edgecolor='red',linewidth=1.0))


上图中蓝色字体部分展示如何利用matplotlib axes中的方法设置绘图元素:

Figure部分:

  • 通过plt.figure添加Figure,通过figsize设置Figure的长宽,通过facecolor设置背景色,通过dpi设置分辨率;
  • 通过plt.figure.suptitle添加Figure的标题为“Matplotlib面向对象法”,通过x设置标题与y轴的距离,通过fontsize设置标题字号;
  • 通过plt.figure.add_artist添加Figure的红色外框;

在Figure部分两种方法类似。

Axes部分:

  • 通过plt.figure.add_axes添加子图ax,并设置子图的属性,[marg, marg, 1 - 1.8 * marg, 1 - 1.8 * marg]四个值依次为[坐标轴离图形左边的距离,坐标轴离图形底部的距离,x坐标轴的长度,y坐标轴的长度],aspect设置xy坐标轴的长度比例,facecolor设置子图背景色;
  • 通过第一个ax.plot在子图上绘制折线图;
  • 通过第二个ax.plot在子图上绘制折线图,linewidth=0隐藏折线,marker='*'添加标记;
  • 通过ax.set_title设置子图标题;

Axis部分:

  • 通过ax.xaxis取出x坐标轴并进一步设置;
  • 通过ax.set_xlabel设置x坐标轴标题;
  • 通过ax.set_xlim设置x坐标轴范围;
  • 通过ax.xaxis.set_major_locator(MultipleLocator(1.000))设置x坐标轴主刻度间隔;
  • 通过ax.xaxis.set_minor_locator(AutoMinorLocator(4))设置x坐标轴副刻度间隔;
  • 通过ax.yaxis取出y坐标轴并进一步设置;
  • 通过ax.set_ylabel设置y轴标题;
  • 通过ax.set_ylim设置y坐标轴范围;
  • 通过ax.yaxis.set_major_locator(MultipleLocator(1.000))设置y坐标轴主刻度间隔;
  • 通过ax.yaxis.set_minor_locator(AutoMinorLocator(4))设置y坐标轴副刻度间隔;

其它Aritst部分

  • 通过ax.legend设置图例;
  • 通过ax.grid设置网格线;
  • 通过ax.annotate设置标记,如图中箭头,常用于标注数据点;
  • 通过ax.text设置文本标签,如图中的蓝色文字说明;

一般将matplotlib面向对象方法中子图简写为ax,这种方法通过ax.+对应元素名称调用方法(例如,ax.title设置子图标题)。

这么多元素方法名称,记不住怎么办,没关系,因为matplotlib设计之初,大部分都设置了默认值,不用一个个设定,比如,你绘制一个line图,

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 25, 30])
plt.show()

以上使用默认设置作图。 

当然,你也可以通过python dir函数查看元素的所有方法名称,例如查看子图中的元素方法,

##4.3.2.2_04
print(dir(ax)) #输出子图axes中的所有元素方法名称

结果为一个python列表,以下展示部分 ,

['set_facecolor', 'set_fc', 'set_figure', 'set_frame_on', 'set_gid', 'set_in_layout', .......'xcorr', 'yaxis', 'yaxis_date', 'yaxis_inverted', 'zorder']

这里简单介绍,后续章节详细介绍主要元素方法的使用。  


matplotlib隐式 VS 显式方法

简单总结两种绘图方法异同,便于取舍。

绘制简单图形时,两种方法类似,复杂图形中后者优势明显。

  • matplotlib隐式方法(pyplot)

适用于快速绘制简单图形,代码简洁易懂,但在需要精细控制和复杂布局时可能不够灵活。

  • matplotlib显式方法(axes)

适用于需要精确控制和复杂布局图形的场景,提供更高的灵活性和可维护性。

两种方法优缺点比较

特性matplotlib显式方法(axes)matplotlib隐式方法(pyplot)
优点
控制和灵活性1. 提供精确的控制和灵活性,适用于复杂布局和定制1. 代码简洁,适合快速绘图
代码结构2. 代码结构清晰,易于维护和扩展2. 易于上手,初学者友好
兼容性3. 更好地与其他库(如seaborn、pandas)兼容3. 适用于简单情境
支持复杂布局4. 支持复杂的图形布局,如gridspec和subplots
缺点
代码复杂度1. 代码较为繁琐,尤其是在简单图形中1. 控制和灵活性较差,难以进行复杂自定义
学习曲线2. 学习曲线较陡,需要理解和掌握 Axes 对象的使用2. 难以管理多个图形和子图对象
管理多个图形3. 对于复杂图形和多个图形的管理较为复杂3. 代码在复杂任务中可能难以维护快速上手,一个案例

两种方法使用层面比较

详细见章节“4.3.2.1 matplotlib隐式绘图方法(pyplot)”和章节“4.3.2.2 matplotlib显式绘图方法(axes )”。也可以通过比较下图中蓝色字体部分,了解两种方法的使用差异。


根据上一章节的介绍,后续重点通过matplotlib显式方法介绍matplotlib的使用。

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

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

相关文章

网络安全需要掌握哪些技能?

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 在这个高度依赖于网络的时代,网络安全已经成为我们工作和生活中不可或缺的一部分,更是0基础转行IT的首选,可谓是前景好、需求大…

推荐1款OCR的扫描仪软件,无需安装,打开即用!

聊一聊 现在日常办公,很多时候还是需要扫描仪配合。 很多时候需要将文件搜索成PDF再传输。 今天给大家分享一款OCR扫描仪软件。 软件介绍 OCR的扫描仪软件 支持扫描仪共享。 支持WIA、TWAIN、SANE和ESCL驱动程序。 还可以批量多扫描仪配置扫描,支持…

私有云基础架构

基础配置 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 安装服务 web01 192.168.184.110 Apache、PHP database 192.168.184.111 MariaDB web02 192.168.184.112 Apache、PHP 由于 openEuler 22.09 系统已经停止维护了&#xff…

记忆化搜索与动态规划:原理、实现与比较

记忆化搜索和动态规划是解决优化问题的两种重要方法,尤其在处理具有重叠子问题和最优子结构性质的问题时非常有效。 目录 1. 记忆化搜索(Memoization) 定义: 实现步骤: 示例代码(斐波那契数列&#xff0…

Spring Boot 自动装配深度解析与实践指南

目录 引言:自动装配如何重塑Java应用开发? 一、自动装配核心机制 1.1 自动装配三大要素 1.2 自动装配流程 二、自定义自动配置实现 2.1 创建自动配置类 2.2 配置属性绑定 2.3 注册自动配置 三、条件注解深度应用 3.1 常用条件注解对比 3.2 自定…

关于常规模式下运行VScode无法正确执行“pwsh”问题

前言: pwsh在系统环境中正确配置,且可以运行在cmd, powshell(5.1)--- 都需要在管理员权限下运行 (打开setting) 打开setting.json (在vscode中添加 powershell 7 路径&…

Ubuntu20.04双系统安装及软件安装(一):系统安装

Ubuntu20.04双系统安装及软件安装(一):系统安装 Ubuntu系统卸载Ubuntu20.04安装BIOS进入系统安装 许久没写博客了,今天开始重新回归了。首先记录我在双系统上重装Ubuntu20.04的安装过程记录以及个人见解。 Ubuntu系统卸载 参考双…

基于CURL命令封装的JAVA通用HTTP工具

文章目录 一、简要概述二、封装过程1. 引入依赖2. 定义脚本执行类 三、单元测试四、其他资源 一、简要概述 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具&…

开发博客系统

前言 准备工作 数据库表分为实体表和关系表 第一,建数据库表 然后导入前端页面 创建公共模块 就是统一返回值,异常那些东西 自己造一个自定义异常 普通类 mapper 获取全部博客 我们只需要返回id,title,content,us…

uniapp+vue3搭建项目

工具使用: Pinia Vue 3 官方推荐的状态管理库,比 Vuex 更轻量,支持模块化,结合 persistedstate 插件可以持久化存储数据。uView-plus 专为 UniApp 设计,支持 App、小程序、H5。UnoCSS 更轻量,比 TailwindCS…

如何通过rust实现自己的web登录图片验证码

在进行web系统开发时,为保障系统登录安全,登录页面中的验证码必不可少。在java中,我们可以利用相应的2D图像库快速生成图形验证码,而对于rust,我们没有合适的标准库进行图像验证码的生成。今天,我们通过使用…

Unity NGUI新手向几个问题记录

1.点Button没反应 制作Button组件时,不光要挂载Button脚本,还有挂载BoxCollider BoxCollider 接收事件 2.Button点击事件的增加与删除 使用.onClick.add增加事件,使用.onClick.Remove,.onClick.RemoveAt,onClick.RemoveRang,onClick.Clear移…

基于SpringBoot的“扶贫助农系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“扶贫助农系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…

Rust编程实战:初探WebAssembly

WebAssembly: 网页应用的性能革命 ​互联网技术日新月异,Web应用已经从简单的网页跃升为功能丰富的平台。然而,JavaScript作为Web的主力语言,在处理计算密集型任务时仍然存在性能瓶颈。今天,我们来聊一聊可能改变Web格局的技术—…

蓝桥杯4T平台(串口打印电压值)

知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos(2.2.0) 服务,控制台报错 Unable to start embedded Tomcat。 报错信息:Unable to star…

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD(Resilient Distributed Dataset)叫做**弹性分布式数据集,是Spark中最基本的数据抽象&#xff0c…

Machine Learning 初探

前置知识 pandas 读取文件:read_csv查看信息 describe:查看整体信息,包括每列的平均值、最大最小值、标准差等head:输出头部几行数据columns:输出所有列名loc:查询数据,或是根据索引取对应的数…

linux第四讲----基础开发工具vim

1.软件安装 这里以ubuntu为例,安装sl软件,输入这个命令即可自动安装~ 使用一下,输入sl,屏幕上会出现一个移动的小火车 之后不想要了准备卸载就输入: 注意:1)下载软件时也可以进行搜索~ 2)cento…