¿Cómo cambiar las etiquetas de las facetas?
He usado el siguiente ggplot
comando:
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
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.
Aquí hay una solución que evita editar sus datos:
Digamos que su trama está facetada por la group
parte 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_names
y facet2_names
son 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.
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))
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 ~ .)