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

如何利用Seaborn的FacetGrid自动生成2×2网格的分类直方图?

如何利用Seaborn的FacetGrid自动生成2×2网格的分类直方图?

我明白你遇到的问题了——想用Seaborn的FacetGrid自动按单个分类变量生成2×2的直方图,但之前的代码跑出了四个一模一样的图,手动循环子图虽然能用但不够优雅。其实问题出在你调用map()方法时的参数传递上,咱们来一步步修正。

先说说你原来代码的问题

你在fig.map(sns.histplot, data = df, x='values', stat='density')这里犯了个小错误:把整个数据集df传给了data参数,但FacetGrid已经帮你按category分好每个子图对应的数据集了,这就导致每个子图都用了全量数据,所以才会输出一模一样的结果。

修正后的完整代码

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

# 构造示例数据
df = pd.DataFrame()
df['values'] = np.hstack([np.ones(25),
                          np.arange(200,225),
                          np.ones(25)*5,
                          np.linspace(500,550,25)])
df['category'] = np.repeat(['red','yellow','green','black'],25)

# 初始化FacetGrid:按category分栏,每行放2个图(自动排成2×2网格)
g = sns.FacetGrid(df, col='category', col_wrap=2)
# 映射histplot:只需要指定x列名,其他绘图参数直接加就行,不用传data
g.map(sns.histplot, 'values', stat='density', kde=True, bins=10)

# 优化图表可读性
g.set_titles(col_template='{col_name}')  # 给每个子图加上对应类别的标题
plt.tight_layout()
plt.show()

关键修改点说明

  • 去掉了map()里的data=df参数:FacetGrid会自动把每个category对应的子集数据传给sns.histplot
  • 可以直接在map()里添加kde=True、bins=10这类参数,和直接调用sns.histplot的用法完全一致
  • 用g.set_titles()给子图加上类别名称,让图表逻辑更清晰

如果想要进一步调整样式,还可以加这些操作:

  • g.set_axis_labels('数值', '密度'):给所有子图设置统一的x、y轴标签
  • g.fig.subplots_adjust(wspace=0.3, hspace=0.3):调整子图之间的间距,避免内容拥挤

备注:内容来源于stack exchange,提问作者Pythonista anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:59:52