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 faceta a algo más corto (como Hosp 1
, Hosp 2
...) porque ahora son demasiado largas y se ven apretadas (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.
ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
levels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))
) no aparecerá en la expresión matemática. ¿Cómo se mostrarían las expresiones como etiquetas de faceta?labeller
opción parafacet_grid
: stackoverflow.com/questions/37089052/…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 nivelescontrol, test1, test2
, luego cree una lista nombrada por esos valores:Luego cree una función 'etiquetadora' y empújela en su llamada facet_grid:
Utiliza los niveles del marco de datos para indexar la lista hospital_names, 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:
Dónde
facet1_names
yfacet2_names
son listas predefinidas de nombres indexados por los nombres de índice de faceta ('Hostpital # 1', etc.).Editar: el método anterior falla si pasa una combinación de variable / valor que el etiquetador no conoce. Puede agregar una prueba de fallas para variables desconocidas como esta:
Respuesta adaptada de cómo cambiar las etiquetas strip.text en ggplot con faceta y margen = VERDADERO
editar: ADVERTENCIA : si está utilizando este método para facetar por una columna de caracteres , es posible que obtenga etiquetas incorrectas. Ver este informe de error .corregido en versiones recientes de ggplot2.fuente
Aquí hay otra solución que está en 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 crea un vector de caracteres con nombre
Y luego lo usa como etiquetador, simplemente modificando la última línea del código dada por @ naught101 para
Espero que esto ayude.
fuente
as_labeller
? Encontré un código fuente en el repositorio CRAN GitHub , pero después de actualizar a la última versión (¡en CRAN!) No parece tener la función.hospital ~ gender
o algo? ¿Hay alguna forma de usar etiquetadoras en ambos ejes? No puedo ver nada obvio en los documentos.Así es como lo hice
facet_grid(yfacet~xfacet)
usando ggplot2, versión 2.2.1:Tenga en cuenta que esto no contiene un llamado a
as_labeller()
, algo con lo que luché por un tiempo.Este enfoque está inspirado en el último ejemplo en la página de ayuda Coerce para etiquetar la función .
fuente
setNames()
stackoverflow.com/a/22428439/3362993Si tiene dos facetas
hospital
yroom
desea cambiar el nombre de una sola, puede usar:Para renombrar dos facetas utilizando el enfoque basado en vectores (como en la respuesta de naught101), puede hacer:
fuente
La forma MÁS FÁCIL de cambiar SIN modificar los datos subyacentes es:
1) Cree un objeto utilizando la
as_labeller
función agregando la marca de verificación posterior para cada uno de los valores predeterminados :2) Agregamos al GGplot:
fuente
Tenga en cuenta que esta solución no funcionará bien en caso de que ggplot muestre menos factores de los que su variable realmente contiene (lo que podría suceder si hubiera estado, por ejemplo, subconjunto):
Una solución simple (además de agregar todos los factores no utilizados en names_li, que puede ser tedioso) es eliminar los factores no utilizados con droplevels (), ya sea en el conjunto de datos original o en la función labbeler, consulte:
fuente
Esta solución está muy cerca de lo que tiene @domi, pero está diseñada para acortar el nombre al buscar las primeras 4 letras y el último número.
fuente
Ambos
facet_wrap
yfacet_grid
también aceptan la entrada deifelse
como argumento. Entonces, si la variable utilizada para el facetado es lógica, la solución es muy simple:Si la variable tiene más categorías, la
ifelse
declaración debe estar anidada .Como efecto secundario, esto también permite que la creación de los grupos sea facetada dentro de la
ggplot
llamada.fuente
Agregar otra solución similar a @ domi con análisis de símbolos matemáticos, superíndice, subíndice, paréntesis / paréntesis, .etc.
Creado el 30/03/2019 por el paquete reprex (v0.2.1.9000)
fuente
Creo que todas las demás soluciones son realmente útiles para hacer esto, pero hay otra forma.
Asumo:
dplyr
paquete, que tiene el convenientemutate
comando , ysu conjunto de datos se llama
survey
.encuesta%>% mutate (Hosp1 = Hospital1, Hosp2 = Hospital2, ........)
Este comando le ayuda a cambiar el nombre de las columnas, pero todas las demás columnas se mantienen.
Entonces haz lo mismo
facet_wrap
, estás bien ahora.fuente
La definición de la función etiquetadora con
variable, value
argumentos no funcionaría para mí. Además, si desea usar la expresión, debe usar lapply y no puede simplemente usararr[val]
, ya que el argumento de la función es un data.frame.Este código funcionó:
fuente
Puesto que aún no se me permite comentar las publicaciones, les dejo esto por separado en una adición a la respuesta de Vince y la respuesta de son520804 . El crédito va para ellos.
Utilizando el ejemplo de iris de Vince y el código parcial de son520804, hice esto con la función de mutación y logré una solución fácil sin tocar el conjunto de datos original. El truco es crear un vector de nombre suplente y usar mutate () dentro de la tubería para corregir los nombres de faceta temporalmente:
En este ejemplo, puede ver que los niveles de i $ Species se cambian temporalmente a los nombres comunes correspondientes contenidos en el vector new_names. La línea que contiene
se puede quitar fácilmente para revelar el nombre original.
Palabra de precaución: esto puede introducir fácilmente errores en los nombres si el vector new_name no está configurado correctamente. Probablemente sería mucho más limpio usar una función separada para reemplazar las cadenas variables. Tenga en cuenta que el vector new_name puede necesitar repetirse de diferentes maneras para que coincida con el orden de su conjunto de datos original. Verifique doble y triplemente que esto se haya logrado correctamente.
fuente
new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')
y luego en la mutación podría crear una nueva columna de esta manera:mutate(Spec = new_names[Species])
Esto es trabajo para mí.
Definir un factor:
y uso, en
ggplot()
:fuente
Simplemente extendiendo la respuesta de nada101: el crédito va para él
Lo que debe hacer es crear una lista con mapeo de nombre a nombre
y redefinir
plot_labeller()
con nuevos argumentos predeterminados:Y entonces:
Alternativamente, puede crear una función dedicada para cada uno de los cambios de etiqueta que desee tener.
fuente
Tengo otra forma de lograr el mismo objetivo sin cambiar los datos subyacentes:
Lo que hice anteriormente fue 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.
fuente
¿Has intentado cambiar los niveles específicos de tu
Hospital
vector?fuente
Siento que debería agregar mi respuesta a esto porque me tomó bastante tiempo hacer que esto funcione:
Esta respuesta es para ti si:
bquote
) en sus etiquetas yBásicamente coloco las etiquetas en un vector con nombre para que las etiquetas no se confundan o cambien. La
labeller
expresión probablemente podría ser más simple, pero esto al menos funciona (las mejoras son muy bienvenidas). Tenga en cuenta el `(comillas inversas) para proteger el factor de faceta.fuente
Solución simple (desde aquí ):
fuente
Después de luchar durante un tiempo, lo que he encontrado es que podemos usar
fct_relevel()
yfct_recode()
desdeforcats
conjuntamente para cambiar el orden de las facetas, así fijar las etiquetas de faceta. No estoy seguro de si es compatible con el diseño, ¡pero funciona! Echa un vistazo a las parcelas a continuación:Creado el 16/02/2020 por el paquete reprex (v0.3.0)
fuente