Reputation: 47
I am creating a list of plots (without legend) by using a loop in ggplot2. Then I created a legend separately and trying to print a combined plots by using grid.arrange and grobs function. It creates the combined plot but without the legend. Could anyone please help to solve the problem?
I am attaching my code here:
df1<-data.frame(x=1:10,y1=rnorm(10),y2=rnorm(10),y3=rnorm(10),y4=rnorm(10),y5=rnorm(10))
df2 <- melt(df1,id.vars="x")
plot.list = list()
for (i in 1:3){
p <- ggplot(df2, aes(x=x, y=value)) +
geom_line(aes(colour=variable, group=variable))+
theme(legend.position='none')
plot.list[[i]] = p
}
temp_legend <- ggplot(df2, aes(x=x, y=value)) +
geom_line(aes(colour=variable, group=variable)) +
scale_color_manual("",labels = c("Observed","3d","5d","7d","10d"), values = c("black", "limegreen","blue","tan1","red3")) +
theme(legend.direction = "horizontal",
legend.position = "bottom")
library(gridExtra)
# create get_legend function
get_legend<-function(myggplot){
tmp <- ggplot_gtable(ggplot_build(myggplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)
}
# Extract legend using get_legend function
legend <- get_legend(temp_legend)
# png export
png("Output.png", width = 5, height = 6.35, units = 'in', res = 300)
grid.arrange(grobs=plot.list,legend,
ncol=1, nrow = 4,
widths = 6, heights = c(2,2,2,0.35))
dev.off()
Upvotes: 1
Views: 1051
Reputation: 77096
grid.arrange(grobs=c(plot.list,list(legend)),
ncol=1, heights = c(2,2,2,0.35))
or simply
grid.arrange(grobs=plot.list, ncol=1, bottom = legend)
Upvotes: 3