在R中,我可以通过以下操作创建所需的输出:

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

R中的密度图

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

matplotlib中的直方图

我也try 了the normed=True parameter次,但除了try 将高斯分布拟合到直方图之外,我什么也得不到.

我最近的try 大约是scipy.stats次和gaussian_kde次,在网上有一些例子,但到目前为止我一直没有成功.

推荐答案

Sven已经展示了如何使用Scipy中的类gaussian_kde,但您会注意到它与您使用R生成的类不太一样.这是因为gaussian_kde试图自动推断带宽.您可以通过更改gaussian_kde类的函数covariance_factor来使用带宽.首先,在不改变该函数的情况下,可以得到以下结果:

alt text

但是,如果我使用以下代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()

我明白了

alt text

这和你从R得到的非常接近.我做了什么?gaussian_kde使用可变函数covariance_factor计算其带宽.在更改函数之前,此数据的协方差_因子返回的值约为0.5.降低这个会降低带宽.在改变函数后,我不得不调用_compute_covariance,以便正确计算所有的因子.它与R中的bw参数并不完全对应,但希望它能帮助您找到正确的方向.

R相关问答推荐

这两种创建S4对象的方法有何不同?

指定要保留在wrap_plots中的传奇

按自定义数字模式对变量名称排序

使用na.locf在长格式数据集中输入具有多个时间点的数据集

在R中无法读入具有Readxl和lApply的数据集

在另存为PNG之前隐藏htmlwidget绘图元素

条形图和在Ploly中悬停的问题

移除仪表板Quarto中顶盖和车身之间的白色区域

有效识别长载体中的高/低命中

如何通过ggplot2添加短轴和删除长轴?

如何删除最后一个可操作对象

按时间顺序对不同事件进行分组

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

从多个可选列中选取一个值到一个新列中

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

为R中的16组参数生成10000个样本的有效方法是什么?

判断函数未加载R中的库

整理ggmosaic图的标签

R-找出存在其他变量的各种大小的所有组合

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)