ggplot - Multiple legends arrangement
The idea is to create each plot individually (color
, fill
& size
) then extract their legends and combine them in a desired way together with the main plot.
See more about the cowplot
package here & the patchwork
package here
library(ggplot2)library(cowplot) # get_legend() & plot_grid() functionslibrary(patchwork) # blank plot: plot_spacer()data <- seq(1000, 4000, by = 1000)colorScales <- c("#c43b3b", "#80c43b", "#3bc4c4", "#7f3bc4")names(colorScales) <- data# Original plot without legendp0 <- ggplot() + geom_point(aes(x = data, y = data, color = as.character(data), fill = data, size = data), shape = 21 ) + scale_color_manual( name = "Legend 1", values = colorScales ) + scale_fill_gradientn( name = "Legend 2", limits = c(0, max(data)), colours = rev(c("#000000", "#FFFFFF", "#BA0000")), values = c(0, 0.5, 1) ) + scale_size_continuous(name = "Legend 3") + theme(legend.direction = "vertical", legend.box = "horizontal") + theme(legend.position = "none")# color onlyp1 <- ggplot() + geom_point(aes(x = data, y = data, color = as.character(data)), shape = 21 ) + scale_color_manual( name = "Legend 1", values = colorScales ) + theme(legend.direction = "vertical", legend.box = "vertical")# fill onlyp2 <- ggplot() + geom_point(aes(x = data, y = data, fill = data), shape = 21 ) + scale_fill_gradientn( name = "Legend 2", limits = c(0, max(data)), colours = rev(c("#000000", "#FFFFFF", "#BA0000")), values = c(0, 0.5, 1) ) + theme(legend.direction = "vertical", legend.box = "vertical")# size onlyp3 <- ggplot() + geom_point(aes(x = data, y = data, size = data), shape = 21 ) + scale_size_continuous(name = "Legend 3") + theme(legend.direction = "vertical", legend.box = "vertical")
Get all legends
leg1 <- get_legend(p1)leg2 <- get_legend(p2)leg3 <- get_legend(p3)# create a blank plot for legend alignment blank_p <- plot_spacer() + theme_void()
Combine legends
# combine legend 1 & 2leg12 <- plot_grid(leg1, leg2, blank_p, nrow = 3)# combine legend 3 & blank plotleg30 <- plot_grid(leg3, blank_p, blank_p, nrow = 3)# combine all legendsleg123 <- plot_grid(leg12, leg30, ncol = 2)
Put everything together
final_p <- plot_grid(p0, leg123, nrow = 1, align = "h", axis = "t", rel_widths = c(1, 0.3))print(final_p)
Created on 2018-08-28 by the reprex package (v0.2.0.9000).