Как добавить гауссову кривую к гистограмме, созданной с помощью qplot? - PullRequest
9 голосов
/ 25 августа 2011

У меня вопрос, вероятно, похожий на Подгонка кривой плотности к гистограмме в R . Используя qplot, я создал 7 гистограмм с помощью этой команды:

 (qplot(V1, data=data, binwidth=10, facets=V2~.)   

Для каждого среза я хотел бы добавить подходящую гауссову кривую. Когда я пытаюсь использовать метод lines(), я получаю сообщение об ошибке:

Error in plot.xy(xy.coords(x, y), type = type, ...) : 
plot.new has not been called yet

Что такое команда, чтобы сделать это правильно?

Ответы [ 2 ]

14 голосов
/ 25 августа 2011

Вы пробовали stat_function?

+ stat_function(fun = dnorm)

Возможно, вы захотите построить гистограммы, используя aes(y = ..density..), чтобы построить значения плотности, а не счетчики.

В этом вопросе можно найти много полезной информации, включая некоторые советы по построению различных нормальных кривых на разных гранях.

Вот несколько примеров:

dat <- data.frame(x = c(rnorm(100),rnorm(100,2,0.5)), 
                  a = rep(letters[1:2],each = 100))

Наложите одну нормальную плотность на каждый фасет:

ggplot(data = dat,aes(x = x)) + 
  facet_wrap(~a) + 
    geom_histogram(aes(y = ..density..)) + 
    stat_function(fun = dnorm, colour = "red")

enter image description here

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

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

И нанесите их отдельно, используя 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")

enter image description here

5 голосов
/ 25 августа 2011

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~.)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...