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

