如何在Python中创建指数概率文件

问题描述

我现在正在尝试在python中重新创建 exponential probability paper的图形。

为此,我必须将CDF函数线性化为:

x = a*g(Fx(x)) + b

然后绘制xg(Fx(x))

This image shows the parameters for different distributions

但是我对如何进行一无所知。显然,必须更改x轴的比例。我已经尝试过使用probplot,但结果却完全相同。

有什么想法吗?

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import expon
from scipy.stats import probplot

# Creating plot

fig,ax =plt.subplots()
newax=ax.twiny()
ax.grid()

# Lognormal

lambda_expon=0.04
i=1/lambda_expon

probs=np.arange(0.01,0.99,0.01) # array with probabilities

ppf =expon.ppf(probs,i) 
cdf=expon.cdf(ppf,i) 
x=-np.log(1-cdf) # variable
y=-np.log(1-cdf)*i # linearized form CDF

ax.plot(x,y)
newax.set_xticks([0.01,0.5,0.8,0.9,0.96,0.99])
newax.set_xticks([0.01,0.90,0.99])

ax.plot()

解决方法

不确定,您为什么认为这是CDF图。如果在X轴上放置概率,而在Y轴上绘制x,则看起来像分位数图。

在这种比例尺内置的Python / Matplotlib中看不到,logit看起来是最好的近似值。

还是我误解了你的问题?

代码,Python 3.8 x64 Win10

import numpy as np
import matplotlib.pyplot as plt

# exponential distribution
def PDF(x,λ):
    return λ*np.exp(-λ*x)

def CDF(x,λ):
    return 1.0 - np.exp(-λ*x)

def Q(p,λ): # quantile
    x = -np.log(1.0 - p)/λ
    return x

# plots
λ = 0.04

p = np.linspace(0.01,0.99,101)
x = Q(p,λ)

fig = plt.figure()
ax  = fig.add_subplot(2,1,1)

ax.set_xscale('logit')
ax.plot(p,x,'r-')

plt.show()

您会得到类似的东西

enter image description here

更新

如果您需要概率图,这里是

代码

from scipy.stats import expon

rve = expon(loc=0.0,scale=1.0/λ)

p = np.linspace(0.01,101)
x = rve.ppf(p) #  Q(p,λ)

q = rve.rvs(size = 10000)

fig = plt.figure()
ax  = fig.add_subplot(2,1)
   
res = stats.probplot(q,dist=rve,plot=ax)

plt.show()

和图形

enter image description here

好吧,当您发送消息时,我已经在编写代码了。无论如何将其放置在这里,看起来就像您要问的图形-具有自定义标签的线性图。

import matplotlib.ticker as ticker

def linear(x0,xn,y0,yn,x):
    q = (x-x0)/(xn-x0)
    return q * yn + (1.0 - q) * y0

pmin = 0.009
pmax = 0.991

xmin = Q(pmin,λ)
xmax = Q(pmax,λ)

x = np.linspace(xmin,xmax,2)
p = np.linspace(pmin,pmax,2)

tick_values = [0.01,0.50,0.80,0.90,0.96,0.99] # probabilies
tick_names  = [str(v) for v in tick_values] # ticks to place on graph

tick_xvals  = [Q(p,λ) for p in tick_values] # x values for each p
tick_places = [linear(xmin,pmin,x) for x in tick_xvals] # x from linear function

fig = plt.figure()
ax  = fig.add_subplot(2,1)

ax.axes.xaxis.set_major_locator(ticker.FixedLocator((tick_places)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter((tick_names)))

ax.plot(p,'r-')

plt.show()

和图形本身

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...