Python画图|多图共享X轴和Y轴

news2024/11/27 10:34:26

【1】引言

在python画图的众多场景中,存在多图对应X轴和Y轴可能一致的情形。

为此,尝试找到相关方法,不仅可以将代码写得更简洁,也更节省电脑内存,是提升工作效率的可选之路。

【2】官网教程

点击下方链接,直达官网教程:

Shared axis — Matplotlib 3.9.2 documentation

官网教程非常简洁,我尝试对其进行了注释。

【3】代码解析

首先是引入画图模块matplo和计算模块numpy:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

然后定义了自变量和因变量:

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

这里的3个因变量将输出3个子图。

接下来先输出第一个图形:

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6) #设置X轴范围

然后在定义第二个图形的时候,指明要和第一个图形共享X轴:sharex=ax1

# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容

再之后定义第三个图形, 指明要和第一个图形共享X轴和Y轴:sharex=ax1,sharey=ax1

# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围

最后输出图形:

plt.show() #输出图形

至此的输出图像为:

图1

完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6) #设置X轴范围

# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容

# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围
plt.show() #输出图形

【4】代码修改

【4.1】设置子图名称

由于图1中没有给任何子图命名,且第一个和第三个子图都显示了X轴,为了优化表达效果,先给各个子图命名,增加如下代码:

ax1.set_title('s1')
ax2.set_title('s2')
ax3.set_title('s3')

获得输出结果为:

图2

可见每个子图上都有了名称。

【4.2】只显示最底下的X轴标签内容

现在进一步优化代码,把S1的X轴标签去除。

此处采用的方法是,增加labelbottom=False代码,增加后:

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6,labelbottom=False) #设置X轴范围

此时的输出结果为:

图3

由图3可见,S1不再显示X轴标签内容。

【4.3】显示最底下的X轴和各Y轴

继续增加代码,显示最底下的X轴和各Y轴:

ax1.set_ylabel('s1')
ax2.set_ylabel('s2')
ax3.set_ylabel('s3')
ax3.set_xlabel('X')

此时的输出结果为:

图4

由图4可见,各个子图的表达已经更加完善。

此时的完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6,labelbottom=False) #设置X轴范围

# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容

# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围

ax1.set_title('s1') #设置图名
ax2.set_title('s2') #设置图名
ax3.set_title('s3') #设置图名

ax1.set_ylabel('s1') #设置Y轴
ax2.set_ylabel('s2') #设置Y轴
ax3.set_ylabel('s3') #设置Y轴
ax3.set_xlabel('X') #设置X轴

plt.show() #输出图形

【5】代码优化

其实共享X轴更为简洁的方式是将所有图形画到同一个坐标系。

删除所有ax定义,替换为下述代码:

plt.plot(t, s1,'o--',label='s1') #画图
plt.plot(t,s2,'--',label='s2') #画图
plt.plot(t,s3,label='s3') #画图
plt.xlabel('X') #设置X轴
plt.ylabel('Y') #设置Y轴
plt.legend() #输出图例

此时的输出结果为:

图5

 图5显然比之前的图形都更紧凑,展示内容也更集中。

当然,图5的选用应在曲线范围一致的情况下才有好的效果,不然还是需要回到之前的子图形式。

至此的完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

plt.plot(t, s1,'o--',label='s1') #画图
plt.plot(t,s2,'--',label='s2') #画图
plt.plot(t,s3,label='s3') #画图
plt.xlabel('X') #设置X轴
plt.ylabel('Y') #设置X轴
plt.legend() #输出图例

plt.show() #输出图形

【6】总结

探索了多图共享X轴和Y轴的基本技巧,并对输出图形进行了图例、轴标签等属性设置,最后将所有曲线集中到一个坐标轴内部输出。

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

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

相关文章

Python酷库之旅-第三方库Pandas(142)

目录 一、用法精讲 641、pandas.Timestamp.hour属性 641-1、语法 641-2、参数 641-3、功能 641-4、返回值 641-5、说明 641-6、用法 641-6-1、数据准备 641-6-2、代码示例 641-6-3、结果输出 642、pandas.Timestamp.is_leap_year属性 642-1、语法 642-2、参数 6…

Python爬虫(四)正则表达式(Regular Expressions for Python Crawlers)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

ctf.bugku-各种绕过呦

题目来源&#xff1a;各种绕过哟 - Bugku CTF 访问页面&#xff0c;得到代码如下&#xff1a; <?php highlight_file(flag.php); $_GET[id] urldecode($_GET[id]); $flag flag{xxxxxxxxxxxxxxxxxx}; if (isset($_GET[uname]) and isset($_POST[passwd])) {if ($_GET[una…

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波 前言MPU6050寄存器代码详解mpu6050.cmpu6050.h 使用说明 前言 本篇文章基于卡尔曼滤波的原理详解与公式推导&#xff0c;来详细的解释下如何使用卡尔曼滤波来解算MPU6050的姿态 参考资料&#xff1a;Github_mpu6050 MPU6050寄存器…

利用网络流量分析仪进行网络故障排除:提升IT运维效率的关键工具

目录 一、什么是网络流量分析仪&#xff1f; 主要功能&#xff1a; 二、为什么网络流量分析仪在网络故障排除中如此重要&#xff1f; 三、实际案例&#xff1a;使用网络流量分析仪快速排查网络故障 案例一&#xff1a;流量拥塞导致的带宽不足 案例二&#xff1a;服务器响…

element-ui的树形结构样式调整,添加线条和边框样式

element-ui的树形结构样式调整&#xff0c;添加线条和边框样式 先看图效果&#xff1a; <template><div class"temperature_monitoring"><div class"temperature_monitoring_left"><div class"tree-container"><e…

萤石云 ezuikit-js 视频监控

父组件 <template><div class"securityProtectLargeScreen" v-if"waterWorks?.length > 0"><div class"leftSide"><ul class"leftItems flexColumnCenter"><liv-for"(item, index) in waterWork…

Java | Leetcode Java题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; class Solution extends SolBase {public int rand10() {int a, b, idx;while (true) {a rand7();b rand7();idx b (a - 1) * 7;if (idx < 40) {return 1 (idx - 1) % 10;}a idx - 40;b rand7();// get uniform dist from 1 - 63…

安卓13禁止用户打开开发者选项 android13禁止用户打开开发者选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号,一般的话,在这里连续点击就可以打开我们的开发者选项了。但是有些系统要进行保密,因此要禁止用户进入。 2.问题分析 这里我们是通过点…

FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解

一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时&#xff0c;有时需要通过枚举的方式来限定参数只能为某几个值中的一个&#xff0c;这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下&#xff1a; #引入Enum模块 from fa…

【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;序列到序列&#xff08;seq2seq&#xff09;模型和Transformer架构的出现&#xff0c;极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络&#xff08;RNN&…

【idea】切换多个仓库到一个分支

需求描述 打开个一个Project 里面包含多个子项目&#xff0c;每一个子项目都有一个自己的git仓库。在idea 中有没有一次性把多个项目切换到同一个分支上面。 解决方案 右键git -> branch 点击右上角的此轮 勾选Execute Branch Operations on All Roots 点击ommon Remote …

萱仔求职复习系列——2 Linux的常用方法(包含基础进阶高级操作)

由于最近接了一个笔试&#xff0c;发现笔试可能涉及到Linux&#xff0c;我准备临时抱佛脚一下赶紧复习一下Linux的用法哈哈。Linux 的基础用法包含文件系统操作、权限管理、网络配置、进程管理等基本命令&#xff1b;进阶操作包括网络调试、包管理、服务管理和用户管理等&#…

【jdk19虚拟线程 VS 普通线程】

文章目录 一.什么是虚拟线程二.虚拟线程与普通线程的区别1.普通线程2.虚拟线程3. 实际应用中的区别 三.上demo对比性能。1.线程池配置2.Service实现3.测试结果 四.小结 一.什么是虚拟线程 虚拟线程&#xff0c;也称作轻量级线程&#xff0c;是由JVM直接管理的线程类型&#xf…

jmeter入门:脚本录制

1.设置代理。 网络连接-》代理-》手动设置代理. ip&#xff1a; 127.0.0.1&#xff0c; port&#xff1a;8888 2. add thread group 3. add HTTP(s) test script recorder, target controller chooses Test plan-> thread Group 4. click start. then open the browser …

Golang | Leetcode Golang题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; func findSubstringInWraproundString(p string) (ans int) {dp : [26]int{}k : 0for i, ch : range p {if i > 0 && (byte(ch)-p[i-1]26)%26 1 { // 字符之差为 1 或 -25k} else {k 1}dp[ch-a] max(dp[ch-a], k)}for _, v :…

Java主流框架项目实战——SpringBoot入门

单元1-1 1&#xff09; IDEA工具安装好 2&#xff09; Maven安装&#xff0c;配置好 IDEA安装及永久试用 配置maven 单元1-2 使用aliyun(https://start.aliyun.com/)创建一个spring boot项目&#xff0c;hello world&#xff01; 构建项目 1&#xff09;构建项目 直接默认…

MicroFlow:一种高效的基于Rust的TinyML推理引擎

英文论文标题&#xff1a;MICROFLOW: AN EFFICIENT RUST-BASED INFERENCE ENGINE FOR TINYML 中文论文标题&#xff1a;MicroFlow&#xff1a;一种高效的基于Rust的TinyML推理引擎 作者信息&#xff1a; Matteo Carnelos&#xff0c;意大利帕多瓦大学&#xff0c;Grepit AB,…

什么软件可以晚上睡觉录音

什么软件可以晚上睡觉录音&#xff0c;在日常生活中&#xff0c;我们常常忽略夜间的声音&#xff0c;然而这些声音有时可能会揭示重要信息&#xff0c;比如打鼾情况、说梦话、甚至是潜在的睡眠问题。因此&#xff0c;一款适合夜间录音的软件对于关注健康及生活细节的人来说至关…

在IDEA中配置Selenium和WebDriver

前言&#xff1a; 在当今自动化测试和网络爬虫的领域&#xff0c;Selenium是一个被广泛使用的工具。它不仅能够模拟用户与浏览器的交互&#xff0c;还能进行网页测试和数据抓取。而为了使用Selenium与谷歌/Edge浏览器进行自动化测试&#xff0c;配置合适的WebDriver至关重要。本…