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

Python Dataframe按行绘制堆叠条形图:无行名时如何正确堆叠名次得分

堆叠条形图实现方案

数据预处理

你的现有数据为行对应前三名得分、列对应年份的宽表,没有行名的情况下先给行设置对应名次的索引即可:

import pandas as pd

# 假设你的原始DataFrame变量名为df
# 给行设置索引,对应三个名次
df.index = ['第一名', '第二名', '第三名']
# 转置后让年份成为行索引,三个名次作为可堆叠的维度列
df_for_plot = df.T
# 可选:如果年份是数值格式,转成字符串避免x轴显示异常
df_for_plot.index = df_for_plot.index.astype(str)

绘制堆叠条形图

直接调用pandas内置的绘图接口即可快速实现:

import matplotlib.pyplot as plt

# 生成堆叠条形图
df_for_plot.plot(
    kind='bar',
    stacked=True,
    figsize=(12, 7),
    color=['#2E86AB', '#A2355A', '#F6F4D2'] # 可自定义三个名次的配色
)
# 调整图表样式
plt.xlabel('年份', fontsize=12)
plt.ylabel('得分', fontsize=12)
plt.title('各年份前三名得分堆叠统计', fontsize=14)
plt.legend(title='名次', bbox_to_anchor=(1.01, 1), loc='upper left')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

如果你更习惯用seaborn库绘图,也可以用长表转换的方式实现,不需要修改原数据的索引:

import seaborn as sns

# 新增名次标识列,不修改原索引
df = df.assign(名次=['第一名', '第二名', '第三名'])
# 转换为绘图所需的长表格式
df_long = df.melt(
    id_vars='名次',
    var_name='年份',
    value_name='得分'
)
# 绘制堆叠条形图
sns.barplot(
    data=df_long,
    x='年份',
    y='得分',
    hue='名次',
    estimator=sum,
    errorbar=None
)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:18:02