在 ggplot 中通过 str_detect class 添加多个 geom_density 行

add multiple geom_density lines by str_detect class in ggplot

我希望能够在 ggplot 中的密度图上叠加多条线,以便为检测为子字符串的多个 classes 绘制距离?

dat<- data.frame(Image = c(1,1,1,2,2,2,3,3,3,4,4,4), 
                 Class = c("A","A:B","A:C","A:D","D:C","B","B:C","A:B","C:D","A:B:C","A:B:C ","A:B:C:D"),
                 Distance = c(1,5,6,2,4,8,9,1,2,3,7,8))

例如,我希望包含 class“A”或“B”的任何子字符串的距离在同一图上显示为单独的行。我该怎么做?

dat %>% filter(str_detect(Class,"A")) %>% 
  ggplot(aes(Distance))+
    geom_density()
dat %>% filter(str_detect(Class,"B")) %>% 
  ggplot(aes(Distance))+
    geom_density()

这可以通过使用多个 geom_density 层来实现,您可以在其中将每个密度层传递给过滤后的数据集。为了减少代码重复,我的方法使用辅助函数和 lapply 通过遍历要包含在图中的模式向量来添加这些密度层:

dat<- data.frame(Image = c(1,1,1,2,2,2,3,3,3,4,4,4), 
                 Class = c("A","A:B","A:C","A:D","D:C","B","B:C","A:B","C:D","A:B:C","A:B:C ","A:B:C:D"),
                 Distance = c(1,5,6,2,4,8,9,1,2,3,7,8))

library(dplyr)
library(stringr)
library(ggplot2)

make_layer <- function(pattern) {
  dat <- dat %>% 
    filter(str_detect(Class, pattern))
  geom_density(data = dat, aes(color = pattern))
}

patterns <- c("A", "B", "A:B:C")

ggplot(mapping = aes(Distance)) +
  lapply(patterns, make_layer)