826 votes

Faire pivoter et espacer les étiquettes des axes 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 les rendre verticales. J'ai compris 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

6 votes

Comme ggplot 3.3.0 est maintenant sorti, à mon avis, la réponse acceptée devrait être changée en celle de jan-glx.

14voto

YAK Points 185

DEPASSÉ - voir cette réponse pour une approche plus simple


Pour obtenir des étiquettes d'axes x lisibles sans dépendances supplémentaires, vous voulez utiliser :

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

Cela fait pivoter les étiquettes d'axe des ticks de 90° dans le sens antihoraire et les aligne verticalement à leur extrémité (hjust = 1) et horizontalement à leur centre avec la marque de tick correspondante (vjust = 0.5).

Exemple complet :

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Déé-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


Remarquez que les paramètres de justification verticale/horizontale vjust/hjust de element_text sont relatifs au texte. Par conséquent, vjust est responsable de l'alignement horizontal.

Sans vjust = 0.5 cela ressemblerait à ceci :

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

Sans hjust = 1 cela ressemblerait à ceci :

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

Si pour une raison (étrange) vous vouliez faire pivoter les étiquettes des ticks de 90° dans le sens horaire (afin qu'elles puissent être lues depuis la gauche), vous devriez utiliser : q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1)).

Tout cela a déjà été discuté dans les commentaires de cette réponse mais je reviens souvent à cette question, je veux donc une réponse que je peux simplement copier sans lire les commentaires.

13voto

krlmlr Points 5572

Le package ggpubr offre un raccourci qui fait la bonne chose par défaut (alignement à droite du texte, alignement au milieu de la boîte de texte sur le tick):

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 package reprex (v0.2.1)

Trouvé avec une recherche GitHub pour les noms d'arguments pertinents : https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code

0voto

Tjebo Points 2775

Une alternative à coord_flip() est d'utiliser le package ggstance. L'avantage est qu'il facilite la combinaison des graphiques avec d'autres types de graphiques et vous pouvez, peut-être plus important encore, définir des ratios d'échelle fixes pour votre système de coordonnées.

library(ggplot2)
library(ggstance)

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

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

Créé le 2020-03-11 par le package reprex (v0.3.0)

0voto

DataVizPyR Points 31

Aussi avec ggplot2 3.3+, nous pouvons créer des tracés horizontaux sans coord_flip() car il prend en charge les géométries bidirectionnelles, il suffit d’inverser l’axe x et y. https://cmdlinetips.com/2020/03/ggplot2-2-3-0-is-here-two-new-features-you-must-know/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X