¿Cómo cambiar las etiquetas de las facetas?

Resuelto wishihadabettername asked hace 54 años • 23 respuestas

He usado el siguiente ggplotcomando:

ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
  + scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
  + facet_grid(hospital ~ .)
  + theme(panel.background = theme_blank())

para producir

texto alternativo

Sin embargo, me gustaría cambiar las etiquetas de las facetas a algo más corto (como Hosp 1, Hosp 2...) porque ahora son demasiado largas y parecen apretadas (aumentar la altura del gráfico no es una opción, ocuparía demasiado espacio en el documento). Miré la página de ayuda de facet_grid pero no sé cómo.

wishihadabettername avatar Jan 01 '70 08:01 wishihadabettername
Aceptado

Aquí hay una solución que evita editar sus datos:

Digamos que su trama está facetada por la groupparte de su marco de datos, que tiene niveles control, test1, test2, luego cree una lista nombrada por esos valores:

hospital_names <- list(
  'Hospital#1'="Some Hospital",
  'Hospital#2'="Another Hospital",
  'Hospital#3'="Hospital Number 3",
  'Hospital#4'="The Other Hospital"
)

Luego cree una función 'etiquetadora' e introdúzcala en su llamada facet_grid:

hospital_labeller <- function(variable,value){
  return(hospital_names[value])
}

ggplot(survey,aes(x=age)) + stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
 + facet_grid(hospital ~ ., labeller=hospital_labeller)
 ...

Esto utiliza los niveles del marco de datos para indexar la lista de nombres_de_hospitales, devolviendo los valores de la lista (los nombres correctos).


Tenga en cuenta que esto solo funciona si solo tiene una variable de facetado. Si tiene dos facetas, entonces su función de etiquetado debe devolver un vector de nombre diferente para cada faceta. Puedes hacer esto con algo como:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else {
    return(facet2_names[value])
  }
}

Donde facet1_namesy facet2_namesson listas predefinidas de nombres indexados por los nombres de índice de facetas ('Hostpital#1', etc.).


Editar: el método anterior falla si pasa una combinación de variable/valor que el etiquetador no conoce. Puede agregar un mecanismo de seguridad para variables desconocidas como esta:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else if (variable=='facet2') {
    return(facet2_names[value])
  } else {
    return(as.character(value))
  }
}

Respuesta adaptada de cómo cambiar las etiquetas de strip.text en ggplot con faceta y margen = VERDADERO


editar: ADVERTENCIA : si está utilizando este método para facetar una columna de caracteres , es posible que obtenga etiquetas incorrectas. Vea este informe de error .corregido en versiones recientes de ggplot2.

naught101 avatar Aug 24 '2012 06:08 naught101

Aquí hay otra solución que sigue el espíritu de la dada por @ naught101 , pero más simple y tampoco arroja una advertencia sobre la última versión de ggplot2.

Básicamente, primero creas un vector de caracteres con nombre.

hospital_names <- c(
                    `Hospital#1` = "Some Hospital",
                    `Hospital#2` = "Another Hospital",
                    `Hospital#3` = "Hospital Number 3",
                    `Hospital#4` = "The Other Hospital"
                    )

Y luego lo usas como etiquetador, simplemente modificando la última línea del código proporcionado por @ naught101 para

... + facet_grid(hospital ~ ., labeller = as_labeller(hospital_names))
mbiron avatar Jan 15 '2016 12:01 mbiron

Cambie los nombres de los niveles de factores subyacentes con algo como:

# Using the Iris data
> i <- iris
> levels(i$Species)
[1] "setosa"     "versicolor" "virginica" 
> levels(i$Species) <- c("S", "Ve", "Vi")
> ggplot(i, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
Vince avatar Aug 13 '2010 01:08 Vince