superponer personalizar nombre modificar los graficas ggplot etiquetas escala ejes como cambiar r ggplot2 labels

personalizar - Rotación y espaciado de las etiquetas de los ejes en ggplot2.



personalizar ejes en r (5)

Tengo una gráfica donde el eje x es un factor cuyas etiquetas son largas. Aunque probablemente no sea una visualización ideal, por ahora me gustaría simplemente rotar estas etiquetas para que sean verticales. He descubierto esta parte con el código de abajo, pero como puedes ver, las etiquetas no son totalmente visibles.

data(diamonds) diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut)) q <- qplot(cut,carat,data=diamonds,geom="boxplot") q + opts(axis.text.x=theme_text(angle=-90))


Utilice coord_flip()

En "R for Data Science", Wickham y Grolemund hablan de este problema exacto. En el Capítulo 3.8, Ajustes de posición , escriben:

coord_flip() cambia los ejes x e y. Esto es útil (por ejemplo), si desea diagramas de caja horizontales. También es útil para etiquetas largas: es difícil hacer que encajen sin superponerse en el eje x.

Aplicando esto a su gráfica, solo agregamos + coord_flip() al ggplot:

data(diamonds) diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut)) qplot(cut,carat,data = diamonds, geom = "boxplot") + coord_flip()

¡Y ahora los títulos súper largos se extienden horizontalmente y son muy fáciles de leer!


Cambia la última línea a

q + theme(axis.text.x = element_text(angle = 90, hjust = 1))

De forma predeterminada, los ejes se alinean en el centro del texto, incluso cuando se giran. Cuando giras +/- 90 grados, normalmente quieres que esté alineado en el borde:

La imagen de arriba es de esta entrada de blog .


El paquete ggpubr ofrece un acceso directo que hace lo correcto de forma predeterminada (alinear el texto a la derecha, alinear el cuadro de texto en la mitad):

library(ggplot2) diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut)) q <- qplot(cut, carat, data = diamonds, geom = "boxplot") q + ggpubr::rotate_x_text()

Creado en 2018-11-06 por el paquete reprex (v0.2.1)

Se encontró con una búsqueda de GitHub para los nombres de los argumentos relevantes: https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code


Me gustaría proporcionar una solución alternativa, una solución robusta similar a la que voy a proponer que se requería en la última versión de ggtern , desde la introducción de la función de rotación del lienzo.

Básicamente, es necesario determinar las posiciones relativas mediante la trigonometría, mediante la creación de una función que devuelva un objeto element_text , dado el ángulo (es decir, grados) y la información de posición (es decir, una de x, y, arriba o derecha).

#Load Required Libraries library(ggplot2) library(gridExtra) #Build Function to Return Element Text Object rotatedAxisElementText = function(angle,position=''x''){ angle = angle[1]; position = position[1] positions = list(x=0,y=90,top=180,right=270) if(!position %in% names(positions)) stop(sprintf("''position'' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE) if(!is.numeric(angle)) stop("''angle'' must be numeric",call.=FALSE) rads = (angle - positions[[ position ]])*pi/180 hjust = 0.5*(1 - sin(rads)) vjust = 0.5*(1 + cos(rads)) element_text(angle=angle,vjust=vjust,hjust=hjust) }

Francamente, en mi opinión, creo que una opción ''automática'' debería estar disponible en ggplot2 para los argumentos hjust y vjust , al especificar el ángulo, de todos modos, vamos a demostrar cómo funciona lo anterior.

#Demonstrate Usage for a Variety of Rotations df = data.frame(x=0.5,y=0.5) plots = lapply(seq(0,90,length.out=4),function(a){ ggplot(df,aes(x,y)) + geom_point() + theme(axis.text.x = rotatedAxisElementText(a,''x''), axis.text.y = rotatedAxisElementText(a,''y'')) + labs(title = sprintf("Rotated %s",a)) }) grid.arrange(grobs=plots)

Lo que produce lo siguiente:


Para hacer que el texto en las etiquetas de marca sea completamente visible y lea en la misma dirección que la etiqueta del eje y, cambie la última línea a

q + theme(axis.text.x=element_text(angle=90, hjust=1))