问题描述
我试图在一些符合该分布的随机生成的点旁边绘制一个正态分布。我希望这些点简单地绘制在 x 轴上以显示观察密度存在的位置,如下所示:
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
mean = 64.43
standard_deviation = 2.99
random_weights = [norm(mean,standard_deviation) for _ in range(0,30)]
x_axis = np.arange(50.0,80.0,0.01)
plt.plot(x_axis,norm.pdf(x_axis,mean,standard_deviation))
plt.scatter(random_weights,[0 for _ in range(0,30)])
plt.show()
错误:
Traceback (most recent call last):
File "C:\git\python_playground\main.py",line 13,in <module>
plt.scatter(random_weights,30)])
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\matplotlib\pyplot.py",line 3068,in scatter
__ret = gca().scatter(
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\matplotlib\__init__.py",line 1361,in inner
return func(ax,*map(sanitize_sequence,args),**kwargs)
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\matplotlib\axes\_axes.py",line 4587,in scatter
collection = mcoll.PathCollection(
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\matplotlib\collections.py",line 1034,in __init__
super().__init__(**kwargs)
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\matplotlib\_api\deprecation.py",line 431,in wrapper
return func(*inner_args,**inner_kwargs)
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\matplotlib\collections.py",line 206,in __init__
offsets = np.asanyarray(offsets,float)
File "C:\Users\thoma\AppData\Local\Programs\Python\python39\lib\site-packages\numpy\core\_asarray.py",line 171,in asanyarray
return array(a,dtype,copy=False,order=order,subok=True)
TypeError: float() argument must be a string or a number,not 'rv_frozen'
更新:
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
mean = 64.43
standard_deviation = 2.99
random_weights = np.random.normal(mean,standard_deviation,30)
# Plot between -10 and 10 with .01 steps.
x_axis = np.arange(50.0,30)])
plt.show()
解决方法
norm(mean,standard_deviation)
不会从正态分布中生成随机样本。对于随机样本,使用 rvs()
方法,例如normal(mean,standard_deviation).rvs()
或 norm.rvs(mean,standard_deviation)
。或者使用 numpy 随机数生成器。
此外,rvs
方法接受一个 size
参数,因此您可以编写
random_weights = norm.rvs(mean,standard_deviation,size=30)
题外话:我认为如果您将 alpha=0.5
(或其他一些分数--实验)添加到 scatter
函数调用。
您在列表中存储了 30 个正态随机变量。我认为您打算从一个正态随机变量中绘制 30 个随机观察值。
# Draw 30 samples from a normal distribution
mean = 64.43
standard_deviation = 2.99
random_weights = norm(mean,standard_deviation).rvs(30) # Use .rvs()
x_axis = np.arange(50.0,80.0,0.01)
plt.plot(x_axis,norm.pdf(x_axis,mean,standard_deviation))
plt.scatter(random_weights,[0 for _ in range(0,30)])
plt.show()