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

如何将两个不同FacetGrid图表并排展示 能否用单个FacetGrid实现

解决方案

可以通过单个FacetGrid对象实现两种不同类型图表的并排展示,也可以搭配matplotlib子图实现更灵活的布局,以下是两种实现方案:


方案1:单个FacetGrid实现(匹配你的需求)

核心思路是将原数据集复制为两份,新增图表类型的分类字段,通过FacetGrid的col参数实现分栏展示,再自定义绘图逻辑区分不同栏的图表类型:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 加载数据集
dataframe = pd.read_csv('xyz.csv')

# 构造长格式数据集,新增plot_type字段区分两种图表
df_hist = dataframe.copy()
df_hist['plot_type'] = '年龄分布直方图'
df_kde = dataframe.copy()
df_kde['plot_type'] = '年龄分布密度图'
df_long = pd.concat([df_hist, df_kde], ignore_index=True)

# 单个FacetGrid实现双图并排
g = sns.FacetGrid(df_long, col='plot_type', hue='status', height=5, sharey=False)
# 自定义绘图函数,按plot_type绘制不同图表
def plot_by_type(data, **kwargs):
    ax = plt.gca()
    if data['plot_type'].iloc[0] == '年龄分布直方图':
        sns.histplot(data=data, x='age', **kwargs)
    else:
        # 用kdeplot替代已废弃的distplot,如需保留distplot可替换为对应代码
        sns.kdeplot(data=data, x='age', fill=True, **kwargs)
g.map_dataframe(plot_by_type).add_legend()
plt.show()

方案2:Matplotlib子图实现(更灵活,推荐日常使用)

如果不需要强制用FacetGrid,直接创建matplotlib子图布局分别绘图,代码更简洁易读:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 加载数据集
dataframe = pd.read_csv('xyz.csv')

# 创建1行2列的子图布局
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 左轴绘制直方图
sns.histplot(data=dataframe, x='age', hue='status', ax=ax1)
ax1.set_title('年龄分布直方图')

# 右轴绘制密度图
sns.kdeplot(data=dataframe, x='age', hue='status', fill=True, ax=ax2)
ax2.set_title('年龄分布密度图')

plt.tight_layout()
plt.show()

注意事项

sns.distplot在Seaborn v0.11及以上版本已正式弃用,推荐使用sns.histplot开启kde=True参数、或单独使用sns.kdeplot实现等价效果,避免版本兼容报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:57:05