web-dev-qa-db-ja.com

ヒストグラムを密度曲線でオーバーレイ

密度値のヒストグラムを作成し、密度関数の曲線(密度推定値ではなく)でオーバーレイしようとしています。

シンプルで標準的な通常の例を使用して、いくつかのデータを次に示します。

_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()のような関数の曲線をプロットする方法がありますが、レイヤーとしてではありませんか?

49
Sacha Epskamp

どうぞ!

# 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)
50
Ramnath

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

32
Axeman

_ggplot2_からgeom_density()を使用するのはどうですか?そのようです:

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

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