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

如何在Python中绘制分段常数阶梯函数?

优化分段常数阶梯函数绘制代码

你的代码问题在于plt.plot(x,y)会直接将所有点用直线连接,而ax.hlines是从x=0到每个x[i]绘制水平线,这都不是分段常数的阶梯效果。要实现阶梯状,每个y值应该对应一段x区间(比如[x[i], x[i+1]]内保持y[i]不变),推荐用以下两种方法:

方法1:使用matplotlib内置的step函数(推荐)

step函数专门用于绘制阶梯图,通过where参数可以控制阶梯的对齐方式:

  • where='pre':y值从当前x点开始生效(左连续,阶梯从x[i]延伸到x[i+1])
  • where='post':y值从当前x点之后生效(右连续,阶梯从x[i-1]延伸到x[i])

代码示例:

import numpy as np
import matplotlib.pyplot as plt

y = np.array([0, 0.04, 0.12, 0.16, 0.28, 0.32, 0.36, 0.44, 0.48, 0.52, 0.56, 0.72, 0.76, 0.8, 0.88, 0.92, 1])
x = np.array([0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 19, 21, 23, 24 ])

fig, ax = plt.subplots(figsize=(6, 4))
# 绘制阶梯图,设置线条样式和宽度
ax.step(x, y, where='pre', color='r', linestyle='-', linewidth=2)
# 保持x轴从0开始无额外边距
ax.margins(x=0)
# 设置y轴刻度
ax.set_yticks(y, [f'{yi:.2f}' for yi in y])
plt.show()

方法2:手动构造阶梯数组

通过重复x和y的元素,构造出阶梯所需的连续线段坐标,再用plot绘制:

import numpy as np
import matplotlib.pyplot as plt

y = np.array([0, 0.04, 0.12, 0.16, 0.28, 0.32, 0.36, 0.44, 0.48, 0.52, 0.56, 0.72, 0.76, 0.8, 0.88, 0.92, 1])
x = np.array([0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 19, 21, 23, 24 ])

# 构造阶梯用的x坐标:重复每个x点(除首尾),形成[x0, x0, x1, x1, ..., xn-1, xn-1, xn],再去掉首尾多余的点
x_step = np.repeat(x, 2)[1:-1]
# 构造阶梯用的y坐标:重复每个y点,形成[y0, y0, y1, y1, ..., yn-1, yn-1]
y_step = np.repeat(y, 2)[:-2]

fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(x_step, y_step, color='r', linewidth=2)
ax.margins(x=0)
ax.set_yticks(y, [f'{yi:.2f}' for yi in y])
plt.show()

两种方法都能得到符合需求的阶梯状分段常数函数图,其中step函数更简洁且参数可控,是首选方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:04:57