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

堆叠条形图(Stacked Bar Plot)缺失条形问题:基于指定数据集绘图求助

嘿,我之前做堆叠条形图时也踩过“丢条形”的坑,结合你给出的数据集,大概率是这几个原因导致的,咱们一步步来排查解决:

1. 先排查数据格式与完整性问题

堆叠条形图对分类变量和数值的完整性要求很高:

  • 先确认currency和sec_type这两个分类列是字符串/类别类型,如果是数值型的话,绘图库可能会识别出错。用pandas的话可以转一下:
    df['currency'] = df['currency'].astype('category')
    df['sec_type'] = df['sec_type'].astype('category')
    
  • 检查有没有缺失值(NaN):如果某个分组下的GrossNewWeek或GrossOldWeek是空值,绘图库会直接跳过这个条形。可以用df.isnull().sum()查看,有缺失的话用df.fillna(0)填充0(如果业务上允许的话),或者补全缺失的数据。
  • 确认每个currency+sec_type的组合都有对应的数值:比如你给出的GBP GOVT数据后面是省略号,会不会是后面的数值没完整加载?用df.groupby(['currency', 'sec_type']).size()可以查看每个分组的记录数,确保没有遗漏。

2. 检查数据量级差异,避免小条形被“盖住”

看你的数据,GBP GOVT的数值是6.925399e+10,而CZK GOVT只有4.902150e+07,两者差了3个数量级!如果直接堆叠,小量级的条形会被大的完全盖住,看起来就像“缺失”了。
解决办法:

  • 可以把y轴改成对数刻度:plt.yscale('log')
  • 或者拆分不同量级的分组分别绘图,避免差距过大导致视觉上的缺失。

3. 确保绘图逻辑正确(附代码示例)

很多时候是因为数据的结构不对,导致堆叠逻辑出错。比如你需要按currency做x轴,每个x下按sec_type堆叠GrossNewWeek和GrossOldWeek,那得先把数据转成适合堆叠的格式,比如用透视表:

import pandas as pd
import matplotlib.pyplot as plt

# 假设你的数据已经加载到df中
# 先构建透视表:行是currency,列是sec_type,值是对应的GrossNewWeek/GrossOldWeek
pivot_new = df.pivot(index='currency', columns='sec_type', values='GrossNewWeek').fillna(0)
pivot_old = df.pivot(index='currency', columns='sec_type', values='GrossOldWeek').fillna(0)

# 绘制堆叠条形图
fig, ax = plt.subplots(figsize=(12, 6))

# 先画GrossOldWeek作为底层
pivot_old.plot(kind='bar', stacked=True, ax=ax, color=['#888888', '#aaaaaa', '#cccccc'], label='GrossOldWeek')
# 再画GrossNewWeek堆叠在上面,bottom参数设置为底层的总和
pivot_new.plot(kind='bar', stacked=True, ax=ax, bottom=pivot_old.sum(axis=1), color=['#ff4444', '#ff8888', '#ffaaaa'], label='GrossNewWeek')

# 调整图例和标签
ax.legend(title='Security Type & Week', bbox_to_anchor=(1.05, 1), loc='upper left')
ax.set_xlabel('Currency')
ax.set_ylabel('Notional Amount')
ax.set_title('Stacked Bar Plot of Gross New/Old Week by Currency & Security Type')
plt.tight_layout()
plt.show()

如果用seaborn的话,需要把数据转成长格式(melt),然后指定hue和stacked=True:

import seaborn as sns

# 转成长格式
melted_df = df.melt(id_vars=['currency', 'sec_type'], value_vars=['GrossNewWeek', 'GrossOldWeek'], 
                    var_name='WeekType', value_name='Amount')

# 绘制堆叠条形图
sns.barplot(data=melted_df, x='currency', y='Amount', hue='sec_type', stacked=True)
plt.show()

4. 检查绘图库的参数是否正确

不管用matplotlib还是seaborn,一定要确保开启了stacked=True参数——这个很容易忘!如果没开,条形会并排显示而不是堆叠,看起来也会像“缺失”了部分内容。

你可以先从数据完整性和格式入手排查,再调整绘图代码,应该就能解决条形缺失的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:25:15