Is there a way to change the spacing between legend items in ggplot2? Is there a way to change the spacing between legend items in ggplot2? r r

Is there a way to change the spacing between legend items in ggplot2?


ggplot2 v3.0.0 released in July 2018 has working options to modify legend.spacing.x, legend.spacing.y and legend.text.

Example: Increase horizontal spacing between legend keys

library(ggplot2)ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) +   geom_bar() +  coord_flip() +  scale_fill_brewer("Cyl", palette = "Dark2") +  theme_minimal(base_size = 14) +  theme(legend.position = 'top',         legend.spacing.x = unit(1.0, 'cm'))

Note: If you only want to expand the spacing to the right of the legend text, use stringr::str_pad()

Example: Move the legend key labels to the bottom and increase vertical spacing

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) +   geom_bar() +  coord_flip() +  scale_fill_brewer("Cyl", palette = "Dark2") +  theme_minimal(base_size = 14) +  theme(legend.position = 'top',         legend.spacing.x = unit(1.0, 'cm'),        legend.text = element_text(margin = margin(t = 10))) +  guides(fill = guide_legend(title = "Cyl",                             label.position = "bottom",                             title.position = "left", title.vjust = 1)) 

Example: for scale_fill_xxx & guide_colorbar

ggplot(mtcars, aes(mpg, wt)) +  geom_point(aes(fill = hp), pch = I(21), size = 5)+  scale_fill_viridis_c(guide = FALSE) +  theme_classic(base_size = 14) +  theme(legend.position = 'top',         legend.spacing.x = unit(0.5, 'cm'),        legend.text = element_text(margin = margin(t = 10))) +  guides(fill = guide_colorbar(title = "HP",                               label.position = "bottom",                               title.position = "left", title.vjust = 1,                               # draw border around the legend                               frame.colour = "black",                               barwidth = 15,                               barheight = 1.5)) 


For vertical legends, settinglegend.key.size only increases the size of the legend keys, not the vertical space between them

ggplot(mtcars) +  aes(x = cyl, fill = factor(cyl)) +  geom_bar() +  scale_fill_brewer("Cyl", palette = "Dark2") +  theme_minimal(base_size = 14) +  theme(legend.key.size = unit(1, "cm"))

In order to increase the distance between legend keys, modification of the legend-draw.r function is needed. See this issue for more info

# function to increase vertical spacing between legend keys# @clauswilkedraw_key_polygon3 <- function(data, params, size) {  lwd <- min(data$size, min(size) / 4)    grid::rectGrob(    width = grid::unit(0.6, "npc"),    height = grid::unit(0.6, "npc"),    gp = grid::gpar(      col = data$colour,      fill = alpha(data$fill, data$alpha),      lty = data$linetype,      lwd = lwd * .pt,      linejoin = "mitre"    ))}### this step is not needed anymore per tjebo's comment below### see also: https://ggplot2.tidyverse.org/reference/draw_key.html# register new key drawing function, # the effect is global & persistent throughout the R session# GeomBar$draw_key = draw_key_polygon3ggplot(mtcars) +  aes(x = cyl, fill = factor(cyl)) +  geom_bar(key_glyph = "polygon3") +  scale_fill_brewer("Cyl", palette = "Dark2") +  theme_minimal(base_size = 14) +  theme(legend.key = element_rect(color = NA, fill = NA),        legend.key.size = unit(1.5, "cm")) +  theme(legend.title.align = 0.5)


I think the best option is to use guide_legend within guides:

p + guides(fill=guide_legend(                 keywidth=0.1,                 keyheight=0.1,                 default.unit="inch")      )

Note the use of default.unit , no need to load grid package.


A simple fix that I use to add space in horizontal legends, simply add spaces in the labels (see extract below):

  scale_fill_manual(values=c("red","blue","white"),                    labels=c("Label of category 1          ",                             "Label of category 2          ",                             "Label of category 3"))