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

在R中从CSV文件创建多X轴分类的堆叠条形图

实现堆叠百分比条形图(按分类标签展示X轴)

数据处理核心逻辑

你的问题根源是原始数据为宽格式(每个分类单独成列),直接求和会把所有分类合并成单个X轴项。必须先将数据转成长格式,再按分类计算每个党派的占比,才能生成符合需求的图表。

完整代码实现

import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV文件,处理引号和列间空格
df = pd.read_csv("your_file.csv", quotechar='"', skipinitialspace=True)

# 将宽格式数据转为长格式:把category1、category2转为行级分类
df_long = df.melt(
    id_vars="partyname",  # 保留作为分组依据的列
    var_name="category",  # 新生成的分类列名
    value_name="value"    # 数值列名
)
# 确保数值列是浮点型,避免字符串干扰计算
df_long["value"] = pd.to_numeric(df_long["value"])

# 计算每个分类的总和,用于后续占比计算
category_totals = df_long.groupby("category")["value"].transform("sum")
# 计算每个党派在对应分类下的百分比
df_long["percentage"] = (df_long["value"] / category_totals) * 100

# 转换为绘图所需的宽格式:行是分类,列是党派,值是百分比
pivot_df = df_long.pivot(index="category", columns="partyname", values="percentage").fillna(0)

# 绘制堆叠条形图
ax = pivot_df.plot(kind="bar", stacked=True, figsize=(10, 6))

# 设置图表标签与样式
ax.set_ylabel("百分比 (%)")
ax.set_xlabel("分类")
ax.set_title("各分类下党派占比堆叠条形图")

# 调整图例位置,避免遮挡图表
plt.legend(title="党派名称", bbox_to_anchor=(1.05, 1), loc="upper left")

# 可选:给每个堆叠块添加百分比数值标签
for container in ax.containers:
    ax.bar_label(container, fmt="%.1f%%", label_type="center")

plt.tight_layout()
plt.show()

关键步骤说明

  • 格式转换:用melt将宽格式转长格式,让每个党派在每个分类下的数值单独成一行,这是按分类计算占比的基础。
  • 占比计算:transform("sum")会给每一行匹配其所属分类的总和,这样能直接计算每个党派在该分类下的占比,而非全局总和的占比。
  • 绘图结构:pivot把数据转回宽格式,让matplotlib自动生成以分类为X轴、党派为堆叠块的条形图,完全满足X轴展示category1、category2等标签的需求。

内容的提问来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:45:19