如何利用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
相关产品推荐
相关产品推荐

