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() |

相关推荐
专注API从业者15 分钟前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
java1234_小锋21 分钟前
[免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
python·django·电影推荐系统·协同过滤
看海天一色听风起雨落1 小时前
Python学习之装饰器
开发语言·python·学习
XiaoMu_0012 小时前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
THMAIL2 小时前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
我没想到原来他们都是一堆坏人3 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
用户Taobaoapi20143 小时前
京东店铺所有商品API技术开发文档
大数据·数据挖掘·数据分析
总有刁民想爱朕ha4 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
人衣aoa4 小时前
Python编程基础(八) | 类
开发语言·python
大模型真好玩4 小时前
深入浅出LangGraph AI Agent智能体开发教程(四)—LangGraph全生态开发工具使用与智能体部署
人工智能·python·mcp