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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:25