如何使用ggplot在一个区间内填充密度图?
How to fill density plot within an interval with ggplot?
下面的代码用曲线区域下方的颜色填充两个密度中的每一个:
library(ggplot2)
#fake data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 2, 0.5))
, group = rep(c("C", "P"), each = 100))
#fill the area under the curve
ggplot(dat, aes(x = dens, fill = group)) + geom_density(alpha = 0.75)
如何实现以下两个目标?
1) 只在指定区间内填充每条曲线。例如,组 'C' 的区间 [-1.5, 2.0] 和组 'P' 的区间 [0.5, 2.8]。
2) 为每个密度添加一个垂直段(从 x 轴到曲线)。例如,组 'C' 的 x=0.2 和组 'P'.
的 x=1.9
为了让你大吃一惊,这是你的第一个问题:
library(dplyr)
library(purrr)
library(tidyr)
library(ggplot2)
as.data.frame.density <- function(x) data.frame(x = x$x, y = x$y)
densities <- dat %>%
group_nest(group) %>%
mutate(dens = map(data, ~as.data.frame(density(.$dens)))) %>%
unnest(dens)
ggplot(densities, aes(x = x, y = y, group = group)) +
geom_density(stat = 'identity') +
geom_density(
aes(fill = group),
. %>% filter((group == "C" & between(x, -1.5, 2.0)) | (group == "P" & between(x, 0.5, 2.8))),
stat = 'identity',
alpha = 0.75
)
还有其他计算每组密度的方法,使用 dplyr
只是一种方法。为两个密度估计设置一个相等的带宽可能是好的。
添加段与此方法类似,您只需要在 densities
data.frame.
中找到正确的值
下面的代码用曲线区域下方的颜色填充两个密度中的每一个:
library(ggplot2)
#fake data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 2, 0.5))
, group = rep(c("C", "P"), each = 100))
#fill the area under the curve
ggplot(dat, aes(x = dens, fill = group)) + geom_density(alpha = 0.75)
如何实现以下两个目标?
1) 只在指定区间内填充每条曲线。例如,组 'C' 的区间 [-1.5, 2.0] 和组 'P' 的区间 [0.5, 2.8]。
2) 为每个密度添加一个垂直段(从 x 轴到曲线)。例如,组 'C' 的 x=0.2 和组 'P'.
的 x=1.9为了让你大吃一惊,这是你的第一个问题:
library(dplyr)
library(purrr)
library(tidyr)
library(ggplot2)
as.data.frame.density <- function(x) data.frame(x = x$x, y = x$y)
densities <- dat %>%
group_nest(group) %>%
mutate(dens = map(data, ~as.data.frame(density(.$dens)))) %>%
unnest(dens)
ggplot(densities, aes(x = x, y = y, group = group)) +
geom_density(stat = 'identity') +
geom_density(
aes(fill = group),
. %>% filter((group == "C" & between(x, -1.5, 2.0)) | (group == "P" & between(x, 0.5, 2.8))),
stat = 'identity',
alpha = 0.75
)
还有其他计算每组密度的方法,使用 dplyr
只是一种方法。为两个密度估计设置一个相等的带宽可能是好的。
添加段与此方法类似,您只需要在 densities
data.frame.