Changer la taille de la police et la direction du texte des axes dans ggplot2

188

Je trace un graphique avec une variable catégorielle sur l'axe des x et une variable numérique sur l'axe des y.

Pour l'axe des x, étant donné qu'il existe de nombreux points de données, la mise en forme du texte par défaut entraîne le chevauchement de l'étiquette de chaque coche avec d'autres étiquettes. Comment puis-je (a) modifier la taille de la police du texte de mon axe et (b) modifier l'orientation du texte afin que le texte soit perpendiculaire à l'axe?

Anjan
la source
Et un autre stackoverflow.com/q/8097642/1172302
Nikos Alexandris
Il y a un chevauchement avec stackoverflow.com/q/1330989/946850 , mais cette question ne couvre pas le redimensionnement du texte.
krlmlr

Réponses:

292

Utilisez theme():

d <- data.frame(x=gl(10, 1, 10, labels=paste("long text label ", letters[1:10])), y=rnorm(10))
ggplot(d, aes(x=x, y=y)) + geom_point() +
    theme(text = element_text(size=20),
        axis.text.x = element_text(angle=90, hjust=1)) 
#vjust adjust the vertical justification of the labels, which is often useful

entrez la description de l'image ici

Il y a beaucoup de bonnes informations sur la façon de formater vos ggplots ici . Vous pouvez voir une liste complète des paramètres que vous pouvez modifier (en gros, tous) à l'aide de ?theme.

Drew Steen
la source
2
Je pense que ça devrait l'être hjust=1.
Artem Sokolov
Vrai! Corrigé par le commentaire d'Artem, mais je n'ai pas mis à jour l'image.
Drew Steen
68

Idem @Drew Steen sur l'utilisation de theme(). Voici les attributs de thème courants pour le texte et les titres des axes.

ggplot(mtcars, aes(x = factor(cyl), y = mpg))+
  geom_point()+
  theme(axis.text.x = element_text(color = "grey20", size = 20, angle = 90, hjust = .5, vjust = .5, face = "plain"),
        axis.text.y = element_text(color = "grey20", size = 12, angle = 0, hjust = 1, vjust = 0, face = "plain"),  
        axis.title.x = element_text(color = "grey20", size = 12, angle = 0, hjust = .5, vjust = 0, face = "plain"),
        axis.title.y = element_text(color = "grey20", size = 12, angle = 90, hjust = .5, vjust = .5, face = "plain"))
metasequoia
la source
19

Utilisez le thème ():

d <- data.frame(x=gl(10, 1, 10, labels=paste("long text label ", letters[1:10])), y=rnorm(10))
ggplot(d, aes(x=x, y=y)) + geom_point() +
theme(text = element_text(size=20))
méduvigo
la source
19

En ajoutant aux solutions précédentes, vous pouvez également spécifier la taille de la police par rapport à celle base_sizeincluse dans les thèmes tels que theme_bw()(où base_sizeest 11) à l'aide de la rel()fonction.

Par exemple:

ggplot(mtcars, aes(disp, mpg)) +
  geom_point() +
  theme_bw() +
  theme(axis.text.x=element_text(size=rel(0.5), angle=90))
Megatron
la source
5

Lorsque vous créez de nombreux tracés, il est logique de le définir globalement (la partie pertinente est la deuxième ligne, trois lignes ensemble sont un exemple de travail):

   library('ggplot2')
   theme_update(text = element_text(size=20))
   ggplot(mpg, aes(displ, hwy, colour = class)) + geom_point()
JJ pour Transparency et Monica
la source
4

L'utilisation de l'attribut "fill" aide dans des cas comme celui-ci. Vous pouvez supprimer le texte de l'axe en utilisant element_blank()et afficher un graphique à barres multicolore avec une légende. Je trace une fréquence de retrait de pièce dans un atelier de réparation comme ci-dessous

ggplot(data=df_subset,aes(x=Part,y=Removal_Frequency,fill=Part))+geom_bar(stat="identity")+theme(axis.text.x  = element_blank())

J'ai opté pour cette solution dans mon cas car j'avais de nombreuses barres dans le graphique à barres et je n'ai pas été en mesure de trouver une taille de police appropriée qui soit à la fois lisible et suffisamment petite pour ne pas se chevaucher.

user131476
la source
0

Une autre façon de traiter les étiquettes qui se chevauchent consiste à utiliser guide = guide_axis(n.dodge = 2).

library(dplyr)
library(tibble)
library(ggplot2)

dt <- mtcars %>% rownames_to_column("name") %>% 
  dplyr::filter(cyl == 4)

# Overlapping labels
ggplot(dt, aes(x = name, y = mpg)) + geom_point()

entrez la description de l'image ici

ggplot(dt, aes(x = name, y = mpg)) + geom_point() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2))

entrez la description de l'image ici

HBat
la source