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
相关产品推荐
相关产品推荐

