Подтвердить что ты не робот

Наложение гистограммы с кривой плотности

Я пытаюсь составить гистограмму значений плотности и наложить ее на кривую функции плотности (а не на оценку плотности).

Используя простой стандартный нормальный пример, вот некоторые данные:

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(), но не в виде слоя?

4b9b3361

Ответ 1

Здесь вы идете!

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

Ответ 2

Более простая альтернатива ответу Рамната, передавая наблюдаемое среднее и стандартное отклонение и используя 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

Ответ 3

Как насчет использования geom_density() из ggplot2? Вот так:

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

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