如何创建密度图
- 2025-03-18 08:53:00
- admin 原创
- 47
问题描述:
在 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
,按照网络上的示例进行,但到目前为止还没有成功。
解决方案 1:
五年后,当我在 Google 上搜索“如何使用 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)
解决方案 2:
Sven 已经展示了如何使用gaussian_kde
Scipy 中的类,但您会注意到它看起来与您使用 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()
我明白了
这与您从 R 获得的结果非常接近。我做了什么?gaussian_kde
使用可变函数covariance_factor
来计算其带宽。在更改函数之前,covariance_factor 返回的此数据的值约为 0.5。降低此值会降低带宽。我必须_compute_covariance
在更改该函数后调用,以便正确计算所有因子。它与 R 中的 bw 参数并不完全对应,但希望它能帮助您找到正确的方向。
解决方案 3:
选项 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()
选项 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)
解决方案 4:
也许可以尝试类似这样的方法:
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()
您可以轻松地gaussian_kde()
用不同的核密度估计来替换。
解决方案 5:
密度图也可以使用 matplotlib 创建:函数 plt.hist(data) 返回密度图所需的 y 和 x 值(请参阅文档https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html)。因此,以下代码使用 matplotlib 库创建密度图:
import matplotlib.pyplot as plt
dat=[-1,2,1,4,-5,3,6,1,2,1,2,5,6,5,6,2,2,2]
a=plt.hist(dat,density=True)
plt.close()
plt.figure()
plt.plot(a[1][1:],a[0])
此代码返回以下密度图
解决方案 6:
您可以执行以下操作:
s = np.random.normal(2, 3, 1000)
import matplotlib.pyplot as plt
count, bins, ignored = plt.hist(s, 30, density=True)
plt.plot(bins, 1/(3 * np.sqrt(2 * np.pi)) * np.exp( - (bins - 2)**2 / (2 * 3**2) ),
linewidth=2, color='r')
plt.show()
扫码咨询,免费领取项目管理大礼包!