【问题标题】:Python equivalent for MATLAB's normplot?Python 等效于 MATLAB 的 normplot?
【发布时间】:2011-09-16 23:28:49
【问题描述】:

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

MATLAB 语法:

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

给予:

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

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() 

提供:

否则,如何像第一个情节那样调整比例?

谢谢。

【问题讨论】:

    标签: python numpy matplotlib scipy probability


    【解决方案1】:

    我相当肯定 matplotlib 不提供类似的东西。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        也许你可以使用 scipy (scipy.stats) 的 probplot 函数,这在我看来相当于 MATLABs normplot:

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

        probplot 可选地计算一个 数据和绘图的最佳拟合线 使用 Matplotlib 或 a 给定绘图函数。

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

        但这并不能解决您的 y 轴刻度不同的问题。

        【讨论】:

          【解决方案4】:

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

          正如 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()
          

          结果:

          【讨论】:

            猜你喜欢
            • 2021-12-18
            • 2021-09-10
            • 1970-01-01
            • 2013-03-29
            • 2018-08-13
            • 2020-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多