如何在Python中使用Matplotlib绘制步进函数?

时间:2012-01-19 05:07:56

标签: python plot matplotlib

这应该很简单,但我刚刚开始使用matplotlib和python。我可以做一个直线或散点图,但我不知道如何做一个简单的步骤函数。非常感谢任何帮助。

x = 1,2,3,4
y = 0.002871972681775004, 0.00514787917410944, 0.00863476098280219, 0.012003316194034325

6 个答案:

答案 0 :(得分:49)

好像你想要step

E.g。

import matplotlib.pyplot as plt

x = [1,2,3,4] 
y = [0.002871972681775004, 0.00514787917410944, 
     0.00863476098280219, 0.012003316194034325]

plt.step(x, y)
plt.show()

enter image description here

答案 1 :(得分:12)

如果您有非均匀间隔的数据点,则可以使用plot的{​​{3}}关键字参数:

x = [1,2.5,3.5,4] 
y = [0.002871972681775004, 0.00514787917410944, 
     0.00863476098280219, 0.012003316194034325]

plt.plot(x, y, drawstyle='steps-pre')

还提供steps-midsteps-post

答案 2 :(得分:1)

只画两条线,一条在y = 0,另一条在y = 1,切断你的步长函数的x

e.g。如果你想在x=2.3从0步到1并从x=0x=5进行绘图:

import matplotlib.pyplot as plt
#                                 _
# if you want the vertical line _|
plt.plot([0,2.3,2.3,5],[0,0,1,1])
#
# OR:
#                                       _
# if you don't want the vertical line _
#plt.plot([0,2.3],[0,0],[2.3,5],[1,1])

# now change the y axis so we can actually see the line
plt.ylim(-0.1,1.1)

plt.show()

答案 3 :(得分:1)

我认为你想要pylab.bar(x,y,width=1)或同样pyplot的bar方法。如果没有结帐gallery,你可以做多种风格的情节。每张图片都附带示例代码,向您展示如何使用matplotlib制作它。

答案 4 :(得分:1)

matplotlib 3.4.0 中的新功能

有一个新的 plt.stairs 方法来补充 plt.step

<块引用>

plt.stairs 和底层的 StepPatch 提供了一个更清晰的界面,用于为常见的您知道阶梯边缘的情况绘制逐步常数函数。

这取代了 plt.step 的许多用例,例如在绘制 np.histogram 的输出时。

查看 how to use plt.stairs and StepPatch 的官方 matplotlib 库。


何时使用 plt.stepplt.stairs

  • 如果您有参考点,请使用原始的 plt.step此处的步骤锚定在 [1,2,3,4] 处并扩展到左侧:

    plt.step(x=[1,2,3,4], y=[20,40,60,30])
    
  • 如果您有,请使用新的 plt.stairs。前面的[1,2,3,4]步点对应[1,1,2,3,4]楼梯边缘:

    plt.stairs(values=[20,40,60,30], edges=[1,1,2,3,4])
    

plt.step vs plt.stairs


plt.stairsnp.histogram 一起使用

由于 np.histogram 返回边,它直接与 plt.stairs 一起使用:

data = np.random.normal(5, 3, 3000)
bins = np.linspace(0, 10, 20)
hist, edges = np.histogram(data, bins)

plt.stairs(hist, edges)

plt.stairs with np.histogram

答案 5 :(得分:0)

如果有人只是想逐步确定某些数据而不是实际绘制它:

def get_x_y_steps(x, y, where="post"):
    if where == "post":
        x_step = [x[0]] + [_x for tup in zip(x, x)[1:] for _x in tup]
        y_step = [_y for tup in zip(y, y)[:-1] for _y in tup] + [y[-1]]
    elif where == "pre":
        x_step = [_x for tup in zip(x, x)[:-1] for _x in tup] + [x[-1]]
        y_step = [y[0]] + [_y for tup in zip(y, y)[1:] for _y in tup]
    return x_step, y_step