Etichette dell'asse rotante e spaziatura in GGPlot2
Domanda
Ho una trama in cui l'asse X è un fattore le cui etichette sono lunghe. Sebbene probabilmente non sia una visualizzazione ideale, per ora vorrei semplicemente ruotare queste etichette per essere verticali. Ho capito questa parte con il codice qui sotto, ma come puoi vedere, le etichette non sono totalmente visibili.
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))
Soluzione
Cambia l'ultima riga in
q + theme(axis.text.x = element_text(angle = 90, hjust = 1))
Per impostazione predefinita, gli assi sono allineati al centro del testo, anche quando ruotati. Quando ruoti +/- 90 gradi, di solito vuoi che sia allineato al bordo:
L'immagine sopra è da Questo post sul blog.
Altri suggerimenti
Per rendere il testo sulle etichette del tick completamente visibile e letta nella stessa direzione dell'etichetta dell'asse Y, cambia l'ultima riga in
q + theme(axis.text.x=element_text(angle=90, hjust=1))
Uso coord_flip()
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
qplot(cut,carat,data = diamonds, geom = "boxplot") +
coord_flip()
In ch 3.9 di R per la scienza dei dati, Wickham e Grolemund parlano a questa esatta domanda:
coord_flip()
commuta gli assi X e Y. Questo è utile (ad esempio), se si desidera grafici a scatole orizzontali. È anche utile per le etichette lunghe: è difficile farli adattarsi senza sovrapposizioni sull'asse X.
Vorrei fornire una soluzione alternativa, una soluzione robusta simile a quella che sto per proporre era richiesta nell'ultima versione di ggtern, dall'introduzione della funzione di rotazione della tela.
Fondamentalmente, è necessario determinare le posizioni relative usando la trigonometria, costruendo una funzione che restituisce un element_text
oggetto, dato angolo (cioè gradi) e posizionamento (cioè una delle informazioni x, y, in alto o destra).
#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, secondo me, penso che un'opzione "auto" dovrebbe essere resa disponibile in ggplot2
per il hjust
e vjust
Gli argomenti, quando si specificano l'angolo, comunque, dimostriamo come funziona quanto sopra.
#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)
Che produce quanto segue:
Il ggpubr Il pacchetto offre un collegamento che fa la cosa giusta per impostazione predefinita (Testo di allineatura a destra, casella di testo allineamento a medio da spuntare):
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()
Creato il 2018-11-06 dal Pacchetto Reprex (V0.2.1)
Trovato con una ricerca GitHub per i nomi degli argomenti pertinenti: https://github.com/search?l=r&q=element_text+ngle+90+vjust+org%3Acran&type=Code