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

how to overlap histogram and density plot with Numbers on Y-axis instead of density

我在 ggplot2 中创建了直方图,我想将它与相同数据的密度线重叠。重要的是,我不想将直方图转换为密度值,而是想在 y 轴上保留 N(数字)。 有什么方法可以在不变换直方图的情况下将直方图和密度图重叠,而是按比例放大密度曲线?

此数据的直方图:

相同数据的初始密度图:

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

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

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)

您需要使用 stat_density 创建的 ..count.. 参数,然后按 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")