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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:07:44