Reputation: 129
I have a number of objects which I would like to plot together on one page, with a separate title for each. At the moment, I have a vector of plot titles which I feed into ggtitle within lapply, but it adds only the first entry of this vector to each plot.
A quick and ugly minimal example is below:
library(ggplot2)
library(gridExtra)
#My 'data'
A.a <- rnorm(10)
A.b <- rnorm(30)
lmnames <- ls(pattern = "A.*")
titlenames <- c("Plot A", "Plot B")
plotlist <- list()
#I have a more complex ggplot function in reality, but I'm using qplot here as a placeholder.
plotlist <- lapply(lmnames, FUN=function(x,y){qplot(get(x)) + ggtitle(y)}, y=titlenames)
grid.arrange(grobs = plotlist)
You can see, both plots are labelled "Plot A". I'd like to have each plot labelled accordingly. Can anyone help me see what I'm missing here? Thanks in advance.
Upvotes: 3
Views: 1492
Reputation: 77096
Looping over multiple variables is often cleaner with mapply,
library(ggplot2)
library(gridExtra)
dl <- list("Plot A" = rnorm(10), "Plot B" = rnorm(10))
plot_fun <- function(x, y) qplot(x) + ggtitle(y)
grid.arrange(grobs = Map(plot_fun, x = dl, y = names(dl)))
Upvotes: 2
Reputation: 10352
Your problem is, that in all your plots, your title is "Plot A" "Plot B", see plotlist[[1]]$labels$title
.
A working code is the following:
plotlist <- lapply(1:length(lmnames), function(x){
qplot(get(lmnames[x])) + ggtitle(titlenames[x])
})
I'm sure there are more elegant solutions. But this one will work.
Regards, J_F
Upvotes: 4
Reputation: 2263
This works fine:
plotlist <- lapply(1:2, FUN=function(i){qplot(get(lmnames[i])) + ggtitle(titlenames[i])})
Or this:
plotlist <- apply(data.frame(lmnames, titlenames), 1, FUN=function(x){qplot(get(x[1])) + ggtitle(x[2])})
The issue is that in both iteration, only the first value of y=titlenames
is read in
Upvotes: 0