Editar etiquetas de leyenda (texto) en ggplot

120

He pasado horas buscando en la documentación y en StackOverflow, pero ninguna solución parece resolver mi problema. Cuando lo uso, ggplotno puedo obtener el texto correcto en la leyenda, aunque esté en mi marco de datos. Lo he intentado scale_colour_manual, scale_fill_manualcon diferentes valores para labels=tales como c("T999", "T888")", "cols".

Aquí está mi código:

T999 <- runif(10, 100, 200)
T888 <- runif(10, 200, 300)
TY <- runif(10, 20, 30)
df <- data.frame(T999, T888, TY)


ggplot(data = df, aes(x=T999, y=TY, pointtype="T999")) + 
       geom_point(size = 15, colour = "darkblue") + 
       geom_point(data = df, aes(x=T888, y=TY), colour = 'red', size = 10 ) + 
       theme(axis.text.x = element_text(size = 20), axis.title.x =element_text(size = 20),   axis.text.y = element_text(size = 20)) +
       xlab("Txxx") + ylab("TY [°C]") + labs(title="temperatures", size = 15) + 
       scale_colour_manual(labels = c("T999", "T888"), values = c("darkblue", "red")) +    theme(legend.position="topright")

¡La ayuda seria muy apreciada!

usuario3633161
fuente
8
Eche un vistazo a este tutorial para averiguar con qué formato de datos ggplotestá más satisfecho (largo, no ancho) y para tener una idea de la diferencia entre mapear una aesthetic a una variable en la aesllamada y establecerla fuera aes. Necesita meltsus datos en un formato largo y mapear colour(o fill) en aesla variable relevante.
Henrik

Respuestas:

146

El tutorial que @Henrik mencionó es un excelente recurso para aprender a crear gráficos con el ggplot2paquete.

Un ejemplo con tus datos:

# transforming the data from wide to long
library(reshape2)
dfm <- melt(df, id = "TY")

# creating a scatterplot
ggplot(data = dfm, aes(x = TY, y = value, color = variable)) + 
  geom_point(size=5) +
  labs(title = "Temperatures\n", x = "TY [°C]", y = "Txxx", color = "Legend Title\n") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  theme(axis.text.x = element_text(size = 14), axis.title.x = element_text(size = 16),
        axis.text.y = element_text(size = 14), axis.title.y = element_text(size = 16),
        plot.title = element_text(size = 20, face = "bold", color = "darkgreen"))

esto resulta en:

ingrese la descripción de la imagen aquí

Como lo menciona @ user2739472 en los comentarios: si solo desea cambiar las etiquetas de texto de la leyenda y no los colores de la paleta predeterminada de ggplot, puede usar en scale_color_hue(labels = c("T999", "T888"))lugar de scale_color_manual().

Jaap
fuente
@Sathish Como puede ver, el título del eje y es más pequeño que el título del eje x. Los diferentes tamaños se utilizan para ilustrar las posibilidades y sus consecuencias. Por lo tanto, el código utilizado en la respuesta es correcto en mi opinión.
Jaap
@Sathish Agregando a mi comentario anterior: ¡ciertamente es una opción hacerlo de esa manera! Todo depende de lo que quieras lograr ;-)
Jaap
9
Si solo desea cambiar las etiquetas de texto de la leyenda y no los colores de la paleta predeterminada de ggplot, puede usar en scale_color_hue(labels = c("T999", "T888"))lugar descale_color_manual()
user2739472
1
@ user2739472 Gracias y verdadero. Lo agregaré a mi respuesta.
Jaap
@Sathish Me retrasé, pero arreglé el error tipográfico ahora :-)
Jaap
41

Los títulos de leyenda se pueden etiquetar por estética específica .

Esto se puede lograr usando las funciones guides()o labs()de ggplot2(más aquí y aquí ). Le permite agregar propiedades de guía / leyenda utilizando el mapeo estético.

Aquí hay un ejemplo usando el mtcarsconjunto de datos y labs():

ggplot(mtcars, aes(x=mpg, y=disp, size=hp, col=as.factor(cyl), shape=as.factor(gear))) +
  geom_point() +
  labs(x="miles per gallon", y="displacement", size="horsepower", 
       col="# of cylinders", shape="# of gears")

ingrese la descripción de la imagen aquí

Respondiendo a la pregunta del OP usando guides():

# transforming the data from wide to long
require(reshape2)
dfm <- melt(df, id="TY")

# creating a scatterplot
ggplot(data = dfm, aes(x=TY, y=value, color=variable)) + 
  geom_point(size=5) +
  labs(title="Temperatures\n", x="TY [°C]", y="Txxx") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  guides(color=guide_legend("my title"))  # add guide properties by aesthetic

ingrese la descripción de la imagen aquí

Megatron
fuente
No estoy de acuerdo con eso. Cuando solo se especifica el título, es más fácil especificarlo en los argumentos scale_ ..o labs.
Jaap
Estaba comentando su solución de hace 15 minutos que agregó el título a scale_color_manual(title="...", ...). Veo que lo ha modificado para hacer referencia a la estética del color en labs(). Ofrezco mi solución como alternativa.
Megatron
A partir de ahora, esto parece modificar la leyenda si es un degradado de relleno para que sea más absurdo.
Max Candocia