uno*_*ode 112 python numpy r matplotlib scipy
在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))
Run Code Online (Sandbox Code Playgroud)

在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()
Run Code Online (Sandbox Code Playgroud)

我也尝试了normed = True参数,但除了试图将高斯拟合到直方图之外,我无法得到任何其他参数.
我最新的尝试是围绕scipy.stats和gaussian_kde,根据网站上的例子,但我一直不成功至今.
Xin*_*Xin 132
五年后,当我谷歌"如何使用python创建内核密度图"时,这个线程仍然显示在顶部!
今天,更简单的方法是使用seaborn,这个包提供了许多方便的绘图功能和良好的样式管理.
import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)
Run Code Online (Sandbox Code Playgroud)
Jus*_*eel 115
Sven已经展示了如何使用gaussian_kdeScipy中的类,但是你会注意到它看起来与你用R生成的类似.这是因为gaussian_kde尝试自动推断带宽.您可以使用带宽的方式改变功能发挥covariance_factor的的gaussian_kde类.首先,这是你在不改变这个功能的情况下获得的:

但是,如果我使用以下代码:
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()
Run Code Online (Sandbox Code Playgroud)
我明白了

这与你从R得到的非常接近.我做了什么?gaussian_kde使用可变功能covariance_factor来计算它的带宽.在更改函数之前,covariance_factor为此数据返回的值约为.5.降低这个降低了带宽.我必须_compute_covariance在更改该功能后调用,以便正确计算所有因子.它与R的bw参数不完全一致,但希望它可以帮助您找到正确的方向.
Sve*_*ach 44
也许尝试类似的东西:
import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()
Run Code Online (Sandbox Code Playgroud)
您可以gaussian_kde()使用不同的内核密度估算轻松替换.
Azi*_*lto 42
选项1:
使用pandas数据框图(建立在上面matplotlib):
import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()
Run Code Online (Sandbox Code Playgroud)
选项2:
使用distplot的seaborn:
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)
Run Code Online (Sandbox Code Playgroud)