有没有一种方法可以做到这一点?我似乎找不到一种简单的方法将pandas序列与绘制CDF相接口。
import matplotlib.pyplot as plt
import numpy as np
def ecdf(a):
x, counts = np.unique(a, return_counts=True)
y = np.cumsum(counts)
x = np.insert(x, 0, x[0])
y = np.insert(y/y[-1], 0, 0.)
plt.plot(x, y, drawstyle='steps-post')
plt.grid(True)
plt.savefig('ecdf.png')
unique()
的调用会按照已排序的顺序返回数据值及其相应频率。在 plot()
调用中使用选项 drawstyle='steps-post'
,确保跳跃发生在正确位置。为了在最小数据值处强制进行跳跃,代码在 x
和 y
前面插入了一个额外的元素。
用法示例:
xvec = np.array([7,1,2,2,7,4,4,4,5.5,7])
ecdf(xvec)
另一种用法:
df = pd.DataFrame({'x':[7,1,2,2,7,4,4,4,5.5,7]})
ecdf(df['x'])
输出结果为:
pandas
的领域之内。使用 seaborn 的kdeplot
并将cumulative=True
。 - TomAugspurger