用密度曲线叠加直方图

时间:2011-04-16 16:55:14

标签: r ggplot2

我正在尝试制作密度值的直方图,并用密度函数的曲线(而不是密度估计值)覆盖它。

使用简单的标准正常示例,这里有一些数据:

x <- rnorm(1000)

我能做到:

q <- qplot( x, geom="histogram")
q + stat_function( fun = dnorm )

但是这给出了直方图的频率而不是密度。使用..density..我可以在直方图上得到适当的比例:

q <- qplot( x,..density.., geom="histogram")
q

但现在这给出了一个错误:

q + stat_function( fun = dnorm )

有什么我没看到的吗?

另一个问题是,有没有办法绘制函数的曲线,如curve(),但不是作为图层?

3 个答案:

答案 0 :(得分:50)

你走了!

# create some data to work with
x = rnorm(1000);

# overlay histogram, empirical density and normal density
p0 = qplot(x, geom = 'blank') +   
  geom_line(aes(y = ..density.., colour = 'Empirical'), stat = 'density') +  
  stat_function(fun = dnorm, aes(colour = 'Normal')) +                       
  geom_histogram(aes(y = ..density..), alpha = 0.4) +                        
  scale_colour_manual(name = 'Density', values = c('red', 'blue')) + 
  theme(legend.position = c(0.85, 0.85))

print(p0)

答案 1 :(得分:31)

更接近Ramnath答案的替代方案,传递观察到的均值和标准差,并使用ggplot代替qplot

df <- data.frame(x = rnorm(1000, 2, 2))

# overlay histogram and normal density
ggplot(df, aes(x)) +
  geom_histogram(aes(y = stat(density))) +
  stat_function(
    fun = dnorm, 
    args = list(mean = mean(df$x), sd = sd(df$x)), 
    lwd = 2, 
    col = 'red'
  )

enter image description here

答案 2 :(得分:0)

如何使用geom_density()中的ggplot2?像这样:

df <- data.frame(x = rnorm(1000, 2, 2))

ggplot(df, aes(x)) + geom_histogram(aes(y=..density..)) + geom_density(col = "red")