python画图|两个Y轴共享X轴

news2024/11/27 4:01:41

【1】引言

在前述学习中,对使用matplotlib模块输出图形已经非常熟练,但常见的画图方式并未穷尽,如两个Y轴共享X轴就没有探索过。

对此,我进行了一些学习,获得一些心得,在此和大家共享。

【2】官网教程

官网对两个Y轴共享X轴提供了详细解释和代码示例,可以通过下述链接直达:

https://matplotlib.org/stable/gallery/subplots_axes_and_figures/two_scales.html#sphx-glr-gallery-subplots-axes-and-figures-two-scales-py

为便于大家理解和阅读,我增添了代码注释。

【3】代码解读 

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

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

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

t = np.arange(0.01, 10.0, 0.01) #定义自变量
data1 = np.exp(t) #定义因变量
data2 = np.sin(2 * np.pi * t) #定义因变量

之后定义了要画图:

fig, ax1 = plt.subplots() #定义要画图

首先进行第一个图的定义:

fig, ax1 = plt.subplots() #定义要画图

color = 'tab:red' #设置颜色变量
ax1.set_xlabel('time (s)') #设置X轴标签
ax1.set_ylabel('exp', color=color) #设置Y轴标签
ax1.plot(t, data1, color=color) #输出图形
ax1.tick_params(axis='y', labelcolor=color) #设置Y轴颜色

然后进行第二个图的定义:

ax2 = ax1.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:blue'
ax2.set_ylabel('sin', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax2.plot(t, data2, color=color) #输出图形
ax2.tick_params(axis='y', labelcolor=color) #输出图形

最后输出图形:

fig.tight_layout()  # otherwise the right y-label is slightly clipped #可以保证Y轴标签位置合理,不会和坐标轴重合
plt.show() #输出图形

图形输出结果为:

图1

【4】代码修改

在【3】中可以发现,ax1是用subplots()函数进行的定义,ax2是用ax1.twinx()函数完成的定义。

为此,最核心的函数就是ax1.twinx()。

为了测试该功能,修改ax定义程序为:

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

# Create some mock data
t = np.arange(0.01, 10.0, 0.01) #定义自变量
data1 = np.exp(t) #定义因变量
data2 = np.sin(2 * np.pi * t) #定义因变量

fig, ax = plt.subplots(2,1) #定义要画图

color = 'tab:red' #设置颜色变量
ax[0].set_xlabel('time (s)') #设置X轴标签
ax[0].set_ylabel('exp', color=color) #设置Y轴标签
ax[0].plot(t, data1, color=color) #输出图形
ax[0].tick_params(axis='y', labelcolor=color) #设置Y轴颜色

#ax2 = plt.subplots()  # instantiate a second Axes that shares the same x-axis

color = 'tab:blue'
ax[1].set_ylabel('sin', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax[1].plot(t, data2, color=color) #输出图形
ax[1].tick_params(axis='y', labelcolor=color) #输出图形

fig.tight_layout()  # otherwise the right y-label is slightly clipped #可以保证Y轴标签位置合理,不会和坐标轴重合
plt.show() #输出图形

上述代码的ax定义部分已经全部修改为subplots()输出:

fig, ax = plt.subplots(2,1) #定义要画图

color = 'tab:red' #设置颜色变量
ax[0].set_xlabel('time (s)') #设置X轴标签
ax[0].set_ylabel('exp', color=color) #设置Y轴标签
ax[0].plot(t, data1, color=color) #输出图形
ax[0].tick_params(axis='y', labelcolor=color) #设置Y轴颜色

#ax2 = plt.subplots()  # instantiate a second Axes that shares the same x-axis

color = 'tab:blue'
ax[1].set_ylabel('sin', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax[1].plot(t, data2, color=color) #输出图形
ax[1].tick_params(axis='y', labelcolor=color) #输出图形

此时的输出结果为:

图2

至此,测试结果很清晰,使用twinx()函数可以实现2个Y轴共享X轴。

【5】代码改写

【5.1】 ax.twinx()函数测试

进一步测试,引入第三个变量:

data3 = 12*np.cos(2 * np.pi * t) #定义因变量

在此基础上,有两种共享Y轴的方式,一种是ax3 = ax1.twinx(),一种是ax3 = ax2.twinx(),第一种的完整代码为:

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

# Create some mock data
t = np.arange(0.01, 10.0, 0.01) #定义自变量
data1 = np.exp(t) #定义因变量
data2 = np.sin(2 * np.pi * t) #定义因变量
data3 = 12*np.cos(2 * np.pi * t) #定义因变量

fig, ax1 = plt.subplots() #定义要画图

color = 'tab:red' #设置颜色变量
ax1.set_xlabel('time (s)') #设置X轴标签
ax1.set_ylabel('exp', color=color) #设置Y轴标签
ax1.plot(t, data1, color=color) #输出图形
ax1.tick_params(axis='y', labelcolor=color) #设置Y轴颜色

ax2 = ax1.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:blue'
ax2.set_ylabel('sin', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax2.plot(t, data2, color=color) #输出图形
ax2.tick_params(axis='y', labelcolor=color) #输出图形

ax3 = ax1.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:green'
ax3.set_ylabel('cos', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax3.plot(t, data3, color=color) #输出图形
ax3.tick_params(axis='y', labelcolor=color) #输出图形

fig.tight_layout()  # otherwise the right y-label is slightly clipped #可以保证Y轴标签位置合理,不会和坐标轴重合
plt.show() #输出图形

对应输出结果为:

图3

可见共享X轴的两个Y轴按照各自的比例,将图像放大,铺满了坐标轴。

第二种方式的完整代码为:

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

# Create some mock data
t = np.arange(0.01, 10.0, 0.01) #定义自变量
data1 = np.exp(t) #定义因变量
data2 = np.sin(2 * np.pi * t) #定义因变量
data3 = 12*np.cos(2 * np.pi * t) #定义因变量

fig, ax1 = plt.subplots() #定义要画图

color = 'tab:red' #设置颜色变量
ax1.set_xlabel('time (s)') #设置X轴标签
ax1.set_ylabel('exp', color=color) #设置Y轴标签
ax1.plot(t, data1, color=color) #输出图形
ax1.tick_params(axis='y', labelcolor=color) #设置Y轴颜色

ax2 = ax1.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:blue'
ax2.set_ylabel('sin', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax2.plot(t, data2, color=color) #输出图形
ax2.tick_params(axis='y', labelcolor=color) #输出图形

ax3 = ax2.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:green'
ax3.set_ylabel('cos', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax3.plot(t, data3, color=color) #输出图形
ax3.tick_params(axis='y', labelcolor=color) #输出图形

fig.tight_layout()  # otherwise the right y-label is slightly clipped #可以保证Y轴标签位置合理,不会和坐标轴重合
plt.show() #输出图形

对应输出结果为:

图4

由图4可见,ax2对应的Y轴数据自动移动到了左侧。

也就是:

ax1.twinx()时,ax1的Y值会出现在左侧Y轴;ax2.twinx()时,ax2的Y值会出现在左侧Y轴。

【5.2】 自变量范围扩大测试

进一步测试,设置新自变量:

n = np.arange(10.0,20.0,0.01) #定义新自变量

对应设置新因变量:

data3 = np.sin(2 * np.pi * n) #定义新因变量

此处采用ax1.twinx()进行X轴共享,获得的输出图形为:

图5

由图5可见,共享X轴可以在自变量取值不重合的前提下实施。

但需注意的是,如果心得自变量data3在输出的时候,Y轴设置名称是其他,比如“cos”,就会出现cos和sin的重影。

图6

由图6可见,出现了Y轴标签的重影。

此时的完整代码为:

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

# Create some mock data
t = np.arange(0.01, 10.0, 0.01) #定义自变量
n = np.arange(10.0,20.0,0.01) #定义新自变量
data1 = np.exp(t) #定义因变量
data2 = np.sin(2 * np.pi * t) #定义因变量
data3 = np.sin(2 * np.pi * n) #定义新因变量

fig, ax1 = plt.subplots() #定义要画图

color = 'tab:red' #设置颜色变量
ax1.set_xlabel('time (s)') #设置X轴标签
ax1.set_ylabel('exp', color=color) #设置Y轴标签
ax1.plot(t, data1, color=color) #输出图形
ax1.tick_params(axis='y', labelcolor=color) #设置Y轴颜色

ax2 = ax1.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:blue'
ax2.set_ylabel('sin', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax2.plot(t, data2, color=color) #输出图形
ax2.tick_params(axis='y', labelcolor=color) #输出图形

ax3 = ax1.twinx()  # instantiate a second Axes that shares the same x-axis

color = 'tab:green'
ax3.set_ylabel('cos', color=color)  # we already handled the x-label with ax1 #设置Y轴标签
ax3.plot(n, data3, color=color) #输出图形
ax3.tick_params(axis='y', labelcolor=color) #输出图形
ax3.set_title('Y share X')
fig.tight_layout()  # otherwise the right y-label is slightly clipped #可以保证Y轴标签位置合理,不会和坐标轴重合
plt.show() #输出图形

【6】总结

学习了两个Y轴共享X轴的基础教程,尝试探索了3个Y轴共享X轴。

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

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

相关文章

点评项目-4-隐藏敏感信息、使用 redis 优化登录业务

一、隐藏敏感信息 之前我们对 /user/me 路径,直接返回了登录的所有用户信息,其中的 passward 等敏感信息也会被返回到前端,这是很危险的,故我们需要选择性的返回用户信息,隐藏敏感用户信息 我们可以创建一个 UserDTO…

ECCV`24 | 新加坡国立华为提出Vista3D: 实现快速且多视角一致的3D生成

文章链接:https://arxiv.org/pdf/2409.12193 gitbub链接:https://github.com/florinshen/Vista3D 亮点直击 提出了Vista3D,一个用于揭示单张图像3D darkside 的框架,能够高效地利用2D先验生成多样的3D物体。开发了一种从高斯投影到…

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

目录 1 C 程序内存区域划分 1.1 代码区 (Code Section) 1.2 全局/静态区 (Global/Static Section) 1.3 栈区 (Stack Section) 1.4 堆区 (Heap Section) 1.5 动态内存分配 2 void 指针(无类型指针) 2.1 void 指针介绍 2.2 void 指针的作用 2.3 …

Web自动化Demo-Go+Selenium

1.新建工程 使用GoLand新建工程如下: 打开终端输入如下命令安装Selenium go get -u github.com/tebeka/selenium 2.编写代码 package mainimport ("fmt""github.com/tebeka/selenium""log""time" )const (chromeDriver…

视频生成的黎明:100+页干货全面探讨SORA类模型(T2VI2VV2V全包括)腾讯中科大

日前,腾讯AI Lab和中科大联合发布了100多页的类SORA模型研究报告,非常全面,很有学习和研究价值,今天和大家分享下,内容较多,可后台回复【类SORA报告】获取100多页pdf。 开源地址:https://ailab-…

函数信号发生器的直流偏置(OFFSET)旋钮的作用及操作方法

函数信号发生器(Function Generator)是电子工程师和技术人员在电路设计、测试和调试中常用的设备之一。它可以生成各种标准波形,如正弦波、方波、三角波等,以及用户自定义的任意波形。在众多参数设置中,直流偏置&#…

2025考研今天开始预报名!攻略请查收

2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程?需要准备哪些信息? 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段: 网上预报名时间为10月9日至10月12日(每日9&#xff1…

电脑屏保设置教程 好看的电脑屏保应该怎么设置?

一、电脑自带的屏保设置,主题少,操作复杂; 你需要选择一个合适的屏保。在Windows系统中,你可以通过以下步骤找到合适的屏保: 右键点击桌面空白处,选择“个性化”; 在“个性化”设置中&#x…

win10家庭版配置ubantu20.04子系统

需要在本地配置一个环境去跑代码,代码的环境如下: 刚开始准备给电脑装一个双系统的,室友踩过坑告诉我安装wsl子系统就可以了,方便快捷~ 于是开始了摸索之旅!记录如下 (我刚开始以为一定要win10专业版&…

人才画像的重要性,如何打造精准人才画像?

人才画像在人力资源管理中占据重要地位,尤其是在人才招聘环节,它发挥着不可替代的作用,制定精准的人才画像有助于优化招聘和人力资源管理,从而提高组织竞争力和发展潜力。 一、人才画像的重要性 提高招聘精准度:精准…

考试系统之题目反馈

在现代教育体系中,考试不仅是检验学生学习成果的重要手段,也是教师评估教学效果、调整教学策略的关键环节。随着科技的飞速发展,传统的纸质考试逐渐被在线考试系统所取代,而题目反馈功能作为在线考试系统不可或缺的一部分&#xf…

电磁兼容(EMC):整改案例(五)EFT测试,改初级Y电容

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试,测试条件为:频率5kHz/100kHz,测试电压L,N线间2kV。其中频率5kHz时,测试通过,但频…

开源 AI 智能名片 O2O 商城小程序源码助力企业实现三层式个性化体验

摘要:本文探讨了在数字化时代,企业如何利用开源 AI 智能名片 O2O 商城小程序源码实现三层式个性化体验。通过分析数字化空间的定制化和个性化服务特点,以及实体经营中对人际互动的依赖,阐述了随着物联网和人工智能基础设施的开发&…

[Python] 使用Python自定义生成二维码

文章目录 目录 安装 qrcode 库生成简单的二维码代码讲解 生成自定义样式的二维码代码讲解 生成带有链接的二维码代码讲解 Demo代码实现代码讲解 总结 收录专栏: [Python] 二维码是现在非常常用的一种信息存储和传递方式,我们可以通过扫描二维码来快速获取文本、链接…

史上最全JLInk调试Kevil指南||一篇就够了||从菜鸟到调试大佬

目录 写在前面 问题1:jlink的port选项有SW和JTAG,这两个有什么区别,为什么大多数情况下选SW? 1.配置reset and run,下載即可重启 2.寄存器 问题2:keil中debug调试中会出现register和value,register中包括R0&#…

QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结

Qt游戏设计:贪吃蛇 游戏简介 贪吃蛇是一款经典的休闲益智类游戏,玩家通过控制蛇的移动来吃掉地图上的食物,使蛇的身体变长。随着游戏的进行,蛇的移动速度会逐渐加快,难度也随之增加。当蛇撞到墙壁或自己的身体时&…

LLM详解

一 定义 Large Language Model,称大规模语言模型或者大型语言模型,是一种基于大量数据训练的统计语言模型,可用于生成和翻译文本和其他内容,以及执行其他自然语言处理任务(NLP),通常基于深度神…

verilog端口使用注意事项

下图存在组合逻辑反馈环,即组合逻辑的输出反馈到输入(赋值的左右2边存在相同的信号),此种情况会造成系统不稳定。比如在data_in20的情况下,在data_out0 时候,输出的数据会反馈到输入,输入再输出,从而造成不…

深度学习常见问题

1.YOLOV5和YOLOV8的区别 YOLOv5 和 YOLOv8 是两个版本的 YOLO(You Only Look Once)目标检测算法,它们在网络架构、性能优化、功能扩展等方面有显著的区别。YOLOv5 是 YOLO 系列的重要改进版本,而 YOLOv8 是最新的一次重大升级&am…

【C++网络编程】(一)Linux平台下TCP客户/服务端程序

文章目录 Linux平台下TCP客户/服务端程序服务端客户端相关头文件介绍 Linux平台下TCP客户/服务端程序 图片来源:https://subingwen.cn/linux/socket/ 下面实现一个Linux平台下TCP客户/服务端程序:客户端向服务器发送:“你好,服务…