You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个Seaborn FacetGrid绘图并排合并到同一画布?

合并Seaborn FacetGrid绘图并排展示

要实现两个FacetGrid网格绘图的并排展示,可借助Matplotlib的布局工具直接控制画布和子图位置,以下是两种可行方案:

方案一:创建共用画布并指定布局

在初始化FacetGrid时就绑定同一个画布,通过gridspec_kws控制各区域宽度比例,这种方法更简洁直接:

import seaborn as sns
from matplotlib import pyplot as plt

tips = sns.load_dataset("tips")

# 创建1行2列的画布,设定整体尺寸
fig = plt.figure(figsize=(14, 6))
# 划分布局,左侧给g1,右侧给g2
gs = fig.add_gridspec(2, 3, width_ratios=[1, 1, 1.2])

# 初始化第一个FacetGrid,绑定画布和左侧布局区域
g1 = sns.FacetGrid(tips, col="time", row="sex", fig=fig, gridspec_kws={"subplot_spec": gs[:, :2]})
g1.map(sns.scatterplot, "total_bill", "tip")

# 初始化第二个FacetGrid,绑定画布和右侧布局区域
g2 = sns.FacetGrid(tips, col="size", height=2.5, col_wrap=1, fig=fig, gridspec_kws={"subplot_spec": gs[:, 2]})
g2.map(sns.histplot, "total_bill")

# 自动调整子图间距,避免元素重叠
plt.tight_layout()
plt.show()

方案二:提取已生成FacetGrid的轴重排

如果已经单独生成了g1和g2,可提取它们的轴对象,重新添加到新画布的指定位置:

import seaborn as sns
from matplotlib import pyplot as plt

tips = sns.load_dataset("tips")

# 先生成两个FacetGrid(不显示)
g1 = sns.FacetGrid(tips, col="time", row="sex")
g1.map(sns.scatterplot, "total_bill", "tip")

g2 = sns.FacetGrid(tips, col="size", height=2.5, col_wrap=3)
g2.map(sns.histplot, "total_bill")

# 创建新画布和布局
fig = plt.figure(figsize=(15, 6))
gs = fig.add_gridspec(2, 5)

# 将g1的4个轴放入左侧2列区域
g1_axes = g1.axes.flatten()
for idx, ax_pos in enumerate([(0,0), (0,1), (1,0), (1,1)]):
    ax = fig.add_subplot(gs[ax_pos])
    # 复制原轴的绘图元素和标签
    for line in g1_axes[idx].get_lines():
        ax.add_line(line)
    ax.set_xlabel(g1_axes[idx].get_xlabel())
    ax.set_ylabel(g1_axes[idx].get_ylabel())
    ax.set_title(g1_axes[idx].get_title())
g1.fig.clf()  # 清空原g1的画布

# 将g2的6个轴放入右侧3列区域
g2_axes = g2.axes.flatten()
for idx, ax_pos in enumerate([(0,2), (0,3), (0,4), (1,2), (1,3), (1,4)]):
    ax = fig.add_subplot(gs[ax_pos])
    for patch in g2_axes[idx].patches:
        ax.add_patch(patch)
    ax.set_xlabel(g2_axes[idx].get_xlabel())
    ax.set_ylabel(g2_axes[idx].get_ylabel())
    ax.set_title(g2_axes[idx].get_title())
g2.fig.clf()  # 清空原g2的画布

plt.tight_layout()
plt.show()

提示:方案一更高效,推荐优先使用;方案二适合已存在独立FacetGrid对象的场景,可灵活调整布局比例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:03:16