Python嵌套绘图并为条形图添加自定义标注

论文绘图时经常需要多图嵌套,正好最近绘图用到了,记录一下使用Python实现多图嵌套的过程。

首先,实现 Seaborn 分别绘制折线图和柱状图。

'''绘制折线图'''
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore", "use_inf_as_na")
# 获取绘图数据
df_fmri=sns.load_dataset("fmri")
# 绘制折线图
sns.lineplot(data=df_fmri, x="timepoint", y="signal", hue="event")
# 创建绘图数据
df_bar=df_fmri[['subject','signal']].groupby('subject',observed=True).agg('max').reset_index()
# 绘制条形图
ax_bar=sns.barplot(
data=df_bar,
x="subject", y="signal",
palette='Set2',
)

20240226150039

20240226151334

接下来实现条形图与折线图的嵌套,核心是使用 inset_axes 函数创建一个新的轴,然后再绘制第二个图时指定绘图的轴为刚才新建的轴。

from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import matplotlib.pyplot as plt
# 获取绘图数据
df_fmri = sns.load_dataset("fmri")
df_bar=df_fmri[['subject','signal']].groupby('subject',observed=True).agg('max').reset_index()
# 绘制折线图
ax=sns.lineplot(data=df_fmri, x="timepoint", y="signal", hue="event")
plt.legend(loc='upper left')
# 使用 inset_axes 函数添加一个轴,用来显示条形图
ax_bar = inset_axes(
ax, # 父轴
width='40%', height='50%', # 新轴相对于父轴的长宽比例
loc='lower left', # 新轴的锚点相对于父轴的位置
bbox_to_anchor=(0.55,0.45,1,1), # 新轴的bbox
bbox_transform=ax.transAxes # bbox_to_anchor 的坐标基准
)
# 绘制条形图
ax_bar=sns.barplot(
data=df_bar,
x="subject", y="signal",
palette='Set2',
ax=ax_bar
)

20240226151427

可以看到,右上角的条形图显得很拥挤,x轴标注相互重叠比较严重,因此,考虑将条形图由纵向变为横向,在 Seaborn 绘图时交换 x 轴和 y 轴就能实现。此外,bar上方的空间也比较大,考虑将x轴的标注标注到bar上方,以进一步节约空间。bar的标注可以通过 ax.bar_label() 函数实现,该函数不仅可以直接标注每个bar的数值,也可以自定义要标注的内容和格式。修改后的代码和结果图如下:

from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import matplotlib.pyplot as plt
# 准备数据
df_fmri = sns.load_dataset("fmri")
df_bar=df_fmri[['subject','signal']].groupby('subject',observed=True).agg('max').reset_index()
# 绘制折线图
ax=sns.lineplot(data=df_fmri, x="timepoint", y="signal", hue="event")
plt.legend(loc='upper left')
# 使用 inset_axes 函数添加一个轴,用来显示条形图
ax_bar = inset_axes(
ax, # 父轴
width='47%', height='52%', # 新轴相对于父轴的长宽比例
loc='lower left', # 新轴的锚点相对于父轴的位置
bbox_to_anchor=(0.5,0.44,1,1), # 新轴的bbox
bbox_transform=ax.transAxes # bbox_to_anchor 的坐标基准
)
# 绘制条形图
ax_bar=sns.barplot(
data=df_bar,
# 交换 x 轴和 y 轴列名实现横向条形图
x="signal", y="subject",
palette='Set2',
ax=ax_bar
)
# 使用 sns 的 bar_label 函数为条形图添加标注
ax_bar.bar_label(
ax_bar.containers[0], # 条形图的 BarContainer 对象
labels=df_bar['subject'], # 要标注的labels,默认为 bar 的数值,此处传入自定义的label序列
label_type='edge', # 标注显示的位置,可选 edge 或 center
padding=2, # 标注与bar之间的距离
# fmt='%.2f' # 标注格式化字符串
fontsize=10 # 设置标注的字体大小
)
# 为了避免标注超出绘图范围,将x轴的绘图范围扩大
plt.xlim(0,0.62)
# 隐藏左侧y轴
ax_bar.yaxis.set_visible(False)
# 去除多余的轴线
sns.despine()

20240226153302

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

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

相关文章

STM32CubeMX学习笔记30---FreeRTOS内存管理

一、简介 1 基本概念 FreeRTOS 操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的,所以在 FreeRTOS 中提供了多种内存分配算法(分配策略)&#xf…

《二十二》Qt 音频编程实战---做一个音频播放器

1.UI界面制作 作为一个音乐播放器,最基础的肯定就是播放、暂停、上一首以及下一首,为了使这个界面好看一点,还加入了音量控制、进度条、歌曲列表等内容,至于这种配色和效果好不好看,我也不知道,个人审美一如…

智启未来:富唯智能AI-ICDP引领的可重构柔性装配产线

在全球制造业竞争日益激烈的今天,如何快速响应市场变化、提高生产效率、降低生产成本,成为了企业面临的重要挑战。随着产品个性化时代的到来,装配产品频繁变换,多品种小批量的生产模式逐渐成为主流。在这一背景下,富唯…

python 前台页面和oracle数据库联动案例-用户注册

今天是python 入门day3,案例实现界面如图,比较简单, 一个简单的用户注册页面,并且可以与Oracle数据库进行交互。 界面如图: 实现这个简单demo的过程中,遇到很多错误, 1、提交过程中提示主键不…

照片文件夹惊变白板?揭秘背后的原因及恢复秘籍

我们生活在一个数字化时代,照片已经成为记录生活的重要方式。然而,当你兴冲冲地打开保存珍贵记忆的文件夹时,却发现里面的照片全都变成了白板,这种心情无异于晴天霹雳。那么,这究竟是怎么回事呢? 照片文件夹…

【记录】常见的前端设计系统(Design System)

解释一下设计系统的定义,以及在国内,都有那些优秀的设计系统可以学习,希望可以帮到大家。 什么是设计系统(Design System)? 设计系统(Design System)是一套综合性的指导原则、组件和规则&…

Mysql8.0.30一次表锁问题的解决

起因 给material_config_field_data表的字段建立全文索引的时,发现该表卡死,然后无法对该表进行任何操作。 查找问题 执行sql #这个命令会显示InnoDB存储引擎的详细状态信息,包括锁等待和锁争用的信息 SHOW ENGINE INNODB STATUS结果 复制S…

语言基础 /CC++ 可变参函数设计与实践,变参函数的实现、使用、替代方法

文章目录 概述适用于做可变参数的数据类型格式化字符串输出用int做变长参数类型用结构体指针做变长参数类型用double做变长参数类型用结构体直接做变长参数类型 变参函数与宏定义符号 ... 不能透传符号 ... 不接受ap做参数_VA_ARGS_ 代表可变参数 回调可变参数函数取代变参函数…

Linux 第二十四章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

vue3.0(五) reactive全家桶

文章目录 1 reactive1.1 reactive的应用1.2 reactive的特点1.3 reactive的注意1.4 reactive的局限性 2 toRefs3 isReactive4 shallowReactive5 readonly5.1 readonly 详细信息5.2 readonly函数创建一个只读的响应式对象5.3 如何修改嵌套在只读响应式对象中的对象? 6 isReadonl…

小程序(三)

十三、自定义组件 (二)数据方法声明位置 在js文件中 A、数据声明位置:data中 B、方法声明位置methods中,这点和普通页面不同! Component({/*** 组件的属性列表*/properties: {},/*** 组件的初始数据*/data: {isCh…

在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看

今天测试了一把在开发板把摄像头数据推流到云端服务器,然后给其他电脑通过val软件拉取显示摄像头画面,浅浅记录一下大概步骤 1.开发板端先下载ffmpeg apt install ffmpeg2.云服务器先安装SRS的库 云服务器我使用ubuntu系统,SRS是个什么东西&…

怎么开发付费视频系统_轻松拥有知识付费平台

在信息爆炸的时代,我们每天都在被海量的内容所包围。但你有没有想过,如何将这些内容变得更加有价值,更加个性化,甚至能够为你带来经济收益?今天,就让我带你走进一个全新的领域——付费视频系统,…

电解制氢电源-零排放氢源生成器

电解制氢电源:氢能源的制造者 氢能作为一种清洁、高效的能源,正逐渐成为我国能源战略的重要组成部分。电解制氢电源作为氢能产业链的核心环节,对于实现氢能产业的可持续发展具有重要意义。 电解制氢电源是一种利用电能将水分解为氢气和氧气的…

Django项目之电商购物商城 -- 新增收货地址

Django项目之电商购物商城 – 新增收货地址 在项目中新增收货地址我们需要根据前端的设置来写 在这里我们看到新增收货地址的方法发送的是一个ajax请求 , 使用的是post方法 , 其路由为addresses/create 分析完毕后开始写视图以及路由 一. 设置视图以及路由 因为新增地址依…

vue数据大屏并发请求

并发? 处理并发 因为js是单线程的,所以前端的并发指的是在极短时间内发送多个数据请求,比如说循环中发送 ajax , 轮询定时器中发送 ajax 请求. 然后还没有使用队列, 同时发送 的. 1. Promise.all 可以采用Promise.all处理并发, 当所有pro…

传输层协议——UDP协议

目录 一、传输层 二、再谈端口号 端口号的划分 知名端口号 pidof netstat命令 三、UDP协议 1、UDP协议格式 2、UDP协议特点 3、UDP协议的缓冲区 四、基于UDP的应用层协议 一、传输层 上一篇文章我们所讲到的HTTP协议和HTTPS协议,是属于应用层协议。我们…

vue3.x + echarts 5.x + ant-design-vue 4.x + monaco-editor v3 新增版本切换功能

前言 1. 因为vue架构中,大多数包都是通过npm / yarn 等工具直接安转到node_modules 使用 2. 多个版本切换时,不可能全部安装echarts版本 3. 所以思路围绕如何通过cdn动态引入echarts一、添加工具代码 loadScript 路径 utils/loadScript.js export de…

【NodeMCU实时天气时钟温湿度项目 2】WIFI模式设置及连接

第一专题内容,请参考 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计-CSDN博客 第三专题内容,请参考 【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器,获取并显示当前环境温湿度数据&#…

致鸿物流器材有限公司揭示2024数字物流供应链与技术装备展新动态

参展企业介绍 广东致鸿物流器材有限公司,前身为广州致鸿物流器材有限公司,成立于2002年初,是一家在中国仓储笼行业成立多年的专业仓储笼制造公司,公司员工约400名,日产仓储笼制造规模近8000个,在全国范围内…