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

9

我有一个问题,可能类似于在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

如何正确执行该命令?


1
你不能将基本图形函数(如lines()等)与ggplot2lattice包使用的网格图形混合在一起。 - Gavin Simpson
2个回答

14

你尝试过 stat_function 吗?

+ stat_function(fun = dnorm)

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

这个 问题中可以找到许多有用的信息,包括有关在不同方面绘制不同正常曲线的建议。

以下是一些示例:

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


我在R语言方面非常初学,只接触了几天。我会好好研究的,感谢你的提示! - mkk

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


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