从数据帧列表创建的每个包装图的标题
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)
我有一个数据帧列表 (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)