堆叠分组柱状图尺寸异常、标签模糊及空白图问题求助
问题描述
- 绘制包含所有周数据的堆叠分组柱状图时,所有数据挤在绘图区域,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
相关产品推荐
相关产品推荐

