如何一次性为DataFrame的分类列批量绘制条形图?
批量绘制分类特征条形图的解决方案
你遇到的问题根源有两个:
sns.displot默认只会处理DataFrame的单一列(这里educational-num因类型被优先识别),不会自动遍历所有分类列生成子图;displot返回的是FacetGrid对象,没有flatten方法,它的子图轴存储在axes属性中。
下面提供两种可行的批量绘制方法:
方法一:用Pandas原生绘图(和数值特征直方图逻辑一致)
利用Pandas的plot.bar结合子图布局,直接遍历每个分类列绘制条形图:
%matplotlib inline import matplotlib.pyplot as plt # 定义子图布局:2行5列(适配10个分类特征),调整画布大小 fig, axarr = plt.subplots(nrows=2, ncols=5, figsize=(20, 10)) xlbl = ['workclass', 'education', 'educational-num','marital-status', 'occupation', 'relationship', 'race', 'gender', 'native_country', 'income'] # 遍历每个分类列和对应的子图轴 for idx, (col, ax) in enumerate(zip(temp2.columns, axarr.flatten())): # 先统计每个类别的数量,再绘制条形图 temp2[col].value_counts().plot(kind='bar', ax=ax) # 设置坐标轴标签 ax.set_xlabel(xlbl[idx]) ax.set_ylabel("Count") # 旋转x轴标签,避免类别名称重叠 ax.tick_params(axis='x', rotation=45) # 自动调整子图间距,防止标签被截断 plt.tight_layout() plt.show()
方法二:用Seaborn Catplot分面绘制
通过melt将宽表转为长表,配合Seaborn的分面功能批量生成条形图:
%matplotlib inline import seaborn as sns import matplotlib.pyplot as plt # 将宽格式的分类特征表转为长格式,适配Seaborn分面逻辑 melted_temp2 = temp2.melt(var_name='feature', value_name='category') # 创建分面条形图,每行显示5个子图 g = sns.catplot( data=melted_temp2, x='category', kind='count', # 绘制计数条形图 col='feature', col_wrap=5, figsize=(20, 8), sharex=False, # 关闭x轴共享,避免不同类别的标签冲突 sharey=True ) # 为每个子图设置自定义标签 xlbl = ['workclass', 'education', 'educational-num','marital-status', 'occupation', 'relationship', 'race', 'gender', 'native_country', 'income'] for ax, label in zip(g.axes, xlbl): ax.set_xlabel(label) ax.set_ylabel("Count") ax.tick_params(axis='x', rotation=45) plt.tight_layout() plt.show()
额外说明
- 若部分分类特征的类别过多,可进一步调整
figsize或rotation角度优化显示效果; value_counts()会自动统计每个类别的出现次数,是绘制分类特征条形图的核心步骤。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

