如何限制scipy.stats.norm.pdf的图值

时间:2019-03-31 14:34:17

标签: python

我正在尝试使用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')

1 个答案:

答案 0 :(得分:2)

如果您只想用这些参数绘制pdf,从0的最小输入值到10000的最大输入值,则只需执行以下操作:

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

enter image description here

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

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

为简单起见,我从您的scale参数中提取了

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

enter image description here