【问题标题】:Matplotlib - Plotting Normal Distribution alongside Random PointsMatplotlib - 在随机点旁边绘制正态分布
【发布时间】:2021-09-03 05:34:49
【问题描述】:

我正在尝试在符合该分布的一些随机生成的点旁边绘制一个正态分布。我希望将这些点简单地绘制在 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, [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()

【问题讨论】:

  • “我不断收到一些类型错误...” 每当您对错误有疑问时,请在问题中包含完整的回溯(即完整的错误消息)。里面有有用的信息!
  • @WarrenWeckesser 完成。更新的问题。

标签: python matplotlib scipy


【解决方案1】:

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 函数调用中,您在x 轴上的散点图将更好地反映与密度的关系。

【讨论】:

  • 糟糕。我想我在 3 个不同的库之间混淆了我的 PDF、CDF 和反向 CDF 函数。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多