从数据帧列表创建的每个包装图的标题

Titles for each wrapped plots created from a list of dataframes

我有一个数据帧列表 (datalist) 并且我在 ggplot 中用 geom_line 创建了包装图但是我很难为每个图分配它的标题(BA0、OG0、ON0 等)。 ).

List of 27  
$ BA0  :'data.frame':   14587 obs. of  2 variables:
   ..$ V1  : int [1:14587] 1 2 1 1 2 1 2 1 1 1 ...
   ..$ V2  : int [1:14587] 43 45 46 48 49 53 55 56 57 58 ...

  $ OG0   :'data.frame':    7925 obs. of  2 variables:
   ..$ V1  : int [1:7925] 1 1 1 1 1 2 5 7 4 10 ...
   ..$ V2  : int [1:7925] 43 53 84 88 90 91 92 93 94 95 ...

  $ ON0   :'data.frame':    8347 obs. of  2 variables:
   ..$ V1  : int [1:8347] 1 2 10 6 6 3 11 6 6 6 ...
   ..$ V2  : int [1:8347] 96 97 98 99 100 101 102 103 104 105 ...

这是代码

names(datalist) <- c("BA0", "OG0", "ON0", ...)

graph<-lapply(datalist,function(x)      
  p<-ggplot(x,aes(x= V2,y= V1)) +
    geom_line(colour = "blue") + 
    labs(x = "read length", y="occurences") +
    scale_x_continuous(n.breaks =10) +
    scale_y_continuous(n.breaks = 8) 
) 
wrap_plots(graph)

我尝试添加到 p 选项:

ggtitle(datalist$file) ## here I added an extra column to each df corresponding to the names: BA0, OG0, ON0 etc..
ggtitle(names(datalist))
labs(title = names(datalist))

但我只能为每个地块设置相同的标题 BA0,这是列表的第一个元素

如何添加正确的标题?或者也许有更好的方法来创建这一系列的情节?

谢谢

您可以 enframe 将数据帧列表放入 table 并使用函数 dplyr::mutate 创建一个新列 title。然后,您可以使用 purrr::pmap 将列元素映射到创建绘图的函数公式。最后,绘图列可以输入 patchwork::wrap_plots:

library(tidyverse)
library(patchwork)

data <-
  list(
    iris1 = iris,
    iris2 = iris
  )

str(data)
#> List of 2
#>  $ iris1:'data.frame':   150 obs. of  5 variables:
#>   ..$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>   ..$ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>   ..$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>   ..$ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>   ..$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
#>  $ iris2:'data.frame':   150 obs. of  5 variables:
#>   ..$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>   ..$ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>   ..$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>   ..$ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>   ..$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

data %>%
  enframe() %>%
  mutate(
    title = paste0("Fancy title ", name),
    plt = list(title, value) %>% pmap(~ {
      .y %>%
        ggplot(aes(Sepal.Length, Sepal.Width)) +
        geom_line() +
        labs(title = .x)
    })
  ) %>%
  pull(plt) %>%
  wrap_plots()

reprex package (v2.0.0)

于 2022-05-25 创建

或者,也可以创建一个用于绘图的显式函数:

my_plot <- function(title, data) {
  data %>%
    ggplot(aes(Sepal.Length, Sepal.Width)) +
    geom_line() +
    labs(title = title)
}

data %>%
  enframe() %>%
  mutate(
    title = paste0("Fancy title ", name),
    plt = list(title, value) %>% pmap(my_plot)
  )
#> # A tibble: 2 × 4
#>   name  value          title             plt   
#>   <chr> <list>         <chr>             <list>
#> 1 iris1 <df [150 × 5]> Fancy title iris1 <gg>  
#> 2 iris2 <df [150 × 5]> Fancy title iris2 <gg>

使用 facet_wrap 可能比较合适。你可以试试

library(data.table)
library(ggplot2)

#from list to dataframe, adding name of list item as column
dt <- rbindlist(datalist, idcol = TRUE)

#plot using facet_wrap
ggplot(dt,aes(x= V2,y= V1)) +
  geom_line(colour = "blue") + 
  labs(x = "read length", y="occurences") +
  scale_x_continuous(n.breaks =10) +
  scale_y_continuous(n.breaks = 8) +
  facet_wrap(~.id)