用离散变量绘制CDF - 用交替线绘制步骤图

时间:2018-04-04 22:14:39

标签: python python-3.x matplotlib

我想绘制一个如下图:

enter image description here

数据以.csv文件的形式提供,我已将其导入数据并在图表中用作x。

Y计算如下:

y = np.arange(1, len(data)+1)/len(data)

然后使用:

绘制
plt.step((data), y)
plt.show(block="false")

我现在的问题是,图表看起来像this one这样的正常步骤图(不是我的实际数据)。

如何将其格式化为上面提到的格式,即从 y = 0 行的左侧开始,并在 y = 1 的右侧延伸线条,虚线与实线和图表上的点?

我已经google了一下,找到了我已经拥有的图表的许多解决方案,但我想按照提到的格式化。

我是一般主题的新手,所以如果设置错误,那么任何帮助都会受到赞赏!

谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定step()是否能做到这一点;它只是few lines of code缠绕plt.plot()

或者,您可以使用vlines()hlines()。切片的逻辑取决于您希望如何配置步骤," (就像你如何指定step()的{​​{3}}参数一样,但这里是你问题中例子的近似再现:

import numpy as np
import matplotlib.pyplot as plt

data = np.arange(0, 7)
y = np.array([.07, .21, .42, .68, 1.])
yn = np.insert(y, 0, 0)

fig, ax = plt.subplots()
ax.set_facecolor('white')

# https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.hlines.html
ax.hlines(y=yn, xmin=data[:-1], xmax=data[1:],
          color='red', zorder=1)

# https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.vlines.html
ax.vlines(x=data[1:-1], ymin=yn[:-1], ymax=yn[1:], color='red',
          linestyle='dashed', zorder=1)

ax.scatter(data[1:-1], y, color='red', s=18, zorder=2)
ax.scatter(data[1:-1], yn[:-1], color='white', s=18, zorder=2,
           edgecolor='red')
ax.grid(False)
ax.set_xlim(data[0], data[-1])
ax.set_ylim([-0.01, 1.01])

where

zorder确保散点点覆盖在行顶部。

按照目前的情况,y的创建并不真正跟随您所展示的图像,但此示例会尝试模仿图像本身。