如何在 Python 中创建指数概率纸
How to create Exponential Probability Paper in Python
我现在正在尝试在 python 中重新创建 exponential probability paper 的这张图。
为此,我必须将 CDF 函数线性化为:
x = a*g(Fx(x)) + b
然后绘制 x
vs g(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.5,0.90,0.99])
ax.plot()
不确定,为什么你认为这是 CDF 图。如果在 X 轴上放置概率,在 Y 轴上绘制 x
,它看起来像分位数图。
我在 Python/Matplotlib built-in 中没有看到这样的尺度,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()
你会得到类似
的东西
更新
如果你需要概率图,就在这里
代码
from scipy.stats import expon
rve = expon(loc=0.0, scale=1.0/λ)
p = np.linspace(0.01, 0.99, 101)
x = rve.ppf(p) # Q(p, λ)
q = rve.rvs(size = 10000)
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
res = stats.probplot(q, dist=rve, plot=ax)
plt.show()
和图表
好吧,我已经在你发送消息时编写了代码。无论如何把它放在这里,它看起来就像你问的图表 - 线性与自定义标签。
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, xmax, pmin, pmax, x) for x in tick_xvals] # x from linear function
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
ax.axes.xaxis.set_major_locator(ticker.FixedLocator((tick_places)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter((tick_names)))
ax.plot(p, x, 'r-')
plt.show()
和图表本身
我现在正在尝试在 python 中重新创建 exponential probability paper 的这张图。
为此,我必须将 CDF 函数线性化为:
x = a*g(Fx(x)) + b
然后绘制 x
vs g(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.5,0.90,0.99])
ax.plot()
不确定,为什么你认为这是 CDF 图。如果在 X 轴上放置概率,在 Y 轴上绘制 x
,它看起来像分位数图。
我在 Python/Matplotlib built-in 中没有看到这样的尺度,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()
你会得到类似
的东西更新
如果你需要概率图,就在这里
代码
from scipy.stats import expon
rve = expon(loc=0.0, scale=1.0/λ)
p = np.linspace(0.01, 0.99, 101)
x = rve.ppf(p) # Q(p, λ)
q = rve.rvs(size = 10000)
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
res = stats.probplot(q, dist=rve, plot=ax)
plt.show()
和图表
好吧,我已经在你发送消息时编写了代码。无论如何把它放在这里,它看起来就像你问的图表 - 线性与自定义标签。
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, xmax, pmin, pmax, x) for x in tick_xvals] # x from linear function
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
ax.axes.xaxis.set_major_locator(ticker.FixedLocator((tick_places)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter((tick_names)))
ax.plot(p, x, 'r-')
plt.show()
和图表本身