В RI можно создать желаемый результат, выполнив:
data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))
В python (с matplotlib) самое близкое, что я получил, было с простой гистограммой:
import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()
Я также попробовал параметр normed = True, но ничего не получил, кроме попытки подогнать гауссову к гистограмме.
Мои последние попытки были вокруг scipy.stats
и gaussian_kde
, следуя примерам в сети, но пока безуспешно.
seaborn
stackoverflow.com/a/32803224/1922302Ответы:
Свен показал, как использовать класс
gaussian_kde
из Scipy, но вы заметите, что он не совсем похож на то, что вы сгенерировали с помощью R. Это потому, чтоgaussian_kde
пытается автоматически определить полосу пропускания. Вы можете играть с пропускной способностью таким образом, изменяя функциюcovariance_factor
изgaussian_kde
класса. Во-первых, вот что вы получите без изменения этой функции:Однако, если я использую следующий код:
я получил
что довольно близко к тому, что вы получаете от Р. Что я наделал?
gaussian_kde
использует изменяемую функциюcovariance_factor
для расчета пропускной способности. Перед изменением функции значение, возвращаемое covariance_factor для этих данных, было около 0,5. Уменьшение этого уменьшило пропускную способность. Мне пришлось позвонить_compute_covariance
после изменения этой функции, чтобы все факторы были рассчитаны правильно. Это не точное соответствие параметру bw из R, но, надеюсь, поможет вам двигаться в правильном направлении.источник
set_bandwidth
Метод иbw_method
конструктор аргумент были добавлены к gaussian_kde в SciPy 0.11.0 на выпуск 1619Пять лет спустя, когда я гуглил, «как создать график плотности ядра с помощью python», этот поток все еще отображается наверху!
Сегодня гораздо проще сделать это с помощью пакета seaborn , который предоставляет множество удобных функций построения графиков и хорошее управление стилями.
источник
bw=0.5
дается?bw
Параметр обозначает пропускную способность. Я пытался сопоставить настройку OP (см. Его первый пример исходного кода). Подробное объяснение того, какиеbw
элементы управления, см. На en.wikipedia.org/wiki/… . В основном он контролирует, насколько гладким вы хотите, чтобы график плотности был. Чем больше ЧБ, тем более гладким он будет.TypeError: slice indices must be integers or None or have an __index__ method
Опция 1:
Используйте
pandas
график фрейма данных (построенный поверхmatplotlib
):Вариант 2:
Использование
distplot
вseaborn
:источник
pandas.DataFrame
, можно использоватьpandas.Series(data).plot(kind='density')
@Anake, не нужно устанавливать df.plot.de density как отдельный шаг; может простоbw_method
превратиться в ваш кварг вpd.Series(data).plot(kind='density', bw_method=0.5)
Может попробовать что-нибудь вроде:
Вы можете легко заменить
gaussian_kde()
его другой оценкой плотности ядра.источник
График плотности также можно создать с помощью matplotlib: функция plt.hist (data) возвращает значения y и x, необходимые для графика плотности (см. Документацию https://matplotlib.org/3.1.1/api/_as_gen/ matplotlib.pyplot.hist.html ). В результате следующий код создает график плотности с помощью библиотеки matplotlib:
Этот код возвращает следующий график плотности
источник