Pandas生成的Matplotlib堆叠直方图出现异常截断线条问题
解决Matplotlib堆叠Step直方图顺序调换后的异常问题
这个坑我之前也踩过!你遇到的问题本质上是Matplotlib绘制histtype='step'类型的堆叠直方图时的一个小bug——当调换两组数据的传入顺序后,直方图的路径闭合逻辑出现了异常,导致填充区域被隐形线条截断。
问题根源
当使用stacked=True+histtype='step'时,Matplotlib会按照你传入列表的顺序依次堆叠数据。第一组数据的路径生成是正常的,但第二组堆叠时,step类型的路径衔接逻辑没有正确处理“从已有堆叠顶部向下扩展”的情况,哪怕你数据里没有NaN,只要两组自动计算的分箱边界存在极细微偏差,就会触发这个异常。
亲测有效的解决方案
1. 强制使用统一的分箱边界(最简单)
手动指定bins参数,让两组数据使用完全相同的分箱,避免Matplotlib自动计算分箱时的细微偏差:
import matplotlib.pyplot as plt import pandas as pd # 先基于整个col1数据计算统一的分箱边界 all_bins = plt.hist(df['col1'])[1] # 用统一分箱绘制堆叠直方图,不管顺序如何都不会出问题 fig, axes = plt.subplots(nrows=1, ncols=1) n, bins, patches = axes.hist( [df_1['col1'], df_0['col1']], histtype='step', stacked=True, fill=True, bins=all_bins # 关键:强制统一分箱 ) plt.show()
2. 手动绘制Step堆叠直方图(完全可控)
如果统一分箱还是不行,或者你需要更精细的控制,可以手动计算直方图统计数据,然后用step和fill_between绘制:
import numpy as np import matplotlib.pyplot as plt # 计算第一组数据的分箱和计数 n0, bins = np.histogram(df_0['col1']) # 用相同分箱计算第二组数据的计数 n1, _ = np.histogram(df_1['col1'], bins=bins) # 计算堆叠后的总计数 stacked_total = n0 + n1 # 手动绘制step线条和填充区域 fig, axes = plt.subplots(nrows=1, ncols=1) # 绘制底部组(col2=0) axes.step(bins, np.append(n0, 0), where='post', label='col2=0') axes.fill_between(bins, 0, np.append(n0, 0), step='post', alpha=0.5) # 绘制堆叠顶部组(col2=1) axes.step(bins, np.append(stacked_total, 0), where='post', label='col2=1') axes.fill_between(bins, np.append(n0, 0), np.append(stacked_total, 0), step='post', alpha=0.5) axes.legend() plt.show()
这种方式完全由你控制路径生成,不会出现Matplotlib自动绘制时的异常。
3. 临时切换为Bar类型验证
如果你只是想确认问题出在step类型上,可以先把histtype改成bar,此时不管调换什么顺序,堆叠都能正常显示——这也能佐证是step类型的堆叠逻辑bug。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

