在ggplot2中叠加正态分布:Bug?

时间:2017-02-13 18:01:20

标签: r ggplot2

我想叠加两个正态分布。但是,如果我将xlim限制为狭窄的间隔,则情节看起来很奇怪:

see here

library(ggplot2)
x=seq(1,6,.01)
dat <- data.frame(
  c1 = dnorm(x,4.95, .72),
  c2 = dnorm(x,4.85, .91), x = x
)
  ggplot(data=dat, aes(x=x)) + 
  geom_polygon(aes(y=dat[,1]), fill="red", alpha=0.6) +
  geom_polygon(aes(y=dat[,2]), fill="blue", alpha=0.6) +
  xlab("Scale") + ylab("") + xlim(1,6)

如果范围增加,则有效:

see here

 x=seq(1,10,.01)
    dat <- data.frame(
      c1 = dnorm(x,4.95, .72),
      c2 = dnorm(x,4.85, .91), x = x
    )
      ggplot(data=dat, aes(x=x)) + 
      geom_polygon(aes(y=dat[,1]), fill="red", alpha=0.6) +
      geom_polygon(aes(y=dat[,2]), fill="blue", alpha=0.6) +
      xlab("Scale") + ylab("") + xlim(1,10)

(参见图中的输出)。但是,我希望x轴限制为1到6.任何帮助将不胜感激! 另外,您对如何在图的右侧添加标签有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以将geom_areaposition = "identity"一起使用。重新排列并清理一下,

library(tidyverse)

ggplot(dat %>% gather(var, val, -x), aes(x = x, y = val, fill = var)) + 
    geom_area(alpha = 0.6, position = 'identity') + 
    labs(x = "Scale", y = NULL, fill = 'Variable')

area plot

答案 1 :(得分:1)

这不是一个错误 - 你在y重新加入x轴之前切断了范围,这就是多边形环绕到第一个点的位置。如果要在x轴上建立多边形,可以使用geom_ribbon

ggplot(dat) +
    aes(x, ymin = 0) +
    geom_ribbon(aes(ymax  = c1), fill = 'red', alpha = 0.6) +
    geom_ribbon(aes(ymax = c2), fill = 'blue', alpha = 0.6) +
    xlim(1, 6)