首页 > 解决方案 > 如何限制 scipy.stats.norm.pdf 的绘图值

问题描述

我正在尝试使用 scipy.stats.norm 绘制高斯 PDF,但我只想绘制介于某些参数(btwn 0 和 20,000)之间的 y 值。我不想改变 PDF 的形状,只是限制绘图的值。

我尝试了以下代码的几种变体,但不断收到(可以理解的)错误:

ValueError: The truth value of an array with more than one element is ambiguous use a.any() or a.all()

这是有道理的,但我不知道如何得到我想要的结果。如果我尝试将 y 索引为 y(i),则绘图的尺寸不匹配,与 a.any() 类似。

欢迎任何pythonic解决方案——我还是很新,所以也许我忽略了一些明显的东西。

x = np.linspace(0,20000,1000)
y = norm.pdf(x, loc=3600, scale=2160)
if y in range(0,10000):
    y = z
plt.plot(x,z)
plt.savefig('continPDF')

标签: python

解决方案


如果您只想使用这些参数绘制 pdf,从最小输入值0到最大输入值10000,那么您可以简单地执行以下操作:

y = norm.pdf(range(0,10001), loc=3600, scale=2160)
plt.plot(y)

在此处输入图像描述

编辑:以下来自@inon-peled 的评论scipy.stats.truncnorm,基于文档中的示例,请参见下面的演示:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.truncnorm.html

为简单起见,我已从您的比例参数中抽象出来。

from scipy.stats import truncnorm

loc = 3600
a, b = -1000, 1000

x = np.linspace(truncnorm.ppf(0, a, b, loc=loc),
                truncnorm.ppf(1, a, b, loc=loc), 10000)

for i in [a,b,0]:
    plt.axvline(loc+i, color='black', linestyle='--', alpha=0.5, lw=1)

annotations = ['loc+a','loc+b','loc']    

for i,j in zip(annotations,[a,b,0]):
    plt.annotate(I, (loc+j,0.0001830), fontsize=8, ha='center')   

plt.plot(x, truncnorm.pdf(x, a, b, loc=loc, scale=scale), 'r')

在此处输入图像描述


推荐阅读