累积分布图 python

新手上路,请多包涵

我正在使用 python 做一个项目,我有两个数据数组。我们称它们为 pcpnc 。我需要在同一张图上绘制这两者的累积分布。对于 pc ,它应该是一个小于图,即在 (x,y) 处, pc 中的 y 点的值必须小于 x。对于 pnc ,它是一个不止于图,即在 (x,y) 处, pnc 中的 y 点的值必须大于 x。

我试过使用直方图函数 - pyplot.hist 。有没有更好更简单的方法来做我想做的事?此外,它必须绘制在 x 轴上的对数刻度上。

原文由 akhiljain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 617
2 个回答

你很接近。你不应该使用 plt.hist 作为 numpy.histogram,它给你值和 bins,而不是你可以轻松地绘制累积:

 import numpy as np
import matplotlib.pyplot as plt

# some fake data
data = np.random.randn(1000)
# evaluate the histogram
values, base = np.histogram(data, bins=40)
#evaluate the cumulative
cumulative = np.cumsum(values)
# plot the cumulative function
plt.plot(base[:-1], cumulative, c='blue')
#plot the survival function
plt.plot(base[:-1], len(data)-cumulative, c='green')

plt.show()

在此处输入图像描述

原文由 EnricoGiampieri 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用直方图确实不必要地繁重且不精确(分箱使数据模糊):您可以对所有 x 值进行排序:每个值的索引是较小的值的数量。这个更短更简单的解决方案如下所示:

 import numpy as np
import matplotlib.pyplot as plt

# Some fake data:
data = np.random.randn(1000)

sorted_data = np.sort(data)  # Or data.sort(), if data can be modified

# Cumulative counts:
plt.step(sorted_data, np.arange(sorted_data.size))  # From 0 to the number of data points-1
plt.step(sorted_data[::-1], np.arange(sorted_data.size))  # From the number of data points-1 to 0

plt.show()

此外,更合适的绘图样式确实是 plt.step() 而不是 plt.plot() ,因为数据位于离散位置。

结果是:

在此处输入图像描述

您可以看到它比 EnricoGiampieri 的答案的输出 参差不齐,但这是真正的直方图(而不是它的近似、模糊版本)。

PS :正如 SebastianRaschka 指出的那样,最后一点应该理想地显示总数(而不是总数 count-1)。这可以通过以下方式实现:

 plt.step(np.concatenate([sorted_data, sorted_data[[-1]]]),
         np.arange(sorted_data.size+1))
plt.step(np.concatenate([sorted_data[::-1], sorted_data[[0]]]),
         np.arange(sorted_data.size+1))

data 中有太多点,如果不缩放效果是不可见的,但当数据仅包含几个点时,总数中的最后一个点确实很重要。

原文由 Eric O Lebigot 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题