Pregunta ¿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.


74
2017-07-06 17:26


origen


Respuestas:


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

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

Tenga en cuenta el uso de default.unit , no hay necesidad de cargar grid paquete.


48
2017-07-15 06:03



Una solución simple que uso para agregar espacio en leyendas horizontales, simplemente agregue espacios en las etiquetas (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"))

37
2018-03-07 14:45



Ahora eso opts está en desuso en ggplot2 paquete, función theme debería usarse en su lugar:

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

30
2017-11-17 11:29



La forma de agregar espacio entre entradas en una leyenda horizontal debería ser para 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 margin valores 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 espacios entre elementos de leyenda parece ser rellenar las etiquetas con espacios, como lo sugiere user2568648 y SaschaH.


10
2018-03-21 22:36



Del trabajo de Koshke en ggplot2 y su blog (El 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

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


10
2017-07-06 18:36



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: aumentar 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 etiquetas 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).


8
2018-05-31 02:39



Parece que el mejor enfoque (en 2018) es usar legend.key.size bajo la theme objeto. (p. ej., ver aquí)

#Set-up:
    library(ggplot2)
    library(gridExtra)

    gp <- ggplot(data = mtcars, aes(mpg, cyl, colour = factor(cyl))) +
        geom_point()

Esto es muy 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 de otra manera (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 actualizaré en consecuencia!

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

3
2018-05-29 22:40



Usa cualquiera de estos

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

2
2017-11-26 09:30