I have written a function to plot a list of dataframes.
library(dplyr)
library(tidyr)
library(ggplot2)
#function to plot each df in list
func.plot <- function(x){
ggplot(data = x, aes(x = month)) +
geom_line(aes(y = MFI, group = sample), color = "lightgrey", size = 0.5)+
geom_line(aes( y = mean), color = "red", size = 2) +
theme_bw()+
ggtitle("for non-recurrent infections")
}
#apply function to list
lapply(test, func.plot)
I am struggling to get dataframe-specific titles for each plot. I would like each plot to be titled "DATAFRAME NAME for non-recurrent infections".
I have tried a few ideas for the ggtitle line such as
ggtitle(x, "for non-recurrent infections")
ggtitle(paste0(x), "for non-recurrent infections")
However these are not working. Any help would be appreciated.
Also - any tips for printing the outputs side by side (perhaps 8 to a plot) would also be appreciated!
SAMPLE DATA:
CSP1:
structure(list(sample = c(35L, 35L, 35L, 35L, 35L, 35L), month = c(0,
0.25, 1, 2, 3, 4), MFI = c(228.6666667, 160.6666667, 226.6666667,
131.6666667, 170.1666667, 115.1666667), mean = c(1013.04700847142,
1499.62393155462, 697.698717902436, 437.448717901244, 599.012820505269,
619.978632424128)), class = c("grouped_df", "tbl_df", "tbl",
"data.frame"), row.names = c(NA, -6L), groups = structure(list(
month = c(0, 0.25, 1, 2, 3, 4), .rows = structure(list(1L,
2L, 3L, 4L, 5L, 6L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L), .drop = TRUE))
PvRBP2b:
structure(list(sample = c(35L, 35L, 35L, 35L, 35L, 35L), month = c(0,
0.25, 1, 2, 3, 4), MFI = c(18823, 22188, 15356, 7536, 5372, 2177.5
), mean = c(10131.0427347736, 15102.9273501617, 11751.3803417424,
11039.9935895637, 11553.0448715292, 9797.237179345)), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L), groups = structure(list(
month = c(0, 0.25, 1, 2, 3, 4), .rows = structure(list(1L,
2L, 3L, 4L, 5L, 6L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L), .drop = TRUE))
test <- list(CSP1, PvRBP2b)
One option would be to use a named list
(for which I use dplyr::lst
), then use purrr::imap
which passes the name as a second argument to your function and of course add a second argument to your plotting function:
library(dplyr, warn=FALSE)
library(ggplot2)
test <- dplyr::lst(CSP1, PvRBP2b)
func.plot <- function(x, name) {
ggplot(data = x, aes(x = month)) +
geom_line(aes(y = MFI, group = sample), color = "lightgrey", size = 0.5) +
geom_line(aes(y = mean), color = "red", size = 2) +
theme_bw() +
ggtitle(paste(name, "for non-recurrent infections"))
}
purrr::imap(test, func.plot)
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#> ℹ Please use `linewidth` instead.
#> $CSP1
#>
#> $PvRBP2b