如何为Pandas多列分类数据绘制多标签分组计数柱状图
实现多列分类值计数分组柱状图的解决方案
问题原因
sns.countplot() 本身就支持对原始数据集的分类值自动做频次统计,不需要提前调用pd.Series.value_counts做聚合。你提前聚合后再传入接口,countplot会对聚合后的结果再做频次统计,自然无法输出3*5的分组柱状图效果。
完整实现代码
# 导入依赖 import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 构造测试数据集 test = pd.DataFrame(np.array([ ["Yes", "No", "No", "Yes", "Maybe"], ["Yes", "Yes", "Yes", "Maybe", "Maybe"], ["Maybe", "Yes", "Yes", "No", "No"], ["No", "Yes", "Maybe", "No", "No"], ["Maybe", "Maybe", "Maybe", "No", "Yes"], ]) ,columns=['a','b','c','d', 'e']) # 宽表转长表,适配seaborn绘图输入要求 df_melted = test.melt(var_name='字段名', value_name='取值') # 绘制分组柱状图 plt.figure(figsize=(10,6)) # x为字段名(a-e),hue为取值(Yes/No/Maybe),实现分组效果 ax = sns.countplot(data=df_melted, x='字段名', hue='取值', palette='Set2') # 可选:在柱子上添加计数标签 for container in ax.containers: ax.bar_label(container) # 调整样式 plt.title('各字段取值分布统计') plt.xlabel('字段') plt.ylabel('出现次数') plt.legend(title='取值类别', bbox_to_anchor=(1.01, 1), loc='upper left') plt.tight_layout() plt.show()
代码说明
- 核心是使用
pd.melt()将原始宽表转为长格式,把每个字段的所有取值都展开为独立行,这样countplot可以直接将字段名映射为x轴、取值映射为分组维度(hue),自动统计每个分组的出现次数。 - 运行后即可得到a-e每个字段下对应Yes、No、Maybe三个计数柱子的效果,共15根分组柱子,符合预期。
内容的提问来源于stack exchange,提问作者이가원
相关产品推荐
相关产品推荐

