#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()