leyenda ggplot2 hacia abajo y horizontal

109

¿Cómo puedo mover una leyenda de ggplot2 a la parte inferior del gráfico y girarla horizontalmente?

Código de muestra:

library(reshape2) # for melt
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend())

Resultado deseado (aproximado): ingrese la descripción de la imagen aquí

Tyler Rinker
fuente
2
Después de 7 años y 8 meses, finalmente descubrí cómo obtener el resultado deseado para esta pregunta :) Desplácese hacia abajo hasta la segunda respuesta.
Arthur Yip

Respuestas:

146

Si desea mover la posición de la leyenda, utilice el siguiente código:

library(reshape2) # for melt
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend()) +
    theme(legend.position="bottom")

Esto debería darle el resultado deseado. Leyenda en la parte inferior

Shreyas Karnik
fuente
2
¿Sabes si es posible dibujar una barra de leyenda continua en la parte inferior? (así que no con el número en el medio, sino en la parte superior). Gracias.
Janvb
3
Con corriente ggplot, esto me da la advertencia 'opts' is deprecated. Use 'theme' instead. (Deprecated; last used in version 0.9.1). Sustitución optspor themeobras.
krlmlr
Sí, anticipo que habrá un cambio en el funcionamiento interno deggplot
Shreyas Karnik
10
Es una mala práctica utilizar elementos depreciados. Puede hacerlo usando el tema exactamente de la misma manera:+ theme(legend.position='bottom')
antes del
desafortunadamente, existe cierta ambigüedad cuando los números y los colores están uno al lado del otro; vea mi respuesta a continuación en varios intentos de mejorar esto.
Arthur Yip
37

A continuación, se explica cómo crear el resultado deseado:

library(reshape2); library(tidyverse)
melt(outer(1:4, 1:4), varnames = c("X1", "X2")) %>%
ggplot() + 
  geom_tile(aes(X1, X2, fill = value)) + 
  scale_fill_continuous(guide = guide_legend()) +
  theme(legend.position="bottom",
        legend.spacing.x = unit(0, 'cm'))+
  guides(fill = guide_legend(label.position = "bottom"))

Creado el 2019-12-07 por el paquete reprex (v0.3.0)


Editar: ya no hay necesidad de estas opciones imperfectas, pero las dejo aquí como referencia.

Dos opciones imperfectas que no te dan exactamente lo que estabas pidiendo, pero bastante cercanas (al menos unirán los colores).

library(reshape2); library(tidyverse)
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend()) +
 theme(legend.position="bottom", legend.direction="vertical")

p1 + scale_fill_continuous(guide = "colorbar") + theme(legend.position="bottom")

Creado el 28/02/2019 por el paquete reprex (v0.2.1)

Arthur Yip
fuente
Si bien esto teóricamente puede responder a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia.
Rohit Gupta
Ahora he mejorado mi respuesta para proporcionar dos soluciones imperfectas
Arthur Yip