如何将两个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
相关产品推荐
相关产品推荐

