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

【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-axiscolor = '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-axiscolor = '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-axiscolor = '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-axiscolor = '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-axiscolor = '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-axiscolor = '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-axiscolor = '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-axiscolor = '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-axiscolor = '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.rhkb.cn/news/446805.html

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

相关文章

鸿蒙开发(NEXT/API 12)【使用fetchsync发送同步网络请求】远场通信服务

场景介绍 发送一个同步HTTP请求,也可以设置请求头和请求体等参数,并返回来自服务器的HTTP响应。常用于获取资源,支持通过拦截器来处理请求和响应。 接口说明 接口名描述Rcp_Response *HMS_Rcp_FetchSync(Rcp_Session *session, Rcp_Reques…

【Linux第一弹】- 基本指令

🌈 个人主页:白子寰 🔥 分类专栏:重生之我在学Linux,C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持…

Window7上微信小程序开发工具上,小程序界面空白

目录 背景 解决方案 背景 微信小程序开发工具不断升级,自从1.06后不再支持Window7系统。安装1.05版本开发工具软件,新建小程序后,小程序界面空白,真机显示正常,但是对于开发者来说很不友好。 解决方案 点击“设置-&…

selenium的IDE插件进行录制和回放并导出为python/java脚本(10)

Selenium IDE:Selenium Suite下的开源Web自动化测试工具,是Firefox或者chrome的一个插件,具有记录和回放功能,无需编程即可创建测试用例,并且可以将用例直接导出为可用的python/java等编程语言的脚本。 我们以chrome浏…

今日最佳WAF雷池社区版,tengine问题解决办法

很多第一次使用雷池社区版的朋友会碰到tengine相关的问题 其实官方文档都有记录怎么排除,这里都单独把tengine的排查方法再说一下 请检查防火墙规则, tengine 容器状态和日志 如果站点报错如上,说明tengine容器可能出现问题,需…

Element Ui el-table列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示内容,虽然el-table列属性中带的有show-overflow-tooltip,可以设置内容超出列宽度显示为…,且有tooltip提示全部内容,但是内容过多时,提示会超出屏幕: 只有…

Excel:vba实现拆分单元格成一字一单元格

我拿到的表格如下: 我想实现的表格效果如下: 要求就是:将A列的千字文拆分成一个单元格一个字,并整理成4列 我这里是将效果呈现到一个新的表里面,没有在原表里面(在原表里…

【C语言】深入理解指针(三)(下)

本篇文章将讲解以下知识: 1、二维数组传参的本质 2、函数指针变量 3、函数指针数组 1、二维数组传参的本质 有了数组指针的理解,我们就能弄清楚二维数组传参的本质了 例如: 在一维数组中,数组名是数字首元素的地址。但有两个例外…

如何在UE5中创建加载屏幕(开场动画)?

第一步: 首先在虚幻商城安装好Async Loading Screen,并且在项目的插件中勾选好。 第二步: 确保准备好所需要的素材: 1)开头的动画视频 2)关卡加载图片 3)准备至少两个关卡 第三步&#xff1a…

【隐私计算篇】一种批量匿踪查询友好算法PIRANA的原理分析

1. 背景分析 前段时间开展了批量匿踪查询算法迭代优化的工作,取得了一些进展。不得不说,甲方爸爸永远会提出非常有挑战性的目标,push你去想各种解决方案。在实际的算法研发落地上,我们会结合算法本身的机制改进以及工程优化这两方…

创客项目秀 | 基于使用 XIAO BLE Sense 和 Edge Impulse 的宠物活动跟踪器

今天为大家带来的是来自美国的创作者米顿-达斯的作品:宠物活动跟踪器.这个装置主要是为宠物主人提供关于宠物日常活动量的详尽数据,还能够根据宠物的独特需求,提供个性化的健康建议和活动指导。 项目背景 为了全面促进宠物的健康与活力,采用…

在 MTT GPU 上使用 llama.cpp 推理

大语言模型因其出色的自然语言理解和生成能力而迅速被广泛使用,llama.cpp 大幅降低了进行大语言模型推理的门槛,MTT GPU 同样也是 llama.cpp 支持的运行平台,能够充分利用硬件的性能来助力用户的大语言模型应用。 本文主要介绍了如何在摩尔线…

『网络游戏』客户端发送消息到服务器【17】

将上一章服务器的协议PEProtocol的.dll文件重新生成导入unity客户端中 命名为Net 点击生成 另一种导入.dll文件方式 在客户端粘贴即可 此时Net文件夹的.dll文件就导入进来了 创建脚本:NetSvc.cs 编写脚本:NetSvc.cs 修改脚本:GameRoot.cs 在…

Cherno游戏引擎笔记(61~72)

---------------一些维护和更改------------- 》》》》 Made Win-GenProjects.bat work from every directory 代码更改: echo off->pushd ..\->pushd %~dp0\..\call vendor\bin\premake\premake5.exe vs2019popdPAUSE 为什么要做这样的更改? …

基于微信小程序的购物系统php+论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的如虎添翼,发展迅猛。 2.2 MySQL数据…

【论文阅读】SRCNN

学习资料 论文题目:Learning a Deep Convolutional Network for Image Super-Resolution(学习深度卷积网络用于图像超分辨率)论文地址:link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf代码:作者提出的…

CVE-2022-26965靶机渗透

​ 开启环境 ​ ​ 进入环境 ​ ​ 使用弱口令admin登录 ​ ​ 利用cms主题构造木马 ​ 需要将主题中的info.php文件修改,再打包成zip再上传,通过网络搜索找到Github中的Pluck CMS,进入后随便下载任一主题 https://github.com/sear…

ThinkBook 16+ 锐龙6800h 安装ubuntu键盘失灵

问题:在ThinkBook 16 锐龙6800h 安装ubuntu18.04 出现笔记本键盘按下延迟非常高,输出卡死的情况,但是外接键盘可以正常使用 解决:更新内核 1、进入 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 下载所需内核版本&#x…

深入理解链表(SList)操作

目录: 一、 链表介绍1.1、 为什么引入链表1.2、 链表的概念及结构1.3、 链表的分类 二、 无头单向非[循环链表](https://so.csdn.net/so/search?q循环链表&spm1001.2101.3001.7020)的实现2.1、 [单链表](https://so.csdn.net/so/search?q单链表&spm1001.2…

论文阅读:OpenSTL: A Comprehensive Benchmark of Spatio-Temporal Predictive Learning

论文地址:arxiv 摘要 由于时空预测没有标准化的比较,所以为了解决这个问题,作者提出了 OpenSTL,这是一个全面的时空预测学习基准。它将流行的方法分为基于循环和非循环模型两类。OpenSTL提供了一个模块化且可扩展的框架&#xff…