Наложение кривой "Плотность" на гистограмму, где вертикальная ось - это частота (или счетчик) или относительная частота?
Есть ли способ наложения чего-то аналогичного кривой плотности, когда вертикальная ось является частотой или относительной частотой? (Не фактическая функция плотности, поскольку область не должна интегрироваться в 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 заставил меня задуматься о том, каким будет соответствующий коэффициент масштабирования. Ради потомков, вот результат.
Когда вертикальная ось является частотой (он же число)
Таким образом, масштабный коэффициент для вертикальной оси, измеренный в счетчиках бинов, равен
В этом случае с 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
Когда вертикальная ось является относительной частотой
Используя вышесказанное, мы могли бы написать
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
Когда вертикальная ось - плотность
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")