我在ggplot2中创建了直方图,我想将其与密度线重叠以得到相同的数据。重要的是,我不想将直方图转换为密度值,而是要在y轴上保留N(数字)。 是否有任何方法可以重叠直方图和密度图而无需变换直方图,而是按比例放大密度曲线?
此数据的直方图:
相同数据的初始密度图:
所需的叠加层,但在Y轴上具有密度,而不是计数:
答案 0 :(得分:2)
是的,但是您必须选择正确的比例因子。由于您不提供任何数据,因此我将用内置的虹膜数据进行说明。
H = hist(iris$Sepal.Width, main="")
由于高度是频率计数,因此高度的总和应等于nrow(iris)的点数。曲线下的区域(框)是高度乘以框的宽度之和,所以
Area = nrow(iris) * (H$breaks[2] - H$breaks[1])
在这种情况下,它是150 * 0.2 = 30,但最好保留为公式。
现在,标准密度曲线下的面积为1,因此我们要使用的比例因子为nrow(iris) * (H$breaks[2] - H$breaks[1])
,以使面积相同。您在哪里应用比例因子?
DENS = density(iris$Sepal.Width)
str(DENS)
List of 7
$ x : num [1:512] 1.63 1.64 1.64 1.65 1.65 ...
$ y : num [1:512] 0.000244 0.000283 0.000329 0.000379 0.000436 ...
$ bw : num 0.123
$ n : int 150
$ call : language density.default(x = iris$Sepal.Width)
$ data.name: chr "iris$Sepal.Width"
$ has.na : logi FALSE
我们要为密度图缩放y值,因此我们使用:
DENS$y = DENS$y * nrow(iris) * (H$breaks[2] - H$breaks[1])
并将线添加到直方图
lines(DENS)
您可以通过调整密度计算的带宽使它变得更好
H = hist(iris$Sepal.Width, main="")
DENS = density(iris$Sepal.Width, adjust=0.7)
DENS$y = DENS$y * nrow(iris) * (H$breaks[2] - H$breaks[1])
lines(DENS)
答案 1 :(得分:2)