Matplotlib - 在随机点旁边绘制正态分布

时间:2021-06-18 13:16:08

标签: python matplotlib scipy

我试图在一些符合该分布的随机生成的点旁边绘制一个正态分布。我希望这些点简单地绘制在 x 轴上以显示观察密度存在的位置,如下所示:

enter image description here

我如何实现这一目标?我不断收到以下代码的一些类型错误:

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, [0 for _ in range(0,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, 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()

2 个答案:

答案 0 :(得分:2)

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函数调用。

答案 1 :(得分:1)

您在列表中存储了 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()