我正在做一个使用python的项目,其中有两个数据数组。我们称它们为pc和pnc。我需要在同一个图表上绘制这两者的累积分布。对于pc它应该小于图,即在(x,y)处,y点在pc必须具有小于x的值。对于pnc它应该是比图更多的图,即在(x,y)处,y点在pnc必须具有大于x的值。累积分布图python
我试过使用直方图功能 - pyplot.hist
。有没有更好更简单的方法来做我想做的事?此外,它必须在x轴上以对数刻度绘制。
我正在做一个使用python的项目,其中有两个数据数组。我们称它们为pc和pnc。我需要在同一个图表上绘制这两者的累积分布。对于pc它应该小于图,即在(x,y)处,y点在pc必须具有小于x的值。对于pnc它应该是比图更多的图,即在(x,y)处,y点在pnc必须具有大于x的值。累积分布图python
我试过使用直方图功能 - pyplot.hist
。有没有更好更简单的方法来做我想做的事?此外,它必须在x轴上以对数刻度绘制。
你就近了。你不应该使用plt.hist作为numpy.histogram,是提供给你的价值观和垃圾箱,比你可以绘制累计轻松:
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()
使用直方图是真的不必要的沉重,不精确(分箱会使数据模糊):您可以对所有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指出的,最后一点应理想地显示总计数(而不是总计数-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
这么多点的效果是不可见,但不缩放,但是当数据只包含几个点,或总数的最后一点事情做。
但是,对于大型数组,您希望使用直方图方法,因为它不需要太多内存。 'plt.step'方法为我提供了一个6000万个元素数组的内存错误。 – aaren 2014-03-26 10:52:26
同意。我不确定问题出在'plt.step'还是这个确切的方法使用的可能性是阵列的内存的3倍,或者两者都是...... – EOL 2014-03-26 14:05:52
我同意:plt.step可能是更合适的方法密谋“计数”。一个问题:你不需要使用'plt.step(sorted_data,np.arange(1,data.size + 1))'来获得正确的计数吗? – Sebastian 2014-07-02 20:53:26
与@EOL确凿的讨论后,我想使用随机高斯样本的汇总后我的解决方案(左上):
import numpy as np
import matplotlib.pyplot as plt
from math import ceil, floor, sqrt
def pdf(x, mu=0, sigma=1):
"""
Calculates the normal distribution's probability density
function (PDF).
"""
term1 = 1.0/(sqrt(2*np.pi) * sigma)
term2 = np.exp(-0.5 * ((x-mu)/sigma)**2)
return term1 * term2
# Drawing sample date poi
##################################################
# Random Gaussian data (mean=0, stdev=5)
data1 = np.random.normal(loc=0, scale=5.0, size=30)
data2 = np.random.normal(loc=2, scale=7.0, size=30)
data1.sort(), data2.sort()
min_val = floor(min(data1+data2))
max_val = ceil(max(data1+data2))
##################################################
fig = plt.gcf()
fig.set_size_inches(12,11)
# Cumulative distributions, stepwise:
plt.subplot(2,2,1)
plt.step(np.concatenate([data1, data1[[-1]]]), np.arange(data1.size+1), label='$\mu=0, \sigma=5$')
plt.step(np.concatenate([data2, data2[[-1]]]), np.arange(data2.size+1), label='$\mu=2, \sigma=7$')
plt.title('30 samples from a random Gaussian distribution (cumulative)')
plt.ylabel('Count')
plt.xlabel('X-value')
plt.legend(loc='upper left')
plt.xlim([min_val, max_val])
plt.ylim([0, data1.size+1])
plt.grid()
# Cumulative distributions, smooth:
plt.subplot(2,2,2)
plt.plot(np.concatenate([data1, data1[[-1]]]), np.arange(data1.size+1), label='$\mu=0, \sigma=5$')
plt.plot(np.concatenate([data2, data2[[-1]]]), np.arange(data2.size+1), label='$\mu=2, \sigma=7$')
plt.title('30 samples from a random Gaussian (cumulative)')
plt.ylabel('Count')
plt.xlabel('X-value')
plt.legend(loc='upper left')
plt.xlim([min_val, max_val])
plt.ylim([0, data1.size+1])
plt.grid()
# Probability densities of the sample points function
plt.subplot(2,2,3)
pdf1 = pdf(data1, mu=0, sigma=5)
pdf2 = pdf(data2, mu=2, sigma=7)
plt.plot(data1, pdf1, label='$\mu=0, \sigma=5$')
plt.plot(data2, pdf2, label='$\mu=2, \sigma=7$')
plt.title('30 samples from a random Gaussian')
plt.legend(loc='upper left')
plt.xlabel('X-value')
plt.ylabel('probability density')
plt.xlim([min_val, max_val])
plt.grid()
# Probability density function
plt.subplot(2,2,4)
x = np.arange(min_val, max_val, 0.05)
pdf1 = pdf(x, mu=0, sigma=5)
pdf2 = pdf(x, mu=2, sigma=7)
plt.plot(x, pdf1, label='$\mu=0, \sigma=5$')
plt.plot(x, pdf2, label='$\mu=2, \sigma=7$')
plt.title('PDFs of Gaussian distributions')
plt.legend(loc='upper left')
plt.xlabel('X-value')
plt.ylabel('probability density')
plt.xlim([min_val, max_val])
plt.grid()
plt.show()
它会帮助,如果你表现你的企图到目前为止 - 样本输入数据,期望的输出等...否则,这会读作“显示我的代码”问题 – 2013-03-14 11:49:00
为了扩展Jon的评论,人们很高兴地帮助您修复您拥有的代码,而不是从头开始生成代码。不管你的代码有多么多的功能和非功能性,展示它并解释你期望它做什么和b)它目前在做什么。 – tacaswell 2013-03-14 13:14:22