如何使用Python和Matplotlib创建双Y轴动态风格折线图 | 数据可视化教程

news2024/11/23 9:57:01

前言

我的科研论文中需要绘制一个精美的折线图,我的折线图中有三条曲线,分别表示期望角速度指令信号,和实际的角速度信号,还有实际的航向角信号,现在我已经拥有了数据,使用Python中matplotlib.plt.plot来直接绘制不够精美,我希望绘制一个精美的折线图,要求是:

  1. 提升绘图的美观程度,特点是风格简单明快。
  2. 这三个曲线要绘制在一张图中
  3. 实际角速度信号置于底层,期望角速度信号置于中层,实际航向角信号置于顶层
  4. 期望角速度信号和实际航向角信号均用实线表示,实际角速度信号用小点表示
  5. 曲线图左侧y轴代表角速度,右侧y轴代表航向角,x轴代表时间
  6. 每一次实际航向角的巨大变化都代表着实际中路径的弯折九十度左右,一共发生了3次,我可以提供这三次的分别发生时间,需要在对应时间位置,垂直于x轴画一条虚线标识
  7. 图像的长宽比是2:1

代码

下面提供实例,代码作为模板

from cProfile import label
from tkinter.ttk import Style
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from scipy.spatial.distance import cdist
from matplotlib.ticker import AutoMinorLocator

# 假定你已经有了数据,这里我用随机数代替
# time为时间轴数据,yaw_rate_cmd为期望角速度指令,yaw_rate_real为实际角速度信号,heading_angle为实际航向角信号
time = np.linspace(0, 10, 100)
yaw_rate_cmd = np.sin(time)  # 示例数据
yaw_rate_real = np.sin(time - 0.5) * 0.8  # 示例数据
heading_angle = np.piecewise(time, [time < 3, (time >= 3) & (time < 6), time >= 6], [45, 90, 135])  # 示例数据

# 创建图像和轴对象
fig, ax1 = plt.subplots()

# 设置绘图风格
plt.style.use('seaborn-whitegrid')

# 绘制实际角速度信号(置于底层,用小点表示)
ax1.plot(time, yaw_rate_real, 'k:', label='Actual Yaw Rate', zorder=1)

# 创建共享x轴的第二个y轴
ax2 = ax1.twinx()

# 绘制期望角速度信号(置于中层,用实线表示)
ax1.plot(time, yaw_rate_cmd, 'b-', label='Desired Yaw Rate', zorder=2)

# 绘制实际航向角信号(置于顶层,用实线表示)
ax2.plot(time, heading_angle, 'r-', label='Heading Angle', zorder=3)

# 指定的时间点
time_points = [3,6.25]

# # 对于每一个指定的时间点,画一条虚线
for time_point in time_points:
    plt.axvline(x=time_point, color='g', linestyle='--', label='Significant Change' if time_point == time_points[0] else "")

# 因为所有虚线都具有相同的意义,所以我们只需要在图例中表示一次
# 检查time_point是否为第一个指定时间点,如果是,则添加图例标签


# 设置轴标题
ax1.set_xlabel('Time (s)')
ax1.set_ylabel('Yaw Rate (degrees/s)', color='b')
ax2.set_ylabel('Heading Angle (degrees)', color='r')

# 设置y轴颜色与曲线颜色一致
ax1.tick_params(axis='y', colors='blue')
ax2.tick_params(axis='y', colors='red')

# 增加图例
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax2.legend(lines + lines2, labels + labels2, loc='upper right')

# 增加次要刻度线以提高可读性
ax1.xaxis.set_minor_locator(AutoMinorLocator())
ax1.yaxis.set_minor_locator(AutoMinorLocator())
ax2.yaxis.set_minor_locator(AutoMinorLocator())

# 显示图像
plt.show()

代码解释

  1. 首先绘制了三个曲线(实际角速度、期望角速度、实际航向角),其中实际角速度曲线使用小点样式表示
  2. 然后创建了一个共享x轴的第二个y轴来绘制航向角
  3. 最后,这个代码段会在3和6.25秒这三个时刻左右绘制绿色虚线,不论这些时刻是否存在于times数组中。图例中的"Significant Change"标签只会添加一次,避免重复。

结果

绘制一个精美的折线图效果

延伸阅读

如何使用Python的matplotlib和seaborn库绘制颜色渐变的高级散点图

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

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

相关文章

Java之图书管理系统

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家分享一下Java实现一个简易的图书管理系统&#xff01; 清风的个人主页&#x1f389;✏️✏️ &#x1f302;c/java领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&…

SpringBoot-SpringCache缓存

文章目录 Spring Cache 介绍常用注解 Spring Cache 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;…

基于级联延迟信号消除的锁相环(CDSC_PLL)技术MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 基于级联型延迟信号消除&#xff08;CDSC&#xff09;的锁相环技术&#xff08;CDSC-PLL&#xff09;&#xff0c;该锁相环克服了传统dq 锁相环在电网电压畸变或不对称时存在较大稳态误差的缺点。CDSC-PLL是在…

windows 用vs创建cmake工程并编译opencv应用项目生成exe流程简述

目录 前言一、安装opencv&#xff08;1&#xff09;下载&#xff08;2&#xff09;双击安装&#xff08;3&#xff09;环境变量和system文件夹设置 二、打开vs创建项目三、编辑cpp&#xff0c;.h&#xff0c;cmakelist.txt文件&#xff08;1&#xff09;h文件&#xff08;2&…

Python-敲木鱼升级版(真手动版敲木鱼)

演示效果 需要安装的第三方库&#xff1a; pip install pygame # 加载音乐 pip install pillow # 加载图片 pip install mediapipe # 判断手势的模型 pip install opencv # 模型要用来处理图形 建议有独显和摄像头的可以尝试&#xff01; 想着升级一下玩法&#xff0c;只有真敲…

二维码智慧门牌管理系统升级:引领政务服务、寄件、开锁、刻章新潮流

文章目录 前言一、政务服务二、寄件服务三、便民开锁和刻章服务四、应用范围 前言 在科技不断进步的时代&#xff0c;二维码智慧门牌管理系统升级版正在改变我们的生活&#xff0c;为政务服务、寄件、便民开锁、刻章等多种业务应用提供全新的解决方案&#xff0c;使我们的日常…

python基础(Python高级特性(切片、列表生成式)、字符串的正则表达式、函数、模块、Python常用内置函数、错误处理)培训讲义

文章目录 1. Python高级特性&#xff08;切片、列表生成式&#xff09;a) 切片的概念、列表/元组/字符串的切片切片的概念列表切片基本索引简单切片超出有效索引范围缺省 扩展切片step为正数step为负数 b) 列表生成式以及使用列表生成式需要注意的地方概念举例说明1. 生成一个列…

详细讲解如何求解「内向基环森林」问题

题目描述 这是 LeetCode 上的 「2876. 有向图访问计数」 &#xff0c;难度为 「困难」。 Tag : 「基环森林」、「内向基环树」、「拓扑排序」、「图」、「BFS」 现有一个有向图&#xff0c;其中包含 n 个节点&#xff0c;节点编号从 0 到 n - 1。此外&#xff0c;该图还包含了 …

OJ练习第185题——数组中两个数的最大异或值

数组中两个数的最大异或值 力扣链接&#xff1a;421. 数组中两个数的最大异或值 题目描述 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 官解思路 异或运算性质&#xff1a; class Solutio…

ZZ038 物联网应用与服务赛题第I套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;I卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工…

NSSCTF第十页(2)

[HNCTF 2022 WEEK3]ssssti 题目提示是jinja2模板 怎么感觉之前做过&#xff0c;看到了注入 随便进行一下注入&#xff0c;发现了过滤 大致的黑名单 " _ args -- 无法使用 request.args os -- 无法导入os 不允许post -- 无法使用 request.value 正常用的payloa…

JavaScript从入门到精通系列第二十九篇:正则表达式初体验

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

暴力递归转动态规划(十三)

题目 给定3个参数&#xff0c;N&#xff0c;M&#xff0c;K 怪兽有N滴血&#xff0c;等着英雄来砍自己 英雄每一次打击&#xff0c;都会让怪兽流失[0~M]的血量 到底流失多少&#xff1f;每一次在[0~M]上等概率的获得一个值 求K次打击之后&#xff0c;英雄把怪兽砍死的概率。 暴…

算法题:53. 最大子数组和(动态规划)Java Python 实现

1、解题思路 该图引用自&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、动态规划解法-Python代码 # 空间未做优化时的代码&#xff0c;保留本部分代码是为了便于理解 # class Solution: # def maxSubArray(self, nums): # …

SpringBoot的Condition注解

文章目录 参考资料运行环境SpringBoot 自动配置原理一、Condition二、切换内置web服务器三、Enable*注解四、Import 注解五、EnableAutoConfiguration 注解六、案例七、收获与总结 参考资料 视频链接 运行环境 win10IDEA专业版SpringBoot 2.6.2 SpringBoot 自动配置原理 一、Co…

信道编码及MATLAB仿真

文章目录 前言一、什么是信道编码&#xff1f;二、信道编码的基本逻辑—冗余数据1、奇偶检验码2、重复码 三、编码率四、4G 和 5G 的信道编码1、卷积码2、维特比译码&#xff08;Viterbi&#xff09;—— 概率译码3、LTE 的咬尾卷积码4、LTE 的 turbo 码 五、MATLAB 仿真1、卷积…

javaspringbootMySQL网上商城系统的设计与实现08789-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设网上商城系统。 本设…

07.Diffusion Model概述

文章目录 Diffusion Model原理Reverse ProcessDenoise模块Forward Process(Diffusion Process) 文字生成图片by Diffusion Model文字生成图像的常见套路Text EncoderFrchet Inception DistanceContrastive Language-Image Pre-Training(CLIP) DecoderGeneration Model 部分截图…

大数据毕业设计选题推荐-收视点播数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Leetcode实战

我们今天来利用这段时间的学习实操下我们的oj题。 int removeElement(int* nums, int numsSize, int val){int dst0;int src0;while(src<numsSize){if(nums[src]!val){nums[dst]nums[src];}elsesrc;}return dst;}我们这里用用两个下标&#xff0c;src来移动&#xff0c;如果…