matplotlib调用plt.boxplot绘制分类箱线图时第二个箱线图缺失
解决方法
两个箱线的元素都在返回对象里,说明图根本没丢,只是视觉上看不到,问题出在数据和默认渲染逻辑上:
- 你读入的原始数据里
animal_weight列有NaN空值,会干扰matplotlib自动计算轴范围的逻辑 - 两组体重数据里存在极端离群值,把y轴范围拉得特别大,其中一组的箱线因为四分位距相对整个轴范围太小,被压成了贴在轴上的细线,肉眼无法分辨
- 未显式指定箱线位置时,极端数据场景下偶尔会出现位置计算偏移,导致两个箱线重叠
直接按下面修改即可:
- 先清理空值,不要把无效值传入绘图函数
# 过滤掉体重为空的无效记录 bison_clean = bison.dropna(subset=['animal_weight']) bisonM = bison_clean.loc[bison_clean['animal_sex'] == "M", "animal_weight"].tolist() bisonF = bison_clean.loc[bison_clean['animal_sex'] == "F", "animal_weight"].tolist() bison_sex = [bisonM, bisonF]
- 绘图时固定箱线位置,手动标注刻度,轴范围显示异常时可手动指定
plt.figure(figsize=(7,5)) # positions显式写死两个箱线的x坐标,避免位置偏移 bp = plt.boxplot( bison_sex, positions=[1,2], patch_artist=True, # 开启后支持给箱线设置填充色 showfliers=True # 如果离群点把轴拉得太夸张,可临时设为False确认箱线正常后再开启 ) plt.xticks([1,2], ["雄性野牛", "雌性野牛"]) plt.ylabel("动物体重") # 若仍存在显示压缩问题,可把下面注释打开,根据数据实际范围调整y轴上下限 # plt.ylim(100, 1200) # 可选:给两个箱线设置不同填充色,区分度更高 for patch, color in zip(bp['boxes'], ['#3377bb', '#dd7744']): patch.set_facecolor(color) plt.show()
执行后就能看到两个独立的箱线,后续可根据需求调整离群点显示、配色、坐标轴范围等参数。
内容的提问来源于stack exchange,提问作者geomicrobio
相关产品推荐
相关产品推荐

