sinovitis - sindrome facetario lumbar ejercicios
ggplot: ¿Cómo cambiar las etiquetas facetarias? (11)
¿Has intentado cambiar los niveles específicos de tu vector de Hospital
?
levels(survey$hospital)[levels(survey$hospital) == "Hospital #1"] <- "Hosp 1"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #2"] <- "Hosp 2"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #3"] <- "Hosp 3"
He usado el siguiente comando ggplot:
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 ~ .)
+ opts(panel.background = theme_blank())
para producir
Me gustaría cambiar las etiquetas de facetas , sin embargo, a algo más corto (como Hosp 1, Hosp 2 ...) porque ahora son demasiado largas y parecen estrechas (aumentar la altura del gráfico no es una opción, tomaría demasiado espacio en el documento). Miré la página de ayuda de facet_grid pero no puedo entender cómo.
Aquí hay otra solución que está en el espíritu de la dada por @naught101, pero más simple y que no lanza una advertencia sobre la última versión de ggplot2.
Básicamente, primero crea 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 usa como una etiquetadora, simplemente modificando la última línea del código dado por @ naught101 a
... + facet_grid(hospital ~ ., labeller = as_labeller(hospital_names))
Espero que esto ayude.
Aquí hay una solución que evita editar sus datos:
Digamos que su trama está facetada por la parte de group
de su marco de datos, que tiene control, test1, test2
niveles control, test1, test2
, luego crea 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 crea una función ''etiquetadora'' y presiónala en tu 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 usa 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, su función de etiquetadora 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 la etiquetadora no conoce. Puede agregar un fail-safe 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 etiquetas strip.text en ggplot con faceta y margen = TRUE
edit: ADVERTENCIA : si está utilizando este método para facetar una columna de caracteres , es posible que esté recibiendo etiquetas incorrectas. Vea este informe de error . arreglado en versiones recientes de ggplot2.
Así es como lo hice con facet_grid(yfacet~xfacet)
usando ggplot2, versión 2.2.1:
facet_grid(
yfacet~xfacet,
labeller = labeller(
yfacet = c(`0` = "an y label", `1` = "another y label"),
xfacet = c(`10` = "an x label", `20` = "another x label")
)
)
Tenga en cuenta que esto no contiene una llamada a as_labeller()
, algo con lo que tuve problemas durante un tiempo.
Este enfoque está inspirado en el último ejemplo de la función Coerce to etiqueler de la página de ayuda.
Cambie los nombres de nivel de factor 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 ~ .)
Creo que todas las demás soluciones son realmente útiles para hacer esto, pero aún hay otra manera.
Asumo:
- ha instalado el paquete
dplyr
, que tiene el conveniente comandodplyr
, y su conjunto de datos se denomina
survey
.survey%>% mutate (Hosp1 = Hospital1, Hosp2 = Hospital2, ........)
Este comando le ayuda a cambiar el nombre de las columnas, pero se conservan todas las demás columnas.
Entonces haz lo mismo facet_wrap
, estás bien ahora.
Si tiene dos facetas en el hospital
y la room
pero quiere cambiar el nombre de una sola, puede usar:
facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names)))
Para renombrar dos facetas usando el enfoque basado en vectores (como en la respuesta de naught101), puedes hacer:
facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names),
room = as_labeller(room_names)))
Simplemente extendiendo la respuesta de naught101, el crédito va para él
plot_labeller <- function(variable,value, facetVar1=''<name-of-1st-facetting-var>'', var1NamesMapping=<pass-list-of-name-mappings-here>, facetVar2='''', var2NamesMapping=list() )
{
#print (variable)
#print (value)
if (variable==facetVar1)
{
value <- as.character(value)
return(var1NamesMapping[value])
}
else if (variable==facetVar2)
{
value <- as.character(value)
return(var2NamesMapping[value])
}
else
{
return(as.character(value))
}
}
Lo que tienes que hacer es crear una lista con asignación de nombre a nombre
clusteringDistance_names <- list(
''100''="100",
''200''="200",
''300''="300",
''400''="400",
''600''="500"
)
y redefina plot_labeller()
con nuevos argumentos predeterminados:
plot_labeller <- function(variable,value, facetVar1=''clusteringDistance'', var1NamesMapping=clusteringDistance_names, facetVar2='''', var1NamesMapping=list() )
Y entonces:
ggplot() +
facet_grid(clusteringDistance ~ . , labeller=plot_labeller)
Alternativamente, puede crear una función dedicada para cada uno de los cambios de etiqueta que desea tener.
Tanto facet_wrap
como facet_grid
también aceptan la entrada de ifelse
como argumento. Entonces, si la variable utilizada para la facetación es lógica, la solución es muy simple:
facet_wrap(~ifelse(variable, "Label if true", "Label if false"))
Si la variable tiene más categorías, la declaración ifelse
necesita ser nested .
Como efecto secundario, esto también permite la creación de los grupos a ggplot
dentro de la llamada ggplot
.
Tenga en cuenta que esta solución no funcionará bien en caso de que ggplot muestre menos factores de los que realmente contiene su variable (lo que podría suceder si hubiera estado, por ejemplo, subconjunto):
library(ggplot2)
labeli <- function(variable, value){
names_li <- list("versicolor"="versi", "virginica"="virg")
return(names_li[value])
}
dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli)
Una solución simple (además de agregar todos los factores no utilizados en names_li, que puede ser tedioso) es soltar los factores no utilizados con droplevels (), ya sea en el conjunto de datos original o en la función labbeler, ver:
labeli2 <- function(variable, value){
value <- droplevels(value)
names_li <- list("versicolor"="versi", "virginica"="virg")
return(names_li[value])
}
dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli2)
Tengo otra forma de lograr el mismo objetivo sin cambiar los datos subyacentes:
ggplot(transform(survey, survey = factor(survey,
labels = c("Hosp 1", "Hosp 2", "Hosp 3", "Hosp 4"))), 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 ~ .) +
opts(panel.background = theme_blank())
Lo que hice arriba es cambiar las etiquetas del factor en el marco de datos original, y esa es la única diferencia en comparación con su código original.