如何将直方图和密度图与Y轴上的数字而不是密度重叠

时间:2019-10-08 01:19:47

标签: r ggplot2 histogram scale density-plot

我在ggplot2中创建了直方图,我想将其与密度线重叠以得到相同的数据。重要的是,我不想将直方图转换为密度值,而是要在y轴上保留N(数字)。  是否有任何方法可以重叠直方图和密度图而无需变换直方图,而是按比例放大密度曲线?

此数据的直方图:

img1

相同数据的初始密度图:

img2

所需的叠加层,但在Y轴上具有密度,而不是计数:

img3

2 个答案:

答案 0 :(得分:2)

是的,但是您必须选择正确的比例因子。由于您不提供任何数据,因此我将用内置的虹膜数据进行说明。

H = hist(iris$Sepal.Width, main="")

Base histogram

由于高度是频率计数,因此高度的总和应等于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)

Histogram with density curve

您可以通过调整密度计算的带宽使它变得更好

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)

Histogram with adjusted density curve

答案 1 :(得分:2)

您将要使用由..count..创建的stat_density参数,然后按bin宽度对其进行缩放。

library(ggplot2)
set.seed(15)
df <- data.frame(x=rnorm(500, sd=10))
ggplot(df, aes(x=x)) + 
  geom_histogram(colour="black", fill="white", binwidth = 5 ) +
  geom_density(aes(y=..count..*5), alpha=.2, fill="#FF6666") 

enter image description here

相关问题