Matplotlib — Построение нормального распределения рядом со Случайными точками

#python #matplotlib #scipy

Вопрос:

Я пытаюсь построить нормальное распределение рядом с некоторыми случайно сгенерированными точками, которые соответствуют этому распределению. Я хочу, чтобы эти точки были просто нанесены на ось 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:gitpython_playgroundmain.py", line 13, in <module>
    plt.scatter(random_weights, [0 for _ in range(0,30)])
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibpyplot.py", line 3068, in scatter
    __ret = gca().scatter(
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlib__init__.py", line 1361, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_axes.py", line 4587, in scatter
    collection = mcoll.PathCollection(
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibcollections.py", line 1034, in __init__
    super().__init__(**kwargs)
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlib_apideprecation.py", line 431, in wrapper
    return func(*inner_args, **inner_kwargs)
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibcollections.py", line 206, in __init__
    offsets = np.asanyarray(offsets, float)
  File "C:UsersthomaAppDataLocalProgramsPythonPython39libsite-packagesnumpycore_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()
 

Комментарии:

1. «Я продолжаю получать некоторые ошибки типа …» Всякий раз, когда у вас возникает вопрос об ошибках, включайте в вопрос полную обратную трассировку (т. Е. Полное сообщение об ошибке). Там есть полезная информация!

2. @WarrenWeckesser готово. Обновленный вопрос.

Ответ №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)
 

Не по теме: Я думаю, что ваша точечная диаграмма точек на оси x будет лучше отражать связь с плотностью, если вы добавите alpha=0.5 (или какую-либо другую фракцию-эксперимент) к scatter вызову функции.

Комментарии:

1. Ой. Я предполагаю, что я путаю свои функции PDF, CDF и обратного CDF между 3 различными библиотеками.

Ответ №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()