如何制作仅包含垂直和水平线的Python图表?

时间:2018-01-28 05:40:24

标签: python matplotlib

如何画这样的东西? 在下一个数据点出现之前,有点像水平线,然后是用于调整位置y的垂直线。 matplotlib中通常的绘图函数只绘制两个数据点之间的直线,这不能满足我的需要。

The example screenshot

2 个答案:

答案 0 :(得分:3)

您可以使用其中一种抽奖方式"steps-pre""steps-mid""steps-post"来获得曲线的阶梯式外观。

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

完整示例:

import matplotlib.pyplot as plt
import numpy as np; np.random.seed()

x = np.arange(12)
y = np.random.rand(12)

styles = ["default","steps-pre","steps-mid", "steps-post"]

fig, axes = plt.subplots(nrows=len(styles), figsize=(4,7))

for ax, style in zip(axes, styles):
    ax.plot(x,y, drawstyle=style)
    ax.set_title("drawstyle={}".format(style))

fig.tight_layout()
plt.show()

enter image description here

答案 1 :(得分:0)

就像@ cricket_007在评论中所说的那样 - 让每个y值在下一个x值处重复。以下是如何使用numpy实现此目的的方法。

修改

感谢@ImportanceOfBeingErnest的评论,我用一个更简单的解决方案替换了扩展数据的原始代码。

from matplotlib import pyplot as plt
import numpy as np

#producing some sample data
x = np.linspace(0,1,20)
y = np.random.rand(x.shape[0])

#extending data to repeat each y value at the next x value  
##x1 = np.zeros(2*x.shape[0]-1)
##x1[::2] = x
##x1[1::2] = x[1:]
x1 = np.repeat(x,2)[1:]

##y1 = np.zeros(2*y.shape[0]-1)
##y1[::2] = y
##y1[1::2] = y[:-1]
y1 = np.repeat(y,2)[:-1]

plt.plot(x1, y1)    
plt.show()

结果如下:

result of the code above