堆叠条形图(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
相关产品推荐
相关产品推荐

