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

