1

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()

1 Answer 1

3
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)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.