如何将高斯曲线添加到使用qplot创建的直方图?

时间:2011-08-24 21:32:00

标签: r histogram ggplot2

我的问题可能类似于Fitting a density curve to a histogram in R。使用qplot我用这个命令创建了7个直方图:

 (qplot(V1, data=data, binwidth=10, facets=V2~.)   

对于每个切片,我想添加一个拟合的高斯曲线。当我尝试使用lines()方法时,我收到错误:

Error in plot.xy(xy.coords(x, y), type = type, ...) : 
plot.new has not been called yet

正确执行该命令的命令是什么?

2 个答案:

答案 0 :(得分:14)

您是否尝试过stat_function

+ stat_function(fun = dnorm)

您可能希望使用aes(y = ..density..)绘制直方图,以绘制密度值而不是计数。

可以在this问题中找到许多有用的信息,包括在不同方面绘制不同法线的一些建议。

以下是一些例子:

dat <- data.frame(x = c(rnorm(100),rnorm(100,2,0.5)), 
                  a = rep(letters[1:2],each = 100))

在每个面上叠加单个正常密度:

ggplot(data = dat,aes(x = x)) + 
  facet_wrap(~a) + 
    geom_histogram(aes(y = ..density..)) + 
    stat_function(fun = dnorm, colour = "red")

enter image description here

根据我链接的问题,使用不同的法线创建一个单独的数据框:

grid <- with(dat, seq(min(x), max(x), length = 100))
normaldens <- ddply(dat, "a", function(df) {
  data.frame( 
    predicted = grid,
    density = dnorm(grid, mean(df$x), sd(df$x))
  )
})

使用geom_line

分别绘制它们
ggplot(data = dat,aes(x = x)) + 
    facet_wrap(~a) + 
    geom_histogram(aes(y = ..density..)) + 
    geom_line(data = normaldens, aes(x = predicted, y = density), colour = "red")

enter image description here

答案 1 :(得分:5)

ggplot2使用与基本图形不同的图形范例。 (虽然您可以使用grid图片,但最好的方法是在图中添加新的stat_function图层。ggplot2代码如下。

请注意,我无法使用qplot启用此功能,但向ggplot的转换相当简单,最重要的区别是您的数据必须在data.frame格式。

另请注意y审美aes=aes(y=..density..))的显式映射 - 这非常不寻常,但会获取stat_function结果并将其映射到数据:

library(ggplot2)
data <- data.frame(V1 <- rnorm(700), V2=sample(LETTERS[1:7], 700, replace=TRUE))
ggplot(data, aes(x=V1)) + 
  stat_bin(aes(y=..density..)) + 
  stat_function(fun=dnorm) + 
  facet_grid(V2~.)

enter image description here