使用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中的错误和异常处理简单操作示例【try-except用法】
这篇文章主要介绍了Python中的错误和异常处理简单操作,结合实例形式分析了Python中try except在错误与异常处理中的用法,需要的朋友可以参考下2017-07-07以windows service方式运行Python程序的方法
这篇文章主要介绍了以windows service方式运行Python程序的方法,可实现将Python程序变成windows服务的功能,需要的朋友可以参考下2015-06-06利用python GDAL库读写geotiff格式的遥感影像方法
今天小编就为大家分享一篇利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-11-11如何使用Django(python)实现android的服务器端
这篇文章主要介绍了Django(python)简单实现android的服务器端,这里所需要的工具是PyCharm--python编辑工具,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-07-07
最新评论