论文绘图时经常需要多图嵌套,正好最近绘图用到了,记录一下使用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',
)

接下来实现条形图与折线图的嵌套,核心是使用 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
)

可以看到,右上角的条形图显得很拥挤,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()

打完收工!

Python嵌套绘图并为条形图添加自定义标注的更多相关文章

  1. python常用绘图软件包记录

    在没有使用python之前,觉得matlab的绘图功能还算可以~但现在发现python的绘图包真的好强大,绘制出的图像非常专业漂亮,但具体使用还有待学习,这里记录学习过程中遇到的python绘图包,以 ...

  2. 百度地图API 添加自定义标注 多点标注

    原文:百度地图API 添加自定义标注 多点标注 分四个文件 location.php map.css 图片 数据库 数据库配置自己改下 -------------------------------- ...

  3. Python生成PASCAL VOC格式的xml标注文件

    Python生成PASCAL VOC格式的xml标注文件 PASCAL VOC数据集的标注文件是xml格式的.对于py-faster-rcnn,通常以下示例的字段是合适的: <annotatio ...

  4. Python 嵌套函数和闭包

    Python 嵌套函数和闭包 1.函数嵌套 如果在一个函数内部定义了另一个函数,我们称外部的函数为外函数,内部的函数为内函数,如下代码: def out_func(): def inner_func1 ...

  5. Python之绘图和可视化

    Python之绘图和可视化 1. 启用matplotlib 最常用的Pylab模式的IPython(IPython --pylab) 2. matplotlib的图像都位于Figure对象中. 可以使 ...

  6. python matplotlib 绘图基础

    在利用Python做数据分析时,探索数据以及结果展现上图表的应用是不可或缺的. 在Python中通常情况下都是用matplotlib模块进行图表制作. 先理下,matplotlib的结构原理: mat ...

  7. 【Matplotlib】利用Python进行绘图

    [Matplotlib] 教程:https://morvanzhou.github.io/tutorials/data-manipulation/plt/ 官方文档:https://matplotli ...

  8. python嵌套函数、闭包与decorator

    1 一段代码的执行结果不光取决与代码中的符号,更多地是取决于代码中符号的意义,而运行时的意义是由名字空间决定的.名字空间是在运行时由python虚拟机动态维护的,但是有时候我们希望能将名字空间静态化. ...

  9. 10分钟轻松学会python turtle绘图

     1. 画布(canvas) 1.1 相关函数: 2. 画笔 2.1 画笔的状态 2.2 画笔的属性 2.3 绘图命令 3. 命令详解 4. 绘图举例 4.1 太阳花 4.2 绘制小蟒蛇 4.3 绘 ...

  10. Python matplotlib绘图学习笔记

    测试环境: Jupyter QtConsole 4.2.1Python 3.6.1 1.  基本画线: 以下得出红蓝绿三色的点 import numpy as npimport matplotlib. ...

随机推荐

  1. [转帖]不同CPU性能大PK

    https://plantegg.github.io/2022/01/13/%E4%B8%8D%E5%90%8CCPU%E6%80%A7%E8%83%BD%E5%A4%A7PK/ 前言 比较Hygon ...

  2. [转帖]kubernetes service 和 kube-proxy详解

    https://plantegg.github.io/2020/01/22/kubernetes%20service/ 性能情况.. service 模式 根据创建Service的type类型不同,可 ...

  3. [转帖]Linux系统语言设置和locale命令详解

    简介 Linux系统可以用locale命令查看语言设置,查看中英文环境,具体操作如下. 操作 1.查看当前安装有那些语言: [root@localhost /]# locale -a 2.当前语言相关 ...

  4. [转帖]SPEC2006

    安装步骤 # Ubuntu16.04 # 注意安装gFortran . ./install.sh . ./shrc 一般情况下经过以上步骤即可安装完毕,进行使用,注意需要执行shrc设置完环境变量以后 ...

  5. vue3中retive的错误用法导致数据不跟新

    retive的错误用法 <template> <div> 司藤的信息==>{{ objInfo }} <button @click="handerHttp ...

  6. uni-app快速导入自己需要的插件

    在uni-app中快速导入自己需要的插件 在uni-app的官网上;找到自己需要的插件: 然后点击右侧顶部的[使用HX导入]这一步的前提是你必须要用自己的账好登录: 然后选择你要导入哪一个项目 然后就 ...

  7. openAI发布v0.2.0了

    时隔20天,OpenAI从v0.0.1升级到了v0.2.0.与v0.0.1版相比,v0.2.0版主要做了以下改动: 把cmd目录下微信公众号的相关服务迁移到了这里 完善了cmd下的测试服务,针对ope ...

  8. 营销(marketing)、推广(Promotion)和 运营(Operation)的概念分别是什么?

    首先要明确的原则: 1.你得承认"讨论任何事情之前不弄清楚概念定义就是耍流氓" 2.你得承认"由于每个人的经验学识和理解力的不同,我们常对概念定义产生分歧" 3 ...

  9. 从此告别涂硅脂 利民推出新款CPU固态导热硅脂片:一片26.9元

    利民(Thermalright)近日推出了新款Heilos CPU固态导热硅脂片,其中Intel版为26.9元,AMD版售价29.9元. 以往向CPU上涂硅脂,需要先挤一粒绿豆大小的硅脂,然后用塑料片 ...

  10. Python Fire:自动生成命令行接口

    命令行程序是平时写一些小工具时最常用的方式. 为了让命令行程序更加灵活,我们常常会设置一些参数,根据参数让程序执行不同的功能.这样就不用频繁的修改代码来执行不同的功能. 随着命令行程序功能的丰富,也就 ...