Наложение кривой "Плотность" на гистограмму, где вертикальная ось - это частота (или счетчик) или относительная частота?

Есть ли способ наложения чего-то аналогичного кривой плотности, когда вертикальная ось является частотой или относительной частотой? (Не фактическая функция плотности, поскольку область не должна интегрироваться в 1.) Следующий вопрос похож: ggplot2: гистограмма с нормальной кривой, и пользователь сам отвечает с идеей масштабирования ..count.. Внутри geom_density(), Однако это кажется необычным.

Следующий код создает перекачанную строку "плотность".

df1            <- data.frame(v = rnorm(164, mean = 9, sd = 1.5))
b1             <- seq(4.5, 12, by = 0.1)
hist.1a        <- ggplot(df1, aes(v)) + 
                    stat_bin(aes(y = ..count..), color = "black", fill = "blue",
                             breaks = b1) + 
                    geom_density(aes(y = ..count..))
hist.1a

сюжет

2 ответа

Решение

Ответ / комментарий @joran заставил меня задуматься о том, каким будет соответствующий коэффициент масштабирования. Ради потомков, вот результат.

Когда вертикальная ось является частотой (он же число)

плотность

Таким образом, масштабный коэффициент для вертикальной оси, измеренный в счетчиках бинов, равен

bincount

В этом случае с N = 164 и ширина бункера как 0.1эстетика для y в сглаженной строке должна быть:

y = ..density..*(164 * 0.1)

Таким образом, следующий код создает линию "плотности", масштабированную для гистограммы, измеренной по частоте (или счетчик).

df1            <- data.frame(v = rnorm(164, mean = 9, sd = 1.5))
b1             <- seq(4.5, 12, by = 0.1)
hist.1a        <- ggplot(df1, aes(x = v)) + 
                    geom_histogram(aes(y = ..count..), breaks = b1, 
                                   fill = "blue", color = "black") + 
                    geom_density(aes(y = ..density..*(164*0.1)))
hist.1a

сюжет

Когда вертикальная ось является относительной частотой

relfreq

Используя вышесказанное, мы могли бы написать

hist.1b        <- ggplot(df1, aes(x = v)) + 
                    geom_histogram(aes(y = ..count../164), breaks = b1, 
                                   fill = "blue", color = "black") + 
                    geom_density(aes(y = ..density..*(0.1)))
hist.1b

Relf

Когда вертикальная ось - плотность

hist.1c        <- ggplot(df1, aes(x = v)) + 
                    geom_histogram(aes(y = ..density..), breaks = b1, 
                                   fill = "blue", color = "black") + 
                    geom_density(aes(y = ..density..))
hist.1c

притоны

Попробуйте это вместо этого:

ggplot(df1,aes(x = v)) + 
   geom_histogram(aes(y = ..ncount..)) + 
   geom_density(aes(y = ..scaled..))
library(ggplot2)
smoothedHistogram <- function(dat, y, bins=30, xlabel = y, ...){
  gg <- ggplot(dat, aes_string(y)) + 
    geom_histogram(bins=bins, center = 0.5, stat="bin", 
                   fill = I("midnightblue"), color = "#E07102", alpha=0.8) 
  gg_build <- ggplot_build(gg)
  area <- sum(with(gg_build[["data"]][[1]], y*(xmax - xmin)))
  gg <- gg + 
    stat_density(aes(y=..density..*area), 
                 color="#BCBD22", size=2, geom="line", ...)
  gg$layers <- gg$layers[2:1]
  gg + xlab(xlabel) +  
    theme_bw() + theme(axis.title = element_text(size = 16),
                       axis.text = element_text(size = 12))
}

dat <- data.frame(x = rnorm(10000))
smoothedHistogram(dat, "x")

Другие вопросы по тегам