#' Creating a common legend for subplots on a separate panel
#'
#' @param x
#' Location of the legend along the x-axis. Default is the middle origin (0.5).
#' @param y
#' Location of the legend along the y-axis. Default is the middle origin (0.5).
#' @param title
#' Title of the legend. Input should be string
#' @param direction
#' Direction of the legend: 'horizontal' or 'vertical'.
#' @param border
#' If set TRUE, border around the legend will be created.
#' If set FALSE, the border will be removed.
#' @param legend_spacing
#' Spacing within the legend.
#' @param border_color
#' Color of the legend border
#' @param textRatio
#' Size of the text relative to the plot's default. It has been set to 1.2. The larger
#' the textRatio, the larger the texts in the legend.
#'
#' @return
#' It prints a legend on a blank plot. It can be used to create
#' a common legend for subplots.
#' @export
#'
#' @importFrom cowplot theme_nothing
#'
#' @examples
#' library(ggplot2)
#' library(smplot2)
#' ggplot(data = mtcars, mapping = aes(
#' x = drat, y = mpg,
#' fill = as.factor(cyl)
#' )) +
#' geom_point(shape = 21, color = "white", size = 3) +
#' sm_common_legend(
#' x = .5, y = 0.5, direction = "horizontal",
#' border = FALSE
#' )
#'
sm_common_legend <- function(x = 0.5, y = 0.5, title = FALSE, direction = "vertical",
border = TRUE, legend_spacing = 0.5, border_color = "black",
textRatio = 1) {
blank <- do.call("annotate", list(
geom = "rect", ymin = -Inf, ymax = Inf, xmin = -Inf, xmax = Inf,
fill = "white"
))
blank2 <- theme_nothing()
box <- do.call("theme", list(
legend.spacing.y = unit(legend_spacing, "mm"),
legend.spacing.x = unit(legend_spacing, "mm"),
aspect.ratio = 1,
legend.background = element_blank(),
legend.box.background = element_rect(colour = border_color)
))
if (title == TRUE) {
location <- do.call("theme", list(
legend.position = c(x, y), legend.direction = direction,
legend.text = element_text(size = rel(textRatio)),
legend.title = element_text(size = rel(textRatio))
))
} else {
location <- do.call("theme", list(
legend.position = c(x, y), legend.direction = direction,
legend.text = element_text(size = rel(textRatio)),
title = element_blank()
))
}
if (border == FALSE) {
box <- NULL
}
list(blank, blank2, location, box)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.