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

 更新时间:2024年02月27日 08:36:06   作者:geoli91  
论文绘图时经常需要多图嵌套,正好最近绘图用到了,所以这篇文章主要为大家详细介绍了如何使用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',
)

接下来实现条形图与折线图的嵌套,核心是使用 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实现嵌套绘图并为条形图添加自定义标注的文章就介绍到这了,更多相关Python嵌套绘图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解Python在HDA中的应用

    深入了解Python在HDA中的应用

    这篇文章主要介绍了深入了解Python在HDA中的应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 详细总结Python类的多继承知识

    详细总结Python类的多继承知识

    Python类的多继承知识是非常易于新手理解的,如果你是刚刚入门Python的话,欢迎参考本篇文章,本文对Python类的多继承知识作出了非常详细的解释,还有相关代码参考哦。
    2021-05-05
  • Python中的错误和异常处理简单操作示例【try-except用法】

    Python中的错误和异常处理简单操作示例【try-except用法】

    这篇文章主要介绍了Python中的错误和异常处理简单操作,结合实例形式分析了Python中try except在错误与异常处理中的用法,需要的朋友可以参考下
    2017-07-07
  • 以windows service方式运行Python程序的方法

    以windows service方式运行Python程序的方法

    这篇文章主要介绍了以windows service方式运行Python程序的方法,可实现将Python程序变成windows服务的功能,需要的朋友可以参考下
    2015-06-06
  • python实现批量解析邮件并下载附件

    python实现批量解析邮件并下载附件

    这篇文章主要为大家详细介绍了python实现批量解析邮件并下载附件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • numpy中数组的堆叠方法

    numpy中数组的堆叠方法

    本文主要介绍了numpy中数组的堆叠方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python 字典(Dictionary)操作详解

    Python 字典(Dictionary)操作详解

    这篇文章主要介绍了Python 字典(Dictionary)的详细操作方法,需要的朋友可以参考下
    2014-03-03
  • Python进行文件处理的示例详解

    Python进行文件处理的示例详解

    这篇文章主要通过几个简单的示例,为大家详细介绍一下Python实现文件处理的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • 利用python GDAL库读写geotiff格式的遥感影像方法

    利用python GDAL库读写geotiff格式的遥感影像方法

    今天小编就为大家分享一篇利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 如何使用Django(python)实现android的服务器端

    如何使用Django(python)实现android的服务器端

    这篇文章主要介绍了Django(python)简单实现android的服务器端,这里所需要的工具是PyCharm--python编辑工具,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论