web-dev-qa-db-fra.com

Étiquettes des axes de rotation et d'espacement dans ggplot2

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))

enter image description here

575
Christopher DuBois

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:

alt text

L'image ci-dessus provient de cet article de blog .

979
Jonathan Chang

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))
79
e3bo

Utilisez coord_flip()

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

qplot(cut,carat,data = diamonds, geom = "boxplot") +
  coord_flip()

enter image description here


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.

71
Rich Pauloo

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:

Example

22

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

5
krlmlr