You need to enable JavaScript to run this app. 如何调整Seaborn displot的suptitle位置使其向上偏移
优惠活动
大模型
产品
解决方案
定价
更多

如何调整Seaborn displot的suptitle位置使其向上偏移

问题根因

Seaborn的displot是基于FacetGrid实现的多子图绘图接口,默认布局下,每个子图的分类标题会紧贴在子图上方,且整个多子图网格的顶部距离画布上边界距离极近;而plt.suptitle的默认垂直位置为y=0.98(基于画布的归一化坐标),刚好和子图标题处于同一水平高度,因此出现标题重叠。

调整方案

1. 直接偏移主标题的垂直位置

调用plt.suptitle时可通过y参数自定义主标题的垂直位置:

  • 坐标规则:y=0代表画布底部,y=1代表画布上边界,数值大于1即代表向画布上方偏移
  • 常用写法:将y设置为1.02~1.08区间的数值,即可让主标题抬升到子图标题的上方,完全避开重叠

参考代码:plt.suptitle('Main title', y=1.03)
具体取值可根据画布大小、子图数量灵活调整

2. 预留顶部专属空间,避免标题被裁切

仅上移主标题可能会导致标题超出画布上边界被裁切,需要同步压缩多子图网格的顶部占比,空出专门放主标题的区域,有两种常用实现方式:

  • 直接通过FacetGrid对象调整边距(更适配Seaborn绘图逻辑):
    g.fig.subplots_adjust(top=0.92)
    作用是将整个多子图网格的顶部位置从画布上边界下移8%,空出的顶部空间刚好可以放下偏移后的主标题
  • 用tight_layout的rect参数控制:
    plt.tight_layout(rect=[0, 0, 1, 0.92])
    通过手动指定子图区域的边界,将子图整体压缩到画布高度的92%以内,留出顶部空间放置主标题

代码冗余优化

原示例代码中提前执行fig=plt.figure()创建空白画布的操作完全多余:displot本身会根据子图排布规则自动生成适配尺寸的Figure对象,提前创建的空白画布反而可能干扰布局计算,删掉这行代码后布局调整的效果会更稳定。

调整后完整可运行代码
import seaborn as sns
import matplotlib.pyplot as plt

iris = sns.load_dataset("iris")
g = sns.displot(
    data=iris, 
    x='petal_width', 
    col='species', 
    col_wrap=2, 
    bw_adjust=0.5,
    kind="kde", 
    rug=True
)

header_name = ['1a', '1b', '1c', '1d']
value_tick = [0.5, 1, 1.5, 3]
g.set_xticklabels(rotation=45)

# 上移主标题,避开子图标题
plt.suptitle('Main title', y=1.03)
# 调整子图网格边距,预留顶部空间
g.fig.subplots_adjust(top=0.92)

plt.xticks(ticks=value_tick, labels=header_name, ha="right")
plt.show()

内容的提问来源于stack exchange,提问作者rpb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 01:36:02