los ggplot etiquetas escala ejes como cambiar r ggplot2 legend

etiquetas - como cambiar la escala de los ejes en r ggplot



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

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


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"))


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 .


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.


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 etiquetas con espacios, como lo sugieren user2568648 y SaschaH .


La próxima versión ggplot2 v3.0.0 tiene opciones para modificar legend.spacing.x , legend.spacing.y y legend.text .

Para instalar, ejecuta las siguientes líneas:

install.packages("devtools") devtools::install_github("tidyverse/ggplot2")

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).


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

#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)

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'' ))

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

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"))


Usa cualquiera de estos

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