Python相当于MATLAB的normplot?

时间:2011-06-17 07:24:18

标签: python numpy matplotlib scipy probability

是否有类似于MATLAB的normplot的python等效函数? 也许在matplotlib?

MATLAB语法:

x = normrnd(10,1,25,1);
normplot(x)

给出:

enter image description here

我尝试过使用matplotlib& numpy模块用于确定数组中值的概率/百分位数,但输出图y轴比例与MATLAB中的图相比是线性的。

import numpy as np
import matplotlib.pyplot as plt

data =[-11.83,-8.53,-2.86,-6.49,-7.53,-9.74,-9.44,-3.58,-6.68,-13.26,-4.52]
plot_percentiles = range(0, 110, 10) 

x = np.percentile(data, plot_percentiles)
plt.plot(x, plot_percentiles, 'ro-')
plt.xlabel('Value')
plt.ylabel('Probability')  
plt.show() 

给出: enter image description here

否则,如何在第一个情节中调整尺度?

感谢。

4 个答案:

答案 0 :(得分:5)

一个迟到的答案,但我遇到了同样的问题并找到了一个值得分享的解决方案。我想。

正如joris所指出的那样,probplot函数与normplot相当,但得到的分布是累积密度函数的形式。 Scipy.stats还提供了一个函数来转换这些值。

cdf - >百分

stats.'distribution function'.cdf(cdf_value)

百分位数 - > CDF

stats.'distribution function'.ppf(percentile_value)

例如:

stats.norm.ppf(percentile)

要获得等效的y轴,如normplot,您可以替换cdf-ticks:

from scipy import stats
import matplotlib.pyplot as plt

nsample=500

#create list of random variables
x=stats.t.rvs(100, size=nsample)

# Calculate quantiles and least-square-fit curve
(quantiles, values), (slope, intercept, r) = stats.probplot(x, dist='norm')

#plot results
plt.plot(values, quantiles,'ob')
plt.plot(quantiles * slope + intercept, quantiles, 'r')

#define ticks
ticks_perc=[1, 5, 10, 20, 50, 80, 90, 95, 99]

#transfrom them from precentile to cumulative density
ticks_quan=[stats.norm.ppf(i/100.) for i in ticks_perc]

#assign new ticks
plt.yticks(ticks_quan,ticks_perc)

#show plot
plt.grid()
plt.show()

结果:

probability plot with matplotlib

答案 1 :(得分:2)

我相当肯定matplotlib没有提供这样的东西。

当然可以这么做,但是您必须重新调整数据并更改您的y轴刻度/标签以匹配,或者,如果您计划经常这样做,可能需要编写一个新的比例可以应用于matplotlib轴,如下例所示:http://matplotlib.sourceforge.net/examples/api/custom_scale_example.html

答案 2 :(得分:2)

也许你可以使用scipy的probplot函数(scipy.stats),这对我来说似乎是MATLABs的等价物:

  

计算概率的分位数   针对a的样本数据图   指定的理论分布。

     

probplot可选择计算a   数据和图表的最佳拟合线   结果使用Matplotlib或a   给定情节函数。

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.probplot.html

但是不能解决你的y轴刻度不同的问题。

答案 3 :(得分:1)

使用matplotlib.semilogy将更接近matlab输出。