如何用Pandas/Matplotlib/Seaborn创建无重复步骤的分类堆叠柱状图?
解决方案:实现分类堆叠且x轴Step不重复的柱状图
核心思路
放弃原代码的分面式柱状图(catplot分面会重复x轴标签),改用堆叠柱状图实现需求:同一Step下不同分类的柱子堆叠,x轴仅显示一次Step标签,同时在Step下方标注对应分类。
完整代码示例
假设你的数据集df_test包含三列:Step(步骤名)、Time(耗时)、Category(分类),代码如下:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 1. 数据预处理:转成宽格式方便堆叠 pivot_df = df_test.pivot(index='Step', columns='Category', values='Time').fillna(0) steps = pivot_df.index.tolist() categories = pivot_df.columns.tolist() # 2. 设置绘图风格 sns.set_style("whitegrid") fig, ax = plt.subplots(figsize=(10, 6)) # 3. 绘制堆叠柱状图 bottom = pd.Series([0]*len(steps), index=steps) for cat in categories: ax.bar(steps, pivot_df[cat], bottom=bottom, label=cat) bottom += pivot_df[cat] # 4. 设置x轴一级标签(Step) ax.set_xticks(range(len(steps))) ax.set_xticklabels(steps, rotation=90) # 5. 添加x轴二级标签(分类) # 获取每个Step对应的分类(假设每个Step仅归属一个分类,若多分类可调整逻辑) step_category_map = df_test.drop_duplicates('Step').set_index('Step')['Category'].tolist() plt.subplots_adjust(bottom=0.2) # 预留空间放二级标签 for idx, cat in enumerate(step_category_map): ax.text(idx, -0.1, cat, ha='center', va='top', transform=ax.get_xaxis_transform(), fontsize=10) # 6. 美化图表 ax.set_ylabel('Time') ax.set_xlabel('Step') ax.legend(title='Category') sns.despine() # 去掉多余边框 plt.tight_layout() plt.show()
代码说明
- 数据透视:将长格式数据转为宽格式,便于按分类堆叠绘制
- 堆叠逻辑:通过
bottom参数控制每个分类柱子的起始高度,实现堆叠效果 - 二级标签:在x轴Step标签下方添加分类标注,通过
text函数精准定位 - 样式优化:使用seaborn风格,调整布局避免标签重叠,移除冗余边框
内容的提问来源于stack exchange,提问作者Colton Campbell
相关产品推荐
相关产品推荐

