Python绘制分类变量柱状图与分类占比计算技术咨询
Python分类变量可视化与占比计算实现方案
1. 单分类变量频数柱状图
针对单个分类变量,用以下两种方式快速绘制频数柱状图:
依赖库导入
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
创建示例数据
data = {'COLOR': ['green', 'red', 'green', 'yellow', 'pink', 'red', 'blue']} df = pd.DataFrame(data)
绘制方法
方法1:Pandas原生绘图
先计算频数再绘制,直观可控:
freq_series = df['COLOR'].value_counts() freq_series.plot(kind='bar', title='COLOR观测频数柱状图') plt.xlabel('颜色') plt.ylabel('观测频数') plt.show()
方法2:Seaborn一键绘图
无需手动计算频数,直接调用countplot:
sns.countplot(x='COLOR', data=df) plt.title('COLOR观测频数柱状图') plt.xlabel('颜色') plt.ylabel('观测频数') plt.show()
2. 双分类变量交叉分组频数柱状图
针对两个分类变量的交叉分组频数,推荐两种实现方式:
创建示例数据
data = { 'Group': ['Group A', 'Group B', 'Group B', 'Group A', 'Group A', 'Group B', 'Group B', 'Group A'], 'Series': ['Series 2', 'Series 1', 'Series 5', 'Series 4', 'Series 1', 'Series 3', 'Series 3', 'Series 2'] } df = pd.DataFrame(data)
绘制方法
方法1:Seaborn分组对比图
用hue参数区分第二个分类变量,便于直观对比:
sns.countplot(x='Group', hue='Series', data=df) plt.title('Group与Series交叉分组观测数量') plt.xlabel('分组') plt.ylabel('观测数量') plt.legend(title='系列') plt.show()
方法2:Pandas交叉表绘图
先生成交叉计数表,再绘制柱状图,支持堆叠/非堆叠模式:
cross_tab = pd.crosstab(df['Group'], df['Series']) cross_tab.plot(kind='bar', stacked=False) # 改为stacked=True可绘制堆叠柱状图 plt.title('Group与Series交叉分组观测数量') plt.xlabel('分组') plt.ylabel('观测数量') plt.legend(title='系列') plt.show()
3. 分组内分类变量占比计算与格式化输出
通过分组统计+格式化处理,输出指定格式的占比结果:
实现代码
# 按Group分组,计算每个组内各Series的占比(转换为百分比) grouped_ratios = df.groupby('Group')['Series'].value_counts(normalize=True) * 100 # 遍历每个分组,格式化输出 for group_name, ratio_data in grouped_ratios.groupby(level=0): ratio_items = [f"{round(ratio)}% {series}" for series, ratio in ratio_data.items()] print(f"{group_name} : {', '.join(ratio_items)}")
输出示例(对应给定数据)
Group A : 33% Series 2, 25% Series 1, 25% Series 4 Group B : 33% Series 3, 25% Series 1, 25% Series 5
内容的提问来源于stack exchange,提问作者Floralys
相关产品推荐
相关产品推荐

