如何制作含多列O/X数据的100%堆叠百分比柱状图?
解决多列O/X占比柱状图的实现方案
核心前提:调整数据格式
不管用可视化工具还是代码,首先要把宽格式数据转成长格式——这是你能把所有列数据整合到一张图表的关键:
- 原始宽格式:每列是一个类别,每行是单条记录的O/X
- 目标长格式:包含三列:
列名称(原表头)、类别(O/X)、占比(该类别在对应列的百分比)
举个例子:
原始数据:
列A 列B 列C O X O X O O O X X
转换后长格式:
列名称 类别 占比 列A O 66.7% 列A X 33.3% 列B O 33.3% 列B X 66.7% 列C O 66.7% 列C X 33.3%
方案1:用Excel/Google Sheets(无需编码)
步骤1:整理数据(透视表+计算占比)
- 选中原始数据区域,插入「数据透视表」:
- 行:拖入所有列的表头(列A、列B...)
- 列:拖入「值」区域的O/X内容
- 值:设置为「计数」(统计每个列下O/X的数量)
- 计算占比:在透视表旁新增列,公式为
=对应计数单元格 / 该列总计数(比如列A的总计数是COUNT(A:A)-1,减1是排除表头),再把单元格格式设为百分比。
步骤2:生成柱状图
- 选中转换后的长格式数据(列名称、O的占比、X的占比),插入「簇状柱状图」
- 自动识别后:X轴就是列名称,Y轴是百分比占比,图例区分O/X。如果识别错误,右键图表→「选择数据」,手动设置:
- 水平轴标签:选择
列名称列的内容 - 添加两个系列:系列1名称设为「O」,值选O的占比列;系列2名称设为「X」,值选X的占比列
- 水平轴标签:选择
方案2:用Python编码(适合批量/自动化场景)
步骤1:数据预处理(转长格式+计算占比)
import pandas as pd # 读取原始数据(假设是csv格式,其他格式可替换为pd.read_excel等) df = pd.read_csv("your_data.csv") # 把宽表转成长表:var_name是列名称,value_name是O/X类别 melted_df = df.melt(var_name="列名称", value_name="类别") # 按列名称+类别分组计数,再计算占比 count_df = melted_df.groupby(["列名称", "类别"]).size().reset_index(name="计数") # 计算每列的总计数,用于求占比 total_counts = count_df.groupby("列名称")["计数"].transform("sum") count_df["占比"] = round(count_df["计数"] / total_counts * 100, 1) # 保留1位小数
步骤2:绘制柱状图
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) # 绘制簇状柱状图:x是列名称,y是占比,hue区分O/X sns.barplot(data=count_df, x="列名称", y="占比", hue="类别", palette={"O": "#2ecc71", "X": "#e74c3c"}) # 设置轴标签和标题 plt.xlabel("列名称", fontsize=12) plt.ylabel("占比(%)", fontsize=12) plt.title("各列O/X占比分布", fontsize=14) plt.legend(title="类别") plt.show()
对你疑问的直接解答
- 是否需要修改数据表?是,必须把宽格式转成长格式,这是整合所有列数据到一张图表的核心。
- 是否需要编码?可选:用Excel/Sheets这类工具无需编码;如果数据量大、需要重复生成图表,编码更高效。
- X/Y轴设置:转成长格式后,X轴绑定
列名称列,Y轴绑定占比列,用图例区分O/X即可。
内容的提问来源于stack exchange,提问作者클로버Clover
相关产品推荐
相关产品推荐

