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

Matplotlib如何绘制分段常值函数的条形分箱样式图

Matplotlib实现分段常值积分近似的填充阶梯绘图方案

要实现黎曼和近似那种带填充的分段矩形效果,不需要硬凑条形图或普通阶梯线,按以下方案实现即可:

推荐方案:使用专用函数plt.stairs()(Matplotlib 3.4+版本支持)

这个函数是Matplotlib专门为阶梯值、分段常值场景设计的,原生支持填充、边界对齐,完全匹配积分近似的绘图需求,不会出现条形图错位、多生成独立条的问题。
核心逻辑是传入两个数组:

  • 第一个数组是每个分段对应的常值,也就是你已经算好的fitted_values
  • 第二个数组是所有分段的边界点,长度要比值数组多1(n个分段对应n+1个左右端点)
    参考代码:
import numpy as np
import matplotlib.pyplot as plt

# 示例:如果times是等距分段的中点采样点,先计算分段边界
h = times[1] - times[0]  # 单段宽度
bin_edges = np.concatenate([[times[0] - h/2], times + h/2])

# 绘制原连续函数曲线
plt.plot(times, f(times), '-', linewidth=2, label='原连续函数')
# 绘制带填充的分段常值近似块
plt.stairs(
    fitted_values, 
    bin_edges, 
    fill=True, 
    alpha=0.5,  # 填充透明度,方便看到下层原函数
    edgecolor='darkorange',
    label='分段常值积分近似'
)
plt.legend()
plt.show()

如果是左黎曼/右黎曼和,只需要调整bin_edges的计算逻辑,把采样点对齐到分段的左/右端点即可。

兼容旧版本方案:fill_between + step组合

如果你的Matplotlib版本低于3.4没有stairs函数,可以用fill_between的step参数实现填充效果,再搭配plt.step()补轮廓线即可:

plt.plot(times, f(times), '-', linewidth=2, label='原连续函数')
# step参数可选'pre'(左对齐,对应左黎曼和)、'post'(右对齐,右黎曼和)、'mid'(中点对齐,中点黎曼和)
plt.fill_between(times, fitted_values, step='mid', alpha=0.5, color='orange')
# 可选:添加阶梯轮廓线
plt.step(times, fitted_values, drawstyle='steps-mid', where='mid', color='darkorange', linewidth=1)
plt.legend()
plt.show()

之前方案失效的原因

  • 目标图外观类似直方图但生成逻辑不同:直方图是按数据分布计数分箱,积分近似是按固定分段取函数值,不要直接套用直方图的绘图逻辑
  • 常规bar条形图无法对齐数轴:默认bar宽度为0.8、居中对齐到传入的x坐标,没有匹配分段宽度和边界位置,自然无法和数轴对齐,还会为每个输入点生成独立条形;手动调整宽度、对齐参数也能实现效果,但配置成本远高于前两种方案,不推荐
  • plt.step()无填充效果:该方法仅支持绘制阶梯轮廓线,原生不带面填充能力,单独使用无法得到分块填充效果,必须搭配填充类函数使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:39:17