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

堆叠分组柱状图尺寸异常、标签模糊及空白图问题求助

问题描述
  • 绘制包含所有周数据的堆叠分组柱状图时,所有数据挤在绘图区域,X轴标签难以辨认
  • 设置图表尺寸后出现空白图
  • 询问是否有更优的堆叠分组柱状图实现方案
原始代码
import pandas as pd
import matplotlib.pyplot as plt

# 提供的数据
data = {
    'TYPE': ['a', 'b', 'b', 'a', 'a', 'b', 'a'],
    'PRODUCT': ['Helium', 'Silver', 'Copper', 'Hidrogen', 'Helium', 'Silver', 'Silver'],
    'Amount': [62, 15, 70, 4, 3, 4, 25],
    'WEEK': [1, 1, 1, 1, 2, 2, 1]
}

# 创建DataFrame
df_ini = pd.DataFrame(data)

# 按周和TYPE分组,统计各产品总量
df_pivot = df_ini.pivot_table(
    index=['WEEK','TYPE'],
    columns='PRODUCT',
    values='Amount',
    aggfunc='sum',
    fill_value=0
)

# 绘制柱状图
plt.figure(figsize=(10, 6))
ax = df_pivot.plot(kind='bar', stacked=True)

# 自定义X轴标签
new_labels = [f'{week} / {type}' for week, type in df_pivot.index]
ax.set_xticklabels(new_labels,rotation=45,ha='right')

# 添加标签和标题
plt.title('Claims by week')
plt.xlabel('Week')
plt.ylabel('Claims')
plt.legend(title='Product')
plt.tight_layout()
plt.show()
问题解决与优化方案

1. 修复空白图问题

空白图是因为plt.figure()先创建了空白画布,而df_pivot.plot()默认会新建独立画布,导致第一个画布无内容。解决方法二选一:

  • 将figsize参数直接传入plot()方法
  • 先创建画布和轴对象,再指定plot()的ax参数

2. 解决标签拥挤问题

当周数与TYPE组合较多时,可通过以下方式优化:

  • 增加画布宽度,给X轴标签预留足够空间
  • 调整标签旋转角度(如60度或垂直)
  • 缩小标签字体大小
  • 用tight_layout()确保标签不被裁剪

3. 优化后的代码

import pandas as pd
import matplotlib.pyplot as plt

data = {
    'TYPE': ['a', 'b', 'b', 'a', 'a', 'b', 'a'],
    'PRODUCT': ['Helium', 'Silver', 'Copper', 'Hidrogen', 'Helium', 'Silver', 'Silver'],
    'Amount': [62, 15, 70, 4, 3, 4, 25],
    'WEEK': [1, 1, 1, 1, 2, 2, 1]
}

df_ini = pd.DataFrame(data)

df_pivot = df_ini.pivot_table(
    index=['WEEK','TYPE'],
    columns='PRODUCT',
    values='Amount',
    aggfunc='sum',
    fill_value=0
)

# 直接在plot中指定尺寸,避免生成空白画布
ax = df_pivot.plot(kind='bar', stacked=True, figsize=(12, 6))

# 自定义标签,调整字体大小与旋转角度
new_labels = [f'{week} / {type}' for week, type in df_pivot.index]
ax.set_xticklabels(new_labels, rotation=60, ha='right', fontsize=9)

ax.set_title('按周统计的索赔量')
ax.set_xlabel('周 / 类型')
ax.set_ylabel('索赔量')
# 将图例移至图外,节省绘图空间
ax.legend(title='产品', bbox_to_anchor=(1.05, 1), loc='upper left')

plt.tight_layout()
plt.show()

4. 更优实现思路

如果数据量较大(周数多),可尝试以下方案:

  • 分面展示:用seaborn.FacetGrid按周拆分图表,每周单独展示TYPE的堆叠柱状图,避免X轴过度拥挤
  • 交互式图表:使用plotly绘制交互式堆叠柱状图,支持缩放、hover查看详情,更适配大数据量可视化
  • 合并分组:若TYPE与周的组合过多,可按周聚合,将TYPE作为堆叠维度,X轴仅保留周数,减少标签数量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:15:10