如何在matplotlib中创建密度图?
回答问题 在 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)) 在python(使用matplotlib)中,我得到的最接近的是一个简单的直方图: import matpl
回答问题
在 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))
在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()
我还尝试了normedu003dTrue 参数但除了尝试将高斯拟合到直方图之外什么也得不到。
我最近的尝试是在scipy.stats
和gaussian_kde
附近,遵循网上的例子,但到目前为止我还没有成功。
Answers
Sven 已经展示了如何使用 Scipy 中的gaussian_kde
类,但是您会注意到它看起来与您使用 R 生成的不太一样。这是因为gaussian_kde
尝试自动推断带宽。您可以通过更改gaussian_kde
类的函数covariance_factor
以某种方式使用带宽。首先,这是您在不更改该功能的情况下得到的结果:
但是,如果我使用以下代码:
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()
我明白了
这与您从 R 中得到的非常接近。我做了什么?gaussian_kde
使用可变函数covariance_factor
来计算其带宽。在更改函数之前,covariance_factor 针对该数据返回的值约为 0.5。降低它会降低带宽。更改该函数后,我必须调用_compute_covariance
以便正确计算所有因素。它与 R 中的 bw 参数并不完全对应,但希望它可以帮助您朝着正确的方向前进。
更多推荐
所有评论(0)