Cómo cambiar el título de la leyenda en ggplot


300

Tengo la siguiente trama como a continuación. Fue creado con este comando:

library(ggplot2)

df <- data.frame(cond = factor(rep(c("A", "B"), each = 200)), 
                 rating = c(rnorm(200), rnorm(200, mean=.8)))

ggplot(df, aes(x=rating, fill=cond)) + 
geom_density(alpha = .3) +
xlab("NEW RATING TITLE") +
ylab("NEW DENSITY TITLE")

Ahora lo siguiente que quiero hacer es modificar el título de la leyenda de cond a NEW LEGEND TITLE .

Entonces, lo que hice fue agregar la siguiente línea y agregar el final del código anterior:

+labs(colour="NEW LEGEND TITLE")

Pero no funciona. ¿Cuál es la forma correcta de hacerlo?

ingrese la descripción de la imagen aquí


110
labs(fill="xyz")debe hacer
baptiste

1
@baptiste Volví a esta pregunta varias veces sin notar tu comentario, ¿podrías escribirlo como respuesta? En mi opinión, es la solución más simple y merece un reconocimiento
User632716

3
@ User632716 ya está en la respuesta de alguien a continuación
baptiste el

77
no funciona ...
shenglih

1
Para aquellos que buscan una respuesta que implique tramas con múltiples geom_declaraciones, recomiendo la respuesta en stackoverflow.com/a/38485985/1169233 , es la única que funcionó para mí.
Waldir Leoncio

Respuestas:


348

Esto debería funcionar:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
p <- p + guides(fill=guide_legend(title="New Legend Title"))

(o alternativamente)

p + scale_fill_discrete(name = "New Legend Title")

10
Otra alternativa esp$labels$fill <- "New Legend Title"
Alex Holcombe

3
¿Cuál es la diferencia entre guías y scale_fill_discrete?
Medhat

18
p$labels$fillNo funcionó para mí. Con ggplot2_2.1.0yo usop$labels$colour <- "New legend title"
ClementWalter

44
p$labels$fill es agradable, pero si está utilizando más de una variable en estética (tipo de línea, color, forma) en aes, debe cambiarlas para cada una por separado.
discipulus

226

No profundicé mucho en esto, pero porque usaste fill = cond en ggplot (),

 + labs(color='NEW LEGEND TITLE') 

Puede que no haya funcionado. Sin embargo, si reemplaza el color por relleno , ¡funciona!

+ labs(fill='NEW LEGEND TITLE') 

Esto funcionó para mí en ggplot2_2.1.0


20
Creo que esta es la respuesta más estricta, hace exactamente lo que OP pide con una línea extra como máximo
Leo

3
tanto color = como relleno = deberían funcionar. Esta es la respuesta "correcta" a la pregunta, OMI
Dan

3
si el color de relleno funcionaría depende de a qué "cond" (o grupo en otros casos) se le asigne realmente. Se puede encontrar una buena explicación en cookbook-r.com/Graphs/Legends_(ggplot2)
user1442363

3
Esta es la mejor respuesta.
Akshay Gaur

1
Nota: en ggplot2 3.0+ esta solución no funcionó: la resolvió porp + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus el

39

Como tienes dos densidades, imagino que quizás quieras establecer tus propios colores scale_fill_manual.

Si es así, puedes hacer:

df <- data.frame(x=1:10,group=c(rep("a",5),rep("b",5)))

legend_title <- "OMG My Title"

ggplot(df, aes(x=x, fill=group)) + geom_density(alpha=.3) +   
    scale_fill_manual(legend_title,values=c("orange","red"))

ingrese la descripción de la imagen aquí


27

Ninguno de los códigos anteriores funcionó para mí.

Esto es lo que encontré y funcionó.

labs(color = "sale year")

También puede dar un espacio entre el título y la pantalla agregando \nal final.

labs(color = 'sale year\n")


2
¿Cómo es esto diferente a esta respuesta ?
merv

3
Sí, probé todos los ejemplos anteriores y este es el único que funcionó para mí. ¡Gracias!
SummerEla

¿Cómo funcionaría esto dada la pregunta original de la publicación, parece que en filllugar de color(o colour) es necesario? Dado el momento de la pregunta, es posible que esté ggplot2relacionada con la versión.
Steve

1
@merv La principal diferencia es que este realmente funciona.
Luís de Sousa

16

Como en el código que usó ggplot(data, fill= cond)para crear el histograma, debe agregar el título de la leyenda usando también "llenar" en la sección de etiqueta, es decir +labs(fill="Title name"). Si estaba usando un tipo diferente de diagrama donde el código era ggplot (data, color = cond), entonces podría usarlo +labs(colour= "Title Name"). En resumen, el argumento de laboratorio debe coincidir con el argumento aes.

Solía + guides(fill=guide_legend("my awesome title"))cambiar el título de la leyenda en las parcelas geom_bar pero no parecía funcionar para geom_point.


..., pero para geom_point(), esto funciona para mí:guides(color=guide_legend("Type:"))
knb

1
@knb, su método funciona:guides(color=guide_legend("Score Ranking:"))
bmc

1
¿Cómo es esto diferente de esta respuesta ?
merv

6

Hay otra respuesta muy simple que puede funcionar para algunos gráficos simples.

Simplemente agregue una llamada a guide_legend () en su gráfico.

ggplot(...) + ... + guide_legend(title="my awesome title")

Como se muestra en los muy buenos documentos de ggplot .

Si eso no funciona, puede configurar con mayor precisión los parámetros de su guía con una llamada a guías :

ggplot(...) + ... + guides(fill=guide_legend("my awesome title"))

También puede variar la forma / color / tamaño especificando también estos parámetros para su llamada guides.


26
Esto no funcionó para mí, pero qplot(…) + guides(color=guide_legend(title="sale year"))funcionó
Arnaud A

3

Solo para agregar a la lista (las otras opciones aquí no funcionaron para mí), también puede usar la función update_labels para ggplot:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
update_labels(p, list(colour="MY NEW LEGEND TITLE")

Esto también le permitirá cambiar las etiquetas de los ejes xyy, con líneas separadas:

update_labels(p, list(x="NEW X LABEL",y="NEW Y LABEL")

2

Noté que hay dos formas de cambiar / especificar legend.title para ggboxplot ():

library(ggpubr)

bxp.defaultLegend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                               color = "dose", palette = "jco")

# Solution 1, setup legend.title directly in ggboxplot()
bxp.legend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                 color = "dose", palette = "jco", legend.title="Dose (mg)")

# Solution 2: Change legend title and appearnace in ggboxplot() using labs() and theme() option:
plot1 <-  bxp.defaultLegend + labs(color = "Dose (mg)") +
  theme(legend.title = element_text(color = "blue", size = 10), legend.text = element_text(color = "red"))

ggarrange(list(bxp.legend, bxp.defaultLegend, plot1), nrow = 1, ncol = 3,  common.legend = TRUE)

El código se modifica según el ejemplo de GitHub .


1

Estoy usando facet_wrap en mi ggplot y ninguna de las soluciones sugeridas funcionó para mí, excepto la solución de ArnaudA:

qplot() + guides(color=guide_legend(title="sale year")) 

1

Muchas personas pasan mucho tiempo cambiando etiquetas, leyendas, títulos y nombres de los ejes porque no saben que es posible cargar tablas en R que contienen espacios " ". Sin embargo, puede hacer esto para ahorrar tiempo o reducir el tamaño de su código, especificando los separadores cuando carga una tabla que, por ejemplo, está delimitada con pestañas (o cualquier otro separador que no sea el predeterminado o un solo espacio):

read.table(sep = '\t')

o utilizando los parámetros de carga predeterminados del formato csv:

read.csv()

Esto significa que puede mantener directamente el nombre "NEW LEGEND TITLE"como un nombre de columna (encabezado) en su archivo de datos original para evitar especificar un nuevo título de leyenda en cada gráfico.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.