用密度曲线叠加直方图

Sac*_*amp 49 r histogram ggplot2

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

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

x <- rnorm(1000)
Run Code Online (Sandbox Code Playgroud)

我可以:

q <- qplot( x, geom="histogram")
q + stat_function( fun = dnorm )
Run Code Online (Sandbox Code Playgroud)

但这给出了直方图在频率而不是密度上的比例.与..density..我能得到直方图的适度规模:

q <- qplot( x,..density.., geom="histogram")
q
Run Code Online (Sandbox Code Playgroud)

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

q + stat_function( fun = dnorm )
Run Code Online (Sandbox Code Playgroud)

有没有我没看到的东西?

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

Ram*_*ath 51

干得好!

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

  • PS如果使用真实数据,请确保将经验均值和sd参数传递给dnorm函数,请参阅stat_function帮助以获取语法. (7认同)
  • @ Jemus42你可以把第一行换成像这样的东西"ggplot(data.frame(x),aes(x = x))+" (2认同)
  • 重叠直方图和密度估计存在一个问题,即密度估计实际上应该移动半个箱宽,以实现最准确和最美观的呈现。我一直不知道该怎么做。有接受者吗? (2认同)

Axe*_*man 32

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

在此输入图像描述

  • 这是一个非常方便的答案,因为它提供了一种绘制直方图和密度曲线的方法,即使它们属于不同的分布(如果需要的话)(就像我一样)。谢谢你! (2认同)

use*_*609 9

使用geom_density()fromggplot2怎么样?像这样:

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

ggplot(df, aes(x)) +
  geom_histogram(aes(y=..density..)) +  # scale histogram y
  geom_density(col = "red")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这也适用于多峰分布,例如:

df <- data.frame(x = c(rnorm(1000, 2, 2), rnorm(1000, 12, 2), rnorm(500, -8, 2)))

ggplot(df, aes(x)) +
  geom_histogram(aes(y=..density..)) +  # scale histogram y
  geom_density(col = "red")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 也许不是OP所要求的,但这确实有助于我寻找的东西! (5认同)
  • @Axeman 密度函数和密度估计有什么区别? (2认同)