You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作含多列O/X数据的100%堆叠百分比柱状图?

解决多列O/X占比柱状图的实现方案

核心前提:调整数据格式

不管用可视化工具还是代码,首先要把宽格式数据转成长格式——这是你能把所有列数据整合到一张图表的关键:

  • 原始宽格式:每列是一个类别,每行是单条记录的O/X
  • 目标长格式:包含三列:列名称(原表头)、类别(O/X)、占比(该类别在对应列的百分比)

举个例子:

原始数据:

列A列B列C
OXO
XOO
OXX

转换后长格式:

列名称类别占比
列AO66.7%
列AX33.3%
列BO33.3%
列BX66.7%
列CO66.7%
列CX33.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:47:47