我的问题可能类似于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
正确执行该命令的命令是什么?
答案 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")
根据我链接的问题,使用不同的法线创建一个单独的数据框:
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")
答案 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~.)