J'ai un graphique où l'axe des x est un facteur dont les étiquettes sont longues. Bien que ce ne soit probablement pas une visualisation idéale, pour l’instant, je voudrais simplement faire pivoter ces étiquettes pour qu’elles soient verticales. J'ai compris cette partie avec le code ci-dessous, mais comme vous pouvez le constater, les étiquettes ne sont pas totalement 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))
Changer la dernière ligne en
q + theme(axis.text.x = element_text(angle = 90, hjust = 1))
Par défaut, les axes sont alignés au centre du texte, même lors de la rotation. Lorsque vous effectuez une rotation de +/- 90 degrés, vous souhaitez généralement l'aligner sur le bord:
L'image ci-dessus provient de cet article de blog .
Pour que le texte sur les étiquettes de coche soit entièrement visible et lu dans le même sens que l’étiquette sur l’axe des y, modifiez la dernière ligne en
q + theme(axis.text.x=element_text(angle=90, hjust=1))
coord_flip()
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
qplot(cut,carat,data = diamonds, geom = "boxplot") +
coord_flip()
Dans le chapitre 3.9 de R pour Data Science , Wickham et Grolemund répondent à cette question précise:
coord_flip()
commute les axes x et y. Ceci est utile (par exemple) si vous voulez des boîtes à moustaches horizontales. C’est également utile pour les étiquettes longues: il est difficile de les faire tenir sans se chevaucher sur l’axe des x.
Je voudrais fournir une solution alternative, une solution robuste similaire à celle que je vais proposer est requise dans la dernière version de ggtern , depuis l’introduction de la fonctionnalité de rotation de la toile.
Fondamentalement, vous devez déterminer les positions relatives à l'aide de la trigonométrie, en créant une fonction qui renvoie un objet element_text
, un angle donné (c.-à-d. Les degrés) et un positionnement (c.-à-d. L'un des x, y, en haut ou à droite).
#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)
}
Franchement, à mon avis, je pense qu’une option "auto" devrait être disponible dans ggplot2
pour les arguments hjust
et vjust
, en spécifiant l’angle, permet de montrer comment ci-dessus fonctionne.
#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)
Qui produit les éléments suivants:
Le paquetage ggpubr offre un raccourci qui fait le bon choix par défaut (aligner le texte à droite, la zone de texte au centre à cocher):
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()
Créé le 2018-11-06 par le paquetage reprex (v0.2.1)
Trouvé avec GitHub dans la recherche des noms d'arguments pertinents: https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code