Matplotlib仅在步骤打印中打印水平线

Matplotlib仅在步骤打印中打印水平线,matplotlib,Matplotlib,我正在使用matplotlib从数据帧绘制一些step函数 df['s1'].plot(c='b', drawstyle="steps-post") df['s2'].plot(c='b', drawstyle="steps-post") ... 结果看起来像 我想让它只画水平线,而不是连接跳跃点的垂直线。我找不到一个简单的绘图参数,似乎可以做到这一点。有没有办法做到这一点?据我所知,没有内置选项可以生成没有垂直线的步长函数。但是你可以很容易地自己建造一个。下面使用的事实是,np.nan未绘

我正在使用matplotlib从数据帧绘制一些step函数

df['s1'].plot(c='b', drawstyle="steps-post")
df['s2'].plot(c='b', drawstyle="steps-post")
...
结果看起来像


我想让它只画水平线,而不是连接跳跃点的垂直线。我找不到一个简单的绘图参数,似乎可以做到这一点。有没有办法做到这一点?

据我所知,没有内置选项可以生成没有垂直线的步长函数。但是你可以很容易地自己建造一个。下面使用的事实是,
np.nan
未绘制并切掉了线。因此,在步骤之间添加
np.nan
会抑制垂直线

import matplotlib.pyplot as plt
import numpy as np

def mystep(x,y, ax=None, where='post', **kwargs):
    assert where in ['post', 'pre']
    x = np.array(x)
    y = np.array(y)
    if where=='post': y_slice = y[:-1]
    if where=='pre': y_slice = y[1:]
    X = np.c_[x[:-1],x[1:],x[1:]]
    Y = np.c_[y_slice, y_slice, np.zeros_like(x[:-1])*np.nan]
    if not ax: ax=plt.gca()
    return ax.plot(X.flatten(), Y.flatten(), **kwargs)
    
x = [1,3,4,5,8,10,11]
y = [5,4,2,7,6,4,4]

mystep(x,y, color="crimson")

plt.show()

此答案对应于绘制阶梯图的
plt.plot()
中的
drawstyle='steps-post'
关键字参数,即任何给定x值处的平面线的y值等于传递的x数组中下一个最小x值处的y值。例如,使用@ImportanceOfBeingErnest答案中的数组,x=1.5处的y值等于x=1处的y值(即y=5)。