HOWTO · R
Modifier les étiquettes de graduation des axes ggplot2 dans R
Renommez et formatez les graduations d'axes discrets ou continus dans ggplot2, puis rendez les libellés longs lisibles.
Utilisez scale_x_discrete(labels = ...) pour renommer les graduations d’un facteur ou d’une variable de type caractère. Pour un axe numérique, scale_x_continuous(breaks = ..., labels = ...) définit leur position et leur format. La rotation et les autres changements visuels relèvent de theme(axis.text.x = element_text(...)). Pour modifier le titre de l’axe, employez plutôt labs(x = ...) : ce titre n’est pas une étiquette de graduation. Remplacez x par y pour appliquer les mêmes principes à l’axe vertical.
Les exemples nécessitent R et ggplot2. L’exemple continu utilise également le package scales pour sa fonction de formatage. Ils ont été vérifiés avec R 4.1.2, ggplot2 3.3.5 et scales 1.1.1. Les arguments employés figurent aussi dans l’API actuelle de ggplot2, même si le rendu du thème peut varier légèrement selon la version installée.
| Tâche | Commande ggplot2 |
|---|---|
| Modifier le titre de l’axe | labs(x = "Title") ou labs(y = "Title") |
| Renommer les étiquettes de valeurs factorielles ou de chaînes de caractères | scale_x_discrete(labels = ...) |
| Définir les positions et le texte numériques | scale_x_continuous(breaks = ..., labels = ...) |
| Faire pivoter ou styliser le texte affiché | theme(axis.text.x = element_text(...)) |
Formater un axe Date |
scale_x_date(breaks = ..., labels = ...) |
Créer un graphique ggplot2 de référence
Un seul petit data frame suffit pour observer chaque modification. La colonne plan est un facteur et reçoit donc une échelle x discrète. La colonne numérique orders utilise une échelle y continue.
library(ggplot2)
plan_sales <- data.frame(
plan = factor(
c("starter", "standard", "premium", "enterprise"),
levels = c("starter", "standard", "premium", "enterprise")
),
orders = c(180, 250, 210, 140)
)
base_plot <- ggplot(plan_sales, aes(x = plan, y = orders)) +
geom_col(fill = "#2c7fb8", width = 0.7) +
labs(x = "Plan", y = "Orders") +
theme_minimal(base_size = 16)
base_plot
ggsave(
"ggplot-default-axis-tick-labels.png",
plot = base_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
Le graphique de référence affiche les quatre valeurs enregistrées du facteur sur l’axe x et des graduations numériques choisies automatiquement sur l’axe y. labs(x = "Plan") fournit le titre visible « Plan » sans réécrire starter, standard, premium ou enterprise.
Avant de choisir une échelle, examinez le type de la variable associée. str(plan_sales$plan) indique un facteur, tandis que str(plan_sales$orders) indique un vecteur numérique. Un facteur contenant "1", "2" et "3" reste discret. Inversement, une colonne numérique reste continue même si elle ne comporte que quelques valeurs distinctes. Ne changez le type que si la conversion correspond réellement au sens des données.
Renommer et ordonner des graduations discrètes
Sur une échelle discrète, associez breaks à labels. breaks désigne les valeurs de données pour lesquelles une graduation doit apparaître, et labels fournit le texte à imprimer. Cette association explicite empêche un libellé d’être attribué à la mauvaise valeur si l’ordre évolue.
L’exemple suivant réordonne également les catégories sans ambiguïté. Il modifie les niveaux du facteur dans une copie des données, puis transmet la même séquence à breaks. Le vecteur nommé rend la correspondance lisible avant même l’exécution.
plan_order <- c("premium", "standard", "starter", "enterprise")
plan_names <- c(
premium = "Premium",
standard = "Standard",
starter = "Starter",
enterprise = "Enterprise"
)
ordered_sales <- plan_sales
ordered_sales$plan <- factor(ordered_sales$plan, levels = plan_order)
discrete_plot <- ggplot(ordered_sales, aes(x = plan, y = orders)) +
geom_col(fill = "#2c7fb8", width = 0.7) +
scale_x_discrete(
breaks = plan_order,
labels = plan_names[plan_order]
) +
labs(x = "Plan", y = "Orders") +
theme_minimal(base_size = 16)
discrete_plot
ggsave(
"ggplot-discrete-axis-tick-labels.png",
plot = discrete_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
L’ordre affiché est Premium, Standard, Starter, Enterprise. Les valeurs enregistrées restent en minuscules ; seule leur présentation change. labels peut aussi recevoir une fonction lorsqu’une règle s’applique à toutes les graduations. Ainsi, scale_x_discrete(labels = abbreviate) transmet les valeurs à la fonction abbreviate() de R de base. Une fonction personnalisée function(x) doit renvoyer un vecteur de caractères de même longueur.
Si vous souhaitez uniquement de nouveaux noms tout en conservant l’ordre actuel, omettez breaks et passez un vecteur nommé couvrant chaque valeur affichée, par exemple c(starter = "Starter", standard = "Standard", premium = "Premium", enterprise = "Enterprise"). La forme associée ci-dessus convient mieux lorsque l’ensemble et l’ordre sont tous deux imposés. Après un filtrage, lisez l’axe de gauche à droite et comparez-le à la séquence attendue indiquée près de l’image.
Ne traitez pas breaks et limits comme des synonymes. Sur une échelle discrète, breaks sélectionne les graduations affichées sans modifier les catégories acceptées. limits définit les valeurs autorisées et leur ordre. Une valeur hors limites devient manquante ; une couche telle que geom_col() peut alors supprimer la ligne correspondante avec un avertissement. Modifiez les niveaux du facteur lorsque l’ordre appartient aux données, et réservez limits aux exclusions voulues.
Définir et formater les graduations d’un axe continu
Un axe numérique nécessite une échelle continue. Fournissez les positions exactes dans breaks, puis transmettez à labels soit autant de chaînes, soit une fonction de formatage. La fonction est plus sûre lorsque les valeurs changent, car ggplot2 l’appelle avec les graduations finales.
Ce nuage de points place les graduations de puissance à 100, 200 et 300 et ajoute l’unité avec scales::label_number(). L’appel direct du formateur vérifie le texte avant le tracé.
hp_breaks <- c(100, 200, 300)
hp_formatter <- scales::label_number(suffix = " hp", accuracy = 1)
hp_formatter(hp_breaks)
continuous_plot <- ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point(size = 3, color = "#d95f0e") +
scale_x_continuous(
breaks = hp_breaks,
labels = hp_formatter
) +
labs(x = "Engine power", y = "Fuel economy (mpg)") +
theme_minimal(base_size = 16)
continuous_plot
ggsave(
"ggplot-continuous-axis-tick-labels.png",
plot = continuous_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
[1] "100 hp" "200 hp" "300 hp"
L’axe x doit afficher exactement ces trois libellés. Pour un axe y numérique, utilisez l’appel équivalent scale_y_continuous(). D’autres formateurs du package scales gèrent les séparateurs de milliers, les pourcentages ou les devises. Les données restent numériques : seul le texte visible est transformé.
Des breaks exacts sont utiles lorsque les positions ont elles-mêmes un sens. Si seul le format compte, omettez breaks, laissez ggplot2 choisir les positions d’après l’étendue et fournissez seulement le formateur à labels. Ne convertissez pas la colonne numérique en chaînes pour ajouter un suffixe : cela changerait le type d’échelle et pourrait produire un ordre lexicographique au lieu d’un espacement numérique.
Les dates constituent un type d’échelle distinct. Si la colonne hérite de Date, employez scale_x_date() ou son équivalent pour y, plutôt que de forcer une échelle numérique ou discrète. Le principe breaks-labels reste valable avec des intervalles et formateurs adaptés aux dates.
Faire pivoter des étiquettes qui se chevauchent
Modifier le contenu et modifier le style répondent à deux problèmes différents. Si le texte est correct mais se chevauche, conservez l’échelle et ajustez axis.text.x dans le thème. angle = 35 fait pivoter chaque libellé, tandis que hjust = 1 aligne son bord droit sur la graduation. Une police de base plus grande préserve la lisibilité sur un graphique étroit.
channel_sales <- data.frame(
channel = c(
"North America Online",
"Europe Retail Stores",
"Asia Pacific Partners",
"Latin America Direct"
),
orders = c(260, 220, 195, 150)
)
rotated_plot <- ggplot(channel_sales, aes(x = channel, y = orders)) +
geom_col(fill = "#31a354", width = 0.65) +
labs(x = "Sales channel", y = "Orders") +
theme_minimal(base_size = 18) +
theme(
axis.text.x = element_text(angle = 35, hjust = 1, vjust = 1)
)
rotated_plot
ggsave(
"ggplot-rotated-axis-tick-labels.png",
plot = rotated_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
La rotation conserve les quatre noms complets. S’ils se chevauchent encore, raccourcir le texte ou élargir le graphique est généralement plus clair qu’augmenter l’angle. Dans l’environnement vérifié avec ggplot2 3.3.5, scale_x_discrete(guide = guide_axis(n.dodge = 2)) répartit les libellés discrets sur deux rangées ; la fonction figure aussi dans l’API actuelle. Ce décalage utilise davantage d’espace vertical. Consultez les autres méthodes pour faire pivoter les étiquettes d’axe dans R de base ou ggplot2.
Masquer précisément les étiquettes, les traits ou les graduations
Choisissez l’objet à supprimer au lieu de considérer ces réglages comme équivalents. Les trois objets suivants produisent des effets distincts :
control_plot <- base_plot +
theme_classic(base_size = 16)
labels_hidden <- control_plot +
theme(axis.text.x = element_blank())
ticks_hidden <- control_plot +
theme(axis.ticks.x = element_blank())
breaks_hidden <- control_plot +
scale_x_discrete(breaks = NULL)
control_plot utilise theme_classic(), qui dessine de petits traits de graduation et fournit donc une référence visible. labels_hidden supprime uniquement le texte imprimé. ticks_hidden retire seulement les traits ; les noms des catégories restent présents. breaks_hidden demande à l’échelle de ne produire aucune graduation principale, ce qui fait disparaître les libellés et les traits associés. Aucune expression ne filtre de ligne de plan_sales.
L’option labels = NULL masque les libellés au niveau de l’échelle tout en conservant les positions. Choisissez-la si l’échelle ne doit pas définir de texte. Préférez element_blank() si l’échelle reste pertinente mais qu’un thème particulier ne doit pas dessiner ce texte. Sans noms visibles, les catégories peuvent devenir impossibles à identifier ; ajoutez alors des annotations directes ou une autre clé.
Aucune image supplémentaire n’est enregistrée pour ces variantes, car le code sélectionnable et la description suffisent à les comparer. Affichez par exemple ticks_hidden dans la console R et comparez-le à control_plot. Les barres et leurs hauteurs doivent rester identiques ; seule la présentation de l’axe change. Si la géométrie varie ou si un avertissement mentionne des lignes supprimées, recherchez plutôt un appel à limits ailleurs dans le graphique.
Corriger des étiquettes incorrectes ou absentes
Si ggplot2 indique qu’une valeur continue a été fournie à une échelle discrète, ou inversement, examinez la colonne avec str() avant de modifier le graphique. Les facteurs et chaînes utilisent des échelles discrètes, les nombres des échelles continues, et les objets Date ou date-heure leurs échelles dédiées. Ne convertissez les données que si le nouveau type correspond à leur véritable sens.
Lorsque labels reçoit un vecteur de caractères, associez-le à des breaks explicites et conservez la même longueur. Sinon, les libellés peuvent se décaler après un filtrage, un réordonnancement ou l’ajout de catégories. Un vecteur nommé comme plan_names documente la correspondance. Une fonction évite le problème de longueur lorsqu’une transformation unique convient à chaque graduation.
Des barres absentes ou des avertissements sur des lignes supprimées signalent souvent limits, et non labels. Vérifiez qu’aucune valeur présente dans les données n’est omise des limites. Utilisez breaks si vous voulez seulement réduire le nombre de libellés visibles. Pour le zoom ou l’étendue, consultez comment définir les limites des axes ggplot2 sans les confondre avec les graduations.
Enfin, vérifiez si le texte visé est en réalité le titre de l’axe. labs(x = "Plan") et l’argument name d’une échelle x définissent ce titre. L’argument labels contrôle les étiquettes de graduation. Cette distinction évite de modifier correctement le titre tout en laissant les catégories ou nombres inchangés.
Pour la plupart des graphiques, choisissez l’échelle d’après le type des données, associez breaks et labels lorsque le texte exact importe, et réservez theme() à l’apparence. Les modifications restent ainsi prévisibles sans altérer les observations sous-jacentes.