¿Hay alguna manera de cambiar el espacio entre los elementos de la leyenda en ggplot2?

¿Hay alguna manera de cambiar el espacio entre los elementos de la leyenda en ggplot2? Actualmente tengo

legend.position ="top" 

que produce automáticamente una leyenda horizontal. Sin embargo, el espacio de los elementos está muy cerca y me pregunto cómo separarlos más.

Creo que la mejor opción es usar guide_legend dentro de las guides :

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

Tenga en cuenta el uso de default.unit , no es necesario cargar el paquete de grid .

Una solución simple que uso para agregar espacio en leyendas horizontales, simplemente agregue espacios en las tags (vea el extracto a continuación):

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

Ahora que opts está en desuso en el paquete ggplot2 , se debe usar el theme función en su lugar:

 library(grid) # for unit() ... + theme(legend.key.height=unit(3,"line")) ... + theme(legend.key.width=unit(3,"line")) 

ggplot2 v3.0.0 lanzado en julio de 2018 tiene opciones de trabajo para modificar legend.spacing.x , legend.spacing.y y legend.text .

Ejemplo: boost el espacio horizontal entre las teclas de leyenda

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

Ejemplo: Mueva las tags de las teclas de leyenda hacia abajo y aumente el espaciado vertical

 ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + geom_bar() + coord_flip() + scale_fill_viridis_d("Cyl") + 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)) 

Ejemplo: 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(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, label = TRUE, draw.ulim = TRUE, draw.llim = TRUE, # draw border around the gradient legend frame.colour = "black", ticks = TRUE, barwidth = 15, barheight = 1.5, direction = 'horizontal')) 

Creado en 2018-05-30 por el paquete reprex (v0.2.0).

La forma de agregar espacio entre las entradas en una leyenda horizontal debe ser ajustar los márgenes del elemento del tema legend.text . Por ejemplo, para agregar 24pt de espacio a la derecha de cada etiqueta de leyenda, para un objeto ggplot p :

 p + theme(legend.text = element_text(margin = margin(r = 24, unit = "pt"))) 

Lamentablemente, lo anterior no funciona , ya que legend.text no responde a los valores de margin pasados ​​a element_text (tampoco lo hace legend.title ). Este es un error conocido: https://github.com/tidyverse/ggplot2/issues/1502

Hasta que se solucione el error, la opción más simple para agregar espacio entre elementos de leyenda parece ser rellenar las tags con espacios, como lo sugieren user2568648 y SaschaH .

Del trabajo de Koshke en ggplot2 y su blog (blog de Koshke )

 ... + theme(legend.key.height=unit(3,"line")) # Change 3 to X ... + theme(legend.key.width=unit(3,"line")) # Change 3 to X 

Escriba theme_get() en la consola para ver otros atributos de leyenda editables.

Parece que el mejor enfoque (en 2018) es usar legend.key.size bajo el objeto del theme . (por ejemplo, ver aquí ).

 #Set-up: library(ggplot2) library(gridExtra) gp <- ggplot(data = mtcars, aes(mpg, cyl, colour = factor(cyl))) + geom_point() 

Esto es realmente fácil si estás usando theme_bw() :

  gpbw <- gp + theme_bw() #Change spacing size: g1bw <- gpbw + theme(legend.key.size = unit(0, 'lines')) g2bw <- gpbw + theme(legend.key.size = unit(1.5, 'lines')) g3bw <- gpbw + theme(legend.key.size = unit(3, 'lines')) grid.arrange(g1bw,g2bw,g3bw,nrow=3) 

enter image description here

Sin embargo, esto no funciona tan bien si no (por ejemplo, si necesita el fondo gris en su símbolo de leyenda):

  g1 <- gp + theme(legend.key.size = unit(0, 'lines')) g2 <- gp + theme(legend.key.size = unit(1.5, 'lines')) g3 <- gp + theme(legend.key.size = unit(3, 'lines')) grid.arrange(g1,g2,g3,nrow=3) #Notice that the legend symbol squares get bigger (that's what legend.key.size does). #Let's [indirectly] "control" that, too: gp2 <- g3 g4 <- gp2 + theme(legend.key = element_rect(size = 1)) g5 <- gp2 + theme(legend.key = element_rect(size = 3)) g6 <- gp2 + theme(legend.key = element_rect(size = 10)) grid.arrange(g4,g5,g6,nrow=3) #see picture below, left 

Observe que los cuadrados blancos comienzan a bloquear el título de la leyenda (y eventualmente el gráfico en sí si seguimos aumentando el valor).

  #This shows you why: gt <- gp2 + theme(legend.key = element_rect(size = 10,color = 'yellow' )) 

enter image description here

No he encontrado una solución alternativa para solucionar el problema anterior ... ¡Déjame saber en los comentarios si tienes una idea y la actualizaré en consecuencia!

  • Me pregunto si hay alguna manera de volver a capas cosas usando $layers ...

Usa cualquiera de estos

 legend.spacing = unit(1,"cm") legend.spacing.x = unit(1,"cm") legend.spacing.y = unit(1,"cm")