ggplot2 中的密度图和直方图

Density plot and histogram in ggplot2

我有以下数据框

        x1<-data.frame(n = rnorm(1000000, mean=0, sd=1), nombre= "x1")

        x2<-data.frame(n=rnorm(1500000, mean=3, sd=1), nombre= "x2")

        x<-rbind(x1, x2)

        ggplot(x, aes(n, fill=nombre))+
          geom_histogram(alpha=0.5, binwidth=0.25, position = "identity")+
          geom_density()

我想将密度图叠加到直方图上,但它看起来像 0 中的一条细线

您需要让 geom_histogramgeom_density 共享同一个轴。在这种情况下,我通过将 aes(y=..density) 项添加到 geom_histogram 来指定两者都针对密度绘制。还要注意一些不同的美学,以避免过度绘制,这样我们就可以更清楚地看到两个几何图形:

ggplot(x, aes(n, fill=nombre))+
    geom_histogram(aes(y=..density..), color='gray50',
        alpha=0.2, binwidth=0.25, position = "identity")+
    geom_density(alpha=0.2)

正如最初指定的那样,美学 fill= 适用于两者,因此您有直方图和密度 geom 显示根据 "x1" 和 "x2" 分组的分布。如果你想要 x1 和 x2 的组合集的密度 geom,只需为直方图 geom 指定 fill= 美学:

ggplot(x, aes(n))+
    geom_histogram(aes(y=..density.., fill=nombre),
        color='gray50', alpha=0.2,
        binwidth=0.25, position = "identity")+
    geom_density(alpha=0.2)

我想出了一个主意,可以让您根据直方图缩放密度图。

您可以使用 stat:density 函数获取密度数据并手动缩放它们,然后使用 geom_line:

绘制它们
ggplot(x, aes(n, fill=nombre))+
  geom_histogram(alpha=0.5, binwidth=0.25, position = "identity") +
  geom_line(aes(x,y, group=nombre),
    ~ .x %>% group_by(nombre) %>%
      mutate(n_cut = cut(n, seq(min(n), max(n), 0.25))) %>% 
      summarize(
        y = density(n)$y * max(table(n_cut)) / max(density(n)$y),
        x = density(n)$x
      )
  )