mkk*_*mkk 9 r histogram ggplot2
我有一个问题可能类似于将密度曲线拟合到R中的直方图.使用qplot我用这个命令创建了7个直方图:
(qplot(V1, data=data, binwidth=10, facets=V2~.)
Run Code Online (Sandbox Code Playgroud)
对于每个切片,我想添加一个拟合的高斯曲线.当我尝试使用lines()方法时,我收到错误:
Error in plot.xy(xy.coords(x, y), type = type, ...) :
plot.new has not been called yet
Run Code Online (Sandbox Code Playgroud)
正确执行命令的命令是什么?
jor*_*ran 14
你试过stat_function吗?
+ stat_function(fun = dnorm)
Run Code Online (Sandbox Code Playgroud)
您可能希望使用直方图aes(y = ..density..)来绘制密度值而不是计数.
在这个问题中可以找到很多有用的信息,包括在不同方面绘制不同法线的一些建议.
这里有些例子:
dat <- data.frame(x = c(rnorm(100),rnorm(100,2,0.5)),
a = rep(letters[1:2],each = 100))
Run Code Online (Sandbox Code Playgroud)
在每个面上叠加单个正常密度:
ggplot(data = dat,aes(x = x)) +
facet_wrap(~a) +
geom_histogram(aes(y = ..density..)) +
stat_function(fun = dnorm, colour = "red")
Run Code Online (Sandbox Code Playgroud)

从我链接的问题,创建一个单独的数据框与不同的正常曲线:
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))
)
})
Run Code Online (Sandbox Code Playgroud)
并使用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")
Run Code Online (Sandbox Code Playgroud)

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~.)
Run Code Online (Sandbox Code Playgroud)
