在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
相关产品推荐
相关产品推荐

