Question Rotation et espacement des étiquettes d'axes dans ggplot2


J'ai un tracé 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 trouvé cette partie avec le code ci-dessous, mais comme vous pouvez le voir, 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


471
2017-08-25 21:05


origine


Réponses:


Changez la dernière ligne à

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 en cas de rotation. Lorsque vous faites pivoter de +/- 90 degrés, vous souhaitez généralement l'aligner sur le bord à la place:

alt text

L'image ci-dessus vient de ce blog.


763
2017-08-25 22:36



Pour que le texte des étiquettes des graduations soit entièrement visible et lisible dans la même direction que l'étiquette de l'axe des y, changez la dernière ligne à

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

63
2017-12-20 04:24



Utilisation + coord_flip().

Dans "R for Data Science", Wickham et Grolemund parlent de ce problème précis. Au chapitre 3.8, Ajustements de position, ils écrivent:

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 longues étiquettes: il est difficile de les faire correspondre sans se chevaucher sur l'axe des x.

En appliquant cela à votre intrigue, nous ajoutons simplement + coord_flip() au ggplot:

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

Et maintenant, les titres super longs sont étalés horizontalement et très faciles à lire!


40
2017-08-01 02:29



Je voudrais fournir une solution alternative, une solution robuste similaire à ce que je suis sur le point de proposer était nécessaire dans la dernière version de ggtern, depuis l'introduction de la fonction de rotation du canevas.

Fondamentalement, vous devez déterminer les positions relatives en utilisant la trigonométrie, en construisant une fonction qui retourne un element_text objet, angle donné (c.-à-d. degrés) et positionnement (c.-à-d. l'une des informations x, y, 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 le hjust et vjust arguments, en spécifiant l'angle, de toute façon, permet de démontrer comment fonctionne ce qui précède.

#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 ce qui suit:

Example


19
2018-05-02 09:32