python画图|多个Y轴分列右侧

news2025/4/16 17:09:59

【1】引言

前述python画图学习中,已经探索过X轴和Y轴的共享,可通过下述链接直达:

西猫雷婶-CSDN博客

但现实的画图实践中总会有新的要求,之前将所有轴合到一起的形式可能不再适用,因此,很有必要探索多个Y轴分列的绘图方法。

【2】官网教程

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

https://matplotlib.org/stable/gallery/spines/multiple_yaxis_with_spines.html#sphx-glr-gallery-spines-multiple-yaxis-with-spines-py

官网教程非常简洁,为此增加了注释。

【3】代码解读

首先引入画图模块matplotlib:

import matplotlib.pyplot as plt #引入画图模块

然后定义了要画图,并约定了第一个图的右边线在整个图片中的位置:

fig, ax = plt.subplots() #定义要画图
fig.subplots_adjust(right=0.75) #设置图形右侧边线所处位置,是图形宽度的函数

关于 fig.subplots_adjust()的解释可参考下述链接:

https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.subplots_adjust.html#matplotlib.figure.Figure.subplots_adjust

fig.subplots_adjust()实际可设置以下内容:

Figure.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

left, bottom, right和top 代表图像左下右上边线在整个图形中的位置,相当于直接约定了图像的大小,wspace和hspace则约定了图像的填充。

为此,在【3.1】节展开测试。

接下来使用twinx()函数对X轴进行共享:

twin1 = ax.twinx() #twin1和ax共享X轴
twin2 = ax.twinx() #twin2和ax共享X轴

然后对twin2的Y轴进行了位置设定:将Y轴设定在图像右侧120%位置处

twin2.spines.right.set_position(("axes", 1.2))

然后分别绘制p1、p2和p3:

p1, = ax.plot([0, 1, 2], [0, 1, 2], "C0", label="Density")
p2, = twin1.plot([0, 1, 2], [0, 3, 2], "C1", label="Temperature")
p3, = twin2.plot([0, 1, 2], [50, 30, 15], "C2", label="Velocity")

然后对坐标范围和标签进行设置:

ax.set(xlim=(0, 2), ylim=(0, 2), xlabel="Distance", ylabel="Density") #设置坐标范围和标签
twin1.set(ylim=(0, 4), ylabel="Temperature") #设置坐标范围和标签
twin2.set(ylim=(1, 65), ylabel="Velocity") #设置坐标范围和标签

然后是颜色设置,这里是一个巧妙的嵌套:先设置文本的颜色,然后要求线条颜色和文本颜色一致:

ax.yaxis.label.set_color(p1.get_color()) #设置线条颜色和文本颜色
twin1.yaxis.label.set_color(p2.get_color()) #设置线条颜色和文本颜色
twin2.yaxis.label.set_color(p3.get_color()) #设置线条颜色和文本颜色

之后设置了Y轴凸出的小短线标签的颜色,使其和线条文本的颜色保持一致:

ax.tick_params(axis='y', colors=p1.get_color()) #设置Y轴凸出标签的颜色
twin1.tick_params(axis='y', colors=p2.get_color()) #设置Y轴凸出标签的颜色
twin2.tick_params(axis='y', colors=p3.get_color()) #设置Y轴凸出标签的颜色

最后设置图例和输出图形:

ax.legend(handles=[p1, p2, p3])

plt.show()

ax.legend()中的handles直接指向p1, p2, p3,实现图例的集中输出。

至此的完整代码为:

import matplotlib.pyplot as plt #引入画图模块

fig, ax = plt.subplots() #定义要画图
fig.subplots_adjust(right=0.75) #设置图形右侧边线所处位置,是图形宽度的函数

twin1 = ax.twinx() #twin1和ax共享X轴
twin2 = ax.twinx() #twin2和ax共享X轴

# Offset the right spine of twin2.  The ticks and label have already been
# placed on the right by twinx above.
twin2.spines.right.set_position(("axes", 1.2)) #设置twin2的Y轴位于图像右侧120%处

p1, = ax.plot([0, 1, 2], [0, 1, 2], "C0", label="Density") #绘图
p2, = twin1.plot([0, 1, 2], [0, 3, 2], "C1", label="Temperature") #绘图
p3, = twin2.plot([0, 1, 2], [50, 30, 15], "C2", label="Velocity") #绘图

ax.set(xlim=(0, 2), ylim=(0, 2), xlabel="Distance", ylabel="Density") #设置坐标范围和标签
twin1.set(ylim=(0, 4), ylabel="Temperature") #设置坐标范围和标签
twin2.set(ylim=(1, 65), ylabel="Velocity") #设置坐标范围和标签

ax.yaxis.label.set_color(p1.get_color()) #设置线条颜色和文本颜色
twin1.yaxis.label.set_color(p2.get_color()) #设置线条颜色和文本颜色
twin2.yaxis.label.set_color(p3.get_color()) #设置线条颜色和文本颜色

ax.tick_params(axis='y', colors=p1.get_color()) #设置Y轴凸出标签的颜色
twin1.tick_params(axis='y', colors=p2.get_color()) #设置Y轴凸出标签的颜色
twin2.tick_params(axis='y', colors=p3.get_color()) #设置Y轴凸出标签的颜色

ax.legend(handles=[p1, p2, p3]) #集中输出图例

plt.show() #输出图形

输出图像为:

图1

【3】代码修改

【3.1】横向测试

输入以下代码,对fig.subplots_adjust()函数进行测试。此处的测试方案是横向输出子图,所以hspace的设置没有任何影响。

import matplotlib.pyplot as plt #引入画图模块

fig, ax = plt.subplots(1,2 ) #定义要画图
fig.subplots_adjust(left=0.5,bottom=0.5,right=0.8,top=0.8,wspace=3,hspace=1) #设置图形右侧边线所处位置,是图形宽度的函数

ax[0].plot([0, 1, 2], [0, 1, 2], "C0", label="Density")
ax[1].plot([0, 1, 2], [0, 1, 2], "C01", label="Density1")
ax[0].legend()
ax[0].set(xlim=(0, 2), ylim=(0, 2), xlabel="Distance", ylabel="Density")
ax[1].set(xlim=(0, 2), ylim=(0, 2), xlabel="Distance", ylabel="Density")
ax[1].legend()

plt.show()

运行代码后的输出图像为:

图2

图2中的两个子图位置由下述代码提前约定:

fig.subplots_adjust(left=0.5,bottom=0.5,right=0.8,top=0.8,wspace=3,hspace=1)

其中left=0.5,bottom=0.5约定了第一个子图的左边线和下边线分别位于整个图形横轴和纵轴的中部;right=0.8,top=0.8约定了右边线和上边线分别位于整个图形横轴和纵轴的80%位置处。这里面引用的所有数据起始点都位于图像的左下角(0,0)位置处。

wspace=3约定了两个子图的横向间距是3个坐标轴宽度。

【3.2】纵向测试

输入以下代码,对fig.subplots_adjust()函数进行测试。此处的测试方案是横向输出子图,所以wspace的设置没有任何影响。

import matplotlib.pyplot as plt #引入画图模块

fig, ax = plt.subplots(2,1 ) #定义要画图
fig.subplots_adjust(left=0.5,bottom=0.5,right=0.8,top=0.8,wspace=3,hspace=6) #设置图形右侧边线所处位置,是图形宽度的函数

ax[0].plot([0, 1, 2], [0, 1, 2], "C0", label="Density")
ax[1].plot([0, 1, 2], [0, 1, 2], "C01", label="Density1")
ax[0].legend()
ax[0].set(xlim=(0, 2), ylim=(0, 2), xlabel="Distance", ylabel="Density")
ax[1].set(xlim=(0, 2), ylim=(0, 2), xlabel="Distance", ylabel="Density")
ax[1].legend()

plt.show()

运行代码后的输出图像为:

图3

图2中的两个子图位置由下述代码提前约定:

fig.subplots_adjust(left=0.5,bottom=0.5,right=0.8,top=0.8,wspace=3,hspace=6)

其中left=0.5,bottom=0.5约定了第一个子图的左边线和下边线分别位于整个图形横轴和纵轴的中部;right=0.8,top=0.8约定了右边线和上边线分别位于整个图形横轴和纵轴的80%位置处。这里面引用的所有数据起始点都位于图像的左下角(0,0)位置处。

hspace=6约定了两个子图的纵向间距是6个坐标轴宽度。

【4】代码优化

引入计算模块,将变量变成三角函数,改后代码为:

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

fig, ax = plt.subplots() #定义要画图
fig.subplots_adjust(right=0.75) #设置图形右侧边线所处位置,是图形宽度的函数

t=np.linspace(0,10,100)
twin1 = ax.twinx() #twin1和ax共享X轴
twin2 = ax.twinx() #twin2和ax共享X轴

# Offset the right spine of twin2.  The ticks and label have already been
# placed on the right by twinx above.
twin2.spines.right.set_position(("axes", 1.2)) #设置twin2的Y轴位于图像右侧120%处

p1, = ax.plot(t, np.sin(t)+1, "C0", label="Density") #绘图
p2, = twin1.plot(t, np.cos(t)+1, "C1", label="Temperature") #绘图
p3, = twin2.plot(t, np.sin(t)+np.cos(t)+1, "C2", label="Velocity") #绘图

ax.set(xlim=(0, 10), ylim=(-0.25, 3), xlabel="Distance", ylabel="Density") #设置坐标范围和标签
twin1.set(ylim=(-0.5, 3), ylabel="Temperature") #设置坐标范围和标签
twin2.set(ylim=(-1.5, 3), ylabel="Velocity") #设置坐标范围和标签

ax.yaxis.label.set_color(p1.get_color()) #设置线条颜色和文本颜色
twin1.yaxis.label.set_color(p2.get_color()) #设置线条颜色和文本颜色
twin2.yaxis.label.set_color(p3.get_color()) #设置线条颜色和文本颜色

ax.tick_params(axis='y', colors=p1.get_color()) #设置Y轴凸出标签的颜色
twin1.tick_params(axis='y', colors=p2.get_color()) #设置Y轴凸出标签的颜色
twin2.tick_params(axis='y', colors=p3.get_color()) #设置Y轴凸出标签的颜色

ax.legend(handles=[p1, p2, p3]) #集中输出图例

plt.show() #输出图形

运行后的图像为:

图4

可见,twins()函数确实有良好的适应性。

【5】动态输出

在先前的学习进程中,已经掌握动态输出技能,参考下述链接:

python画图|曲线动态输出基础教程-CSDN博客

python画图|散点图动态输出-CSDN博客

此处也尝试一下,制作Y轴分列的动态输出图,首先实现动态输出,在编辑器输入以下代码:

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

import matplotlib.animation as animation #引入动画制作模块

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

x = np.arange(0, 2*np.pi, 0.01) #定义自变量
twin1 = ax.twinx() #twin1和ax共享X轴
twin2 = ax.twinx() #twin2和ax共享X轴

line, = ax.plot(x, np.sin(x)) #定义因变量
line1, = twin1.plot(x, np.cos(x)) #定义因变量
line2, = twin2.plot(x, np.cos(x)+np.sin(x)) #定义因变量

def animate(i): #自定义函数
    line.set_ydata(np.sin(x + i / 50))  # update the data. 更新Y轴数据,实现动态输出
    line1.set_ydata(np.cos(x + i / 50))  # update the data. 更新Y轴数据,实现动态输出
    line2.set_ydata(np.cos(x + i / 50)+np.sin(x + i / 50))
    return line,line1,line2


ani = animation.FuncAnimation( #绘制动画
    fig, animate, interval=20, blit=True, save_count=50)

ani.save('animations-3lines.gif') #保存动画
plt.show() #输出图形

获得输出图形为:

图5

由图5可见,在未设置分列Y轴位置的时候,所有轴重合在一起。

为此,继续增加代码,让不同的Y轴分列显示,同时给线条设置不同的颜色。

先设置图形右侧边线位置:

fig, ax = plt.subplots() #定义画图
fig.subplots_adjust(right=0.75)

再设置第二个分列轴的位置:

twin2.spines.right.set_position(("axes", 1.2))

统一轴和线条的颜色:

ax.yaxis.label.set_color(line.get_color()) #设置线条颜色和文本颜色
twin1.yaxis.label.set_color(line1.get_color()) #设置线条颜色和文本颜色
twin2.yaxis.label.set_color(line2.get_color()) #设置线条颜色和文本颜色

ax.tick_params(axis='y', colors=line.get_color()) #设置Y轴凸出标签的颜色
twin1.tick_params(axis='y', colors=line1.get_color()) #设置Y轴凸出标签的颜色
twin2.tick_params(axis='y', colors=line2.get_color()) #设置Y轴凸出标签的颜色

获得的图形为:

图6

对应的完整代码为:

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

import matplotlib.animation as animation #引入动画制作模块

fig, ax = plt.subplots() #定义画图
fig.subplots_adjust(right=0.75)

x = np.arange(0, 10, 0.01) #定义自变量
twin1 = ax.twinx() #twin1和ax共享X轴
twin2 = ax.twinx() #twin2和ax共享X轴
twin2.spines.right.set_position(("axes", 1.2))
line, = ax.plot(x, np.sin(x),"C0",label="Density") #定义因变量
line1, = twin1.plot(x, np.cos(x),"C1",label="Temperature") #定义因变量
line2, = twin2.plot(x, np.cos(x)+np.sin(x), "C2",label="Velocity") #定义因变量

def animate(i): #自定义函数
    line.set_ydata(np.sin(x + i / 50))  # update the data. 更新Y轴数据,实现动态输出
    line1.set_ydata(np.cos(x + i / 50))  # update the data. 更新Y轴数据,实现动态输出
    line2.set_ydata(np.cos(x + i / 50)+np.sin(x + i / 50))
    return line,line1,line2


ani = animation.FuncAnimation( #绘制动画
    fig, animate, interval=20, blit=True, save_count=50)

ax.set(xlim=(0, 10), ylim=(-1.5, 1.5), xlabel="Distance", ylabel="Density") #设置坐标范围和标签
twin1.set(ylim=(-1.5, 1.5), ylabel="Temperature") #设置坐标范围和标签
twin2.set(ylim=(-2.5, 3), ylabel="Velocity") #设置坐标范围和标签

ax.yaxis.label.set_color(line.get_color()) #设置线条颜色和文本颜色
twin1.yaxis.label.set_color(line1.get_color()) #设置线条颜色和文本颜色
twin2.yaxis.label.set_color(line2.get_color()) #设置线条颜色和文本颜色

ax.tick_params(axis='y', colors=line.get_color()) #设置Y轴凸出标签的颜色
twin1.tick_params(axis='y', colors=line1.get_color()) #设置Y轴凸出标签的颜色
twin2.tick_params(axis='y', colors=line2.get_color()) #设置Y轴凸出标签的颜色

ax.legend(handles=[line, line1, line2]) #集中输出图例
ani.save('animations-3lines.gif') #保存动画


plt.show() #输出图形

【6】总结

学习了多个Y轴分列右侧的操作技巧,在此基础上实现了动态曲线输出。

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

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

相关文章

下一代安全:融合网络和物理策略以实现最佳保护

在当今快速发展的技术环境中,网络和物理安全融合变得比以往任何时候都更加重要。随着物联网 (IoT) 和工业物联网 (IIoT) 的兴起,组织在保护数字和物理资产方面面临着独特的挑战。 本文探讨了安全融合的概念、说明其重要性的实际事件以及整合网络和物理安…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

Windows 修改 Alt+Tab 键 切换 新版 Microsoft Edge 单个标签页/窗口

Windows 10 修改 AltTab 键 切换 新版 Microsoft Edge 单个标签页/窗口 解决方案:在 Windows 设置 的搜索框中 搜索 alt,选择 选择按下 AltTab 时显示的窗口和选项卡,将 按 Alt Tab 将显示 选为 仅打开的窗口 详细过程: 在 Win…

打造高效3D打印利器:STEP转STL格式转换器

随着3D打印技术的日益普及,越来越多的设计师和工程师开始使用三维建模软件来创建复杂的产品模型。然而,不同的软件往往采用不同的文件格式,这给模型的共享和打印带来了诸多不便。本文将重点介绍STEP格式转STL格式的转换器,帮助大家…

【图论】(三)图论的并查集问题

图论的并查集问题 并查集理论基础并查集理论路径压缩代码模板模拟过程 找亲戚寻找存在的路径冗余连接冗余连接II 并查集理论基础 参考学习视频: 图论——并查集(详细版) 并查集理论 并查集主要用于处理一些不相交集合的合并问题(连通性问题&#xff0…

汽车网络安全 -- 后量子密码时代还远吗?

目录 1.量子计算对密码学的威胁 1.1 传统密码学速览 1.2 量子计算对密码学的威胁 2.后量子密码学 2.1 量子计算原理 2.2 后量子密码学 3.未来汽车网络安全面临的威胁 3.1 量子计算对汽车的威胁 3.2 TC4xx对于PQC算法的支持 国庆抽空回顾了下Hitex组织的《Designing wi…

西门子S7-1200选型指南之概述

S7-1200 控制器概述 S7-1200 虽然只是中小型控制器,但是功能很全面。它具有较高性能,并且具有很强的扩展能力,通信能力多种多样,本体即具有各种常见工艺功能,此外也具备西门子常见的诊断功能,下面将分几部…

vue3 + vite + cesium项目

GitHub - tingyuxuan2302/cesium-vue3-vite: 项目基于 vue3 vite cesium,已实现常见三维动画场,欢迎有兴趣的同学加入共建,官网服务器相对拉胯,请耐心等候...https://github.com/tingyuxuan2302/cesium-vue3-vite/tree/github

计算机网络:数据链路层 —— 数据链路层的三个重要问题

文章目录 数据链路层的重要问题封装成帧封装过程帧的数据载荷 透明传输实现透明传输 差错检测传输差错误码(比特差错)分组丢失分组失序分组重复 奇偶校验循环冗余校验生成多项式方法流程 纠错码 数据链路层的重要问题 封装成帧 在计算机网络中&#xf…

基于Java+SpringBoot+Uniapp的博客系统设计与实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Jenkins整合Docker实现CICD自动化部署(若依项目)

前期准备 提前准备好jenkins环境 并且jenkins能使用docker命令,并且已经配置好了jdk、node、maven环境,我之前写了安装jenkins的博客,里面讲得比较详细,推荐用我这种方式安装 docker安装jenkins,并配置jdk、node和m…

【分布式架构】分布式事务理论与实践

一、分布式事务理论 1. ACID理论 场景:单机架构中保证事务的理论 2. CAP理论 场景:分布式架构中保证事务的理论 概念 一致性:数据在不同的节点每一时刻都是一致的可用性:一部分的节点出现异常,但是系统仍然可用分…

【3dgs】3DGS与NeRF对比

以下是 3DGS(3D Geometry Sensing)与 NeRF(Neural Radiance Fields)对比表格: 更加详细的资料,轻参考: NERF/3DGS 对比维度3DGS (3D Geometry Sensing)NeRF (Neural Radiance Fields)基本原理…

【Linux进程信号】Linux信号产生机制详解:掌握系统通信的关键

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux进程信号 📒1. 信号入门📜2. 信号捕捉初识📚3. 信号…

Windows应急响蓝安服面试

Windows应急响应 蓝队溯源流程 学习Windows应急首先要站在攻击者的角度去学习一些权限维持和权限提升的方法.,文章中的方法其实和内网攻防笔记有类似l红队教你怎么利用 蓝队教你怎么排查 攻防一体,应急响应排查这些项目就可以 端口/服务/进程/后门文件都是为了权限维持,得到s…

linux安装hadoop

目录 jdk安装配置 hadoop安装 hadoop配置 配置ssh免密登录 启动hadoop 实现文件上传下载 eclipse安装配置 jdk安装配置 1、删除centos自带的jdk yum list installed | grep java yum remove *openjdk* 2、下载jdk安装包 wget --no-check-certificate https://repo.h…

InternVid:用于多模态视频理解与生成的大规模视频-文本数据集 | ICLR Spotlight

InternVid 是一个开源的大规模视频-文本数据集,旨在促进视频理解和生成任务的发展,由上海人工智能实验室与南京大学、中国科学院等单位联合发布,相关的工作已经被ICLR2024接收。它包含超过 700 万个视频,总时长近 76 万小时&#…

位操作位操作位操作

呵呵哈哈哈哈哈哈哈哈哈和哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

MySQL—视图

前言: 视图是一个虚拟的表,是基于一个或多个基本表或其他视图的查询结果集。视图本身不占据物理储存空间,仅仅只是一个查询的逻辑表示,物理上依赖于数据表的数据。 视图具有简单,安全,逻辑数据独立&#…

CST软件优化超表面--- 偏振片- 线圆极化转换,天线阵任务,远场算轴比AR

本期我们继续看线极化转圆极化。本案例是个三层结构,比单层的偏振片有更宽的频率和更少的反射。我们将利用CST的天线阵列任务中的单元任务,加上优化器优化,使偏振片在多个入射角、多个频率,S11反射都够小,AR都够圆。 …