ggplot2中的密度图和直方图

5

我有以下数据框:

        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处出现了一条细线。

enter image description here

2个回答

5
你需要让geom_histogramgeom_density共享同一轴。在这种情况下,我已经指定了两者都绘制密度图,通过在geom_histogram中添加aes(y=..density)。还要注意一些不同的美学效果,以避免重叠,并使我们能够更清楚地看到两个几何对象:
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)

enter image description here

正如最初指定的那样,美学fill=适用于两者,因此您可以看到直方图和密度几何图形,这些图形根据“x1”和“x2”进行分组显示分布。如果您想要x1和x2的组合集的密度几何图形,只需仅为直方图几何图形指定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)

enter image description here


但我想要整个分布的密度,而不是分组的。 - Adrián Valls Carbó
使用 geom_density(alpha=0) 可以获得更好的视图。 - Martin Gal
@AdriánVallsCarbó - 请查看答案中的调整。您应该在特定的几何对象内指定 fill= 美学属性。在示例中,我已将其移动,以便直方图几何对象显示 x1 和 x2 的分布,而密度几何对象则显示 x 的整个分布。 - chemdork123

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
      )
  )

result


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接