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

