Geoms (objets géométriques)

Dans ggplot2, un graphique se construit en déclarant des geoms, abréviation anglaise de geometric objects (objets géométriques). Les geoms sont déclarés de manière séquentielle ; un graphique peut donc contenir de nombreux geoms qui visualisent les données. Chaque geom porte un nom plus ou moins intuitif. La fonction geom_bar() crée des diagrammes en barres ; geom_line() crée des lignes ; geom_hline() crée des lignes horizontales ; geom_boxplot() crée des boîtes à moustaches (boxplots), etc. La liste ci-dessous présente les objets géométriques les plus courants, avec des liens vers la documentation. Le nom des fonctions indique ce qu'elles représentent.

[geom_abline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_hline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_vline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_bar()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_col()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [stat_count()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [stat_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [geom_blank()](https://ggplot2.tidyverse.org/reference/geom_blank.html) [geom_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [stat_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [geom_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [geom_abline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_hline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_vline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_bar()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_col()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [stat_count()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [stat_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [geom_blank()](https://ggplot2.tidyverse.org/reference/geom_blank.html) [geom_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [stat_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [geom_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [geom_contour_filled()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [stat_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) stat_contour_filled() [geom_count()](https://ggplot2.tidyverse.org/reference/geom_count.html) [stat_sum()](https://ggplot2.tidyverse.org/reference/geom_count.html) [geom_density()](https://ggplot2.tidyverse.org/reference/geom_density.html) [stat_density()](https://ggplot2.tidyverse.org/reference/geom_density.html) [geom_density_2d()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [geom_density_2d_filled()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [stat_density_2d()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [stat_density_2d_filled()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [geom_dotplot()](https://ggplot2.tidyverse.org/reference/geom_dotplot.html) [geom_errorbarh()](https://ggplot2.tidyverse.org/reference/geom_errorbarh.html) [geom_function()](https://ggplot2.tidyverse.org/reference/geom_function.html) [stat_function()](https://ggplot2.tidyverse.org/reference/geom_function.html) [geom_hex()](https://ggplot2.tidyverse.org/reference/geom_hex.html) [stat_bin_hex()](https://ggplot2.tidyverse.org/reference/geom_hex.html) [geom_freqpoly()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [geom_histogram()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [stat_bin()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [geom_jitter()](https://ggplot2.tidyverse.org/reference/geom_jitter.html) [geom_crossbar()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_errorbar()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_linerange()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_pointrange()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_map()](https://ggplot2.tidyverse.org/reference/geom_map.html) [geom_path()](https://ggplot2.tidyverse.org/reference/geom_path.html) [geom_line()](https://ggplot2.tidyverse.org/reference/geom_path.html) geom_step() geom_point() [geom_polygon()](https://ggplot2.tidyverse.org/reference/geom_polygon.html) [geom_qq_line()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [stat_qq_line()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [geom_qq()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [stat_qq()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [geom_quantile()](https://ggplot2.tidyverse.org/reference/geom_quantile.html) [stat_quantile()](https://ggplot2.tidyverse.org/reference/geom_quantile.html) [geom_ribbon()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [geom_area()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [stat_align()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [geom_rug()](https://ggplot2.tidyverse.org/reference/geom_rug.html) [geom_segment()](https://ggplot2.tidyverse.org/reference/geom_segment.html) [geom_curve()](https://ggplot2.tidyverse.org/reference/geom_segment.html) [geom_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) [stat_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) [geom_spoke()](https://ggplot2.tidyverse.org/reference/geom_spoke.html) [geom_label()](https://ggplot2.tidyverse.org/reference/geom_text.html) [geom_text()](https://ggplot2.tidyverse.org/reference/geom_text.html) [geom_raster()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_rect()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_tile()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_violin()](https://ggplot2.tidyverse.org/reference/geom_violin.html) [stat_ydensity()](https://ggplot2.tidyverse.org/reference/geom_violin.html)

Mappage esthétique des objets géométriques

Un objet géométrique doit savoir ce qu'il doit représenter. Cela se fait par le mappage esthétique (aesthetic mapping), qui précise par exemple les données de l'axe des x, de l'axe des y, etc. Le mappage esthétique est défini avec la fonction aes(). Un geom peut hériter du mappage esthétique de l'appel principal à ggplot(), ou bien le mappage peut être déclaré dans l'objet géométrique lui-même. Le principe est qu'un geom hérite toujours de aes() depuis ggplot(), sauf indication contraire dans le geom. Ci-dessous, deux graphiques identiques sont créés en spécifiant aes() respectivement dans ggplot() et dans geom_point(), qui crée un nuage de points (scatter plot) :

## aes() spécifié dans ggplot()
ggplot(data=mpg, aes(x = displ, y = hwy)) +
  geom_point()

## aes() spécifié dans geom_point()
ggplot(data=mpg) +
  geom_point(aes(x = displ, y = hwy))
Nuage de points de la consommation de carburant (hwy) en fonction de la cylindrée (displ) dans le jeu de données mpg
Nuage de points de la consommation de carburant (hwy) en fonction de la cylindrée (displ) dans le jeu de données mpg

Les objets géométriques sont définis en couches

Vous pouvez représenter plusieurs objets géométriques dans un même graphique en les déclarant de manière séquentielle. Une fois un objet géométrique déclaré, il doit être suivi de + et d'un saut de ligne pour continuer à déclarer des objets ou des paramètres. Ci-dessous, les données de mpg servent à visualiser la relation entre la cylindrée du moteur (displ) et la consommation de carburant (hwy) à l'aide de deux objets géométriques différents. Le premier objet est geom_point(), qui crée un nuage de points pour les observations. Le second est geom_smooth(), qui calcule automatiquement une courbe de régression flexible pour les observations ; celle-ci capture les tendances linéaires et non linéaires des données.

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  geom_smooth()
Nuage de points de hwy en fonction de displ avec une courbe de régression flexible bleue et une bande de confiance grise issues de geom_smooth

Notez que chaque objet géométrique a hérité du mappage esthétique (aes()) de ggplot(). Notez également que les points se trouvent sous la courbe de régression (ligne bleue), parce que geom_point() a été déclaré en premier dans le code ci-dessus.

Toutes les fonctions géométriques possèdent un argument aes(), ce qui signifie que le mappage esthétique peut aussi être déclaré dans l'objet géométrique. Le code ci-dessous produit un graphique identique au précédent, mais ici aes() est déclaré dans chaque geom :

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy)) +
  geom_smooth(aes(x = displ, y = hwy))
Nuage de points de hwy en fonction de displ avec une courbe de régression flexible bleue et une bande de confiance grise issues de geom_smooth

Un mappage esthétique se traduit différemment selon les geoms. Nous l'illustrons ci-dessous en associant la variable class (type de véhicule) à l'argument color dans aes(). Pour geom_point(), les points seront colorés selon le type de véhicule. Pour geom_smooth(), des courbes de régression distinctes seront calculées et colorées (avec les mêmes couleurs) :

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth()
Nuage de points de hwy en fonction de displ coloré selon le type de véhicule (class), avec une courbe de régression flexible par type de véhicule

Nous pouvons ignorer aes() dans ggplot() (ligne 1) et spécifier un aes() distinct dans geom_smooth() (ligne 3). Ci-dessous, nous le faisons en associant color à la transmission du véhicule (drv).

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(color=drv))
Nuage de points de hwy en fonction de displ coloré selon class, courbes de régression par transmission (drv) dans la même légende

Malheureusement, lorsque class et drv sont tous deux associés à color, nous obtenons une légende de couleurs à droite (au lieu de deux). Les codes couleur de drv (4, f, r) apparaissent donc dans la même colonne que ceux de class (2seater, compact, midsize, etc.), ce qui peut créer une ambiguïté lors de l'interprétation du graphique. Pour l'éviter, nous devons associer drv à un autre argument de aes(). Ici, nous pouvons associer drv à linetype, c'est-à-dire le type de ligne. Chaque niveau de drv reçoit alors son propre type de ligne. Notez aussi que nous spécifions se=FALSE pour supprimer l'intervalle de confiance des courbes, ainsi que method="lm", qui affiche une droite de régression linéaire au lieu d'une courbe flexible (ces ajouts visent à rendre le graphique plus lisible) :

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(linetype=drv), se=FALSE, method="lm")
Nuage de points de hwy en fonction de displ coloré selon class, avec des droites de régression linéaire dont le type de ligne indique la transmission (drv)

C'est réussi ! Voyez-vous si la relation entre displ et hwy varie selon les différentes combinaisons de suv et de drv ?

Un objet géométrique peut utiliser un sous-groupe du jeu de données. Reprenons le graphique ci-dessus en n'affichant la courbe de régression que pour les véhicules de la classe pickup :

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  geom_point() +
  geom_smooth(data=filter(mpg, class=="pickup"))
Nuage de points de hwy en fonction de displ coloré selon class, avec une courbe de régression flexible uniquement pour les pick-up

De la même manière, nous pouvons créer un objet géométrique pour mettre en valeur une partie des données. Nous procédons comme suit :

  1. Ligne 8 : ajouter un geom_point() uniquement avec les pick-up, sous forme de points noirs de taille 4,5.

  2. Ligne 9 : ajouter un geom_point() uniquement avec les pick-up, de taille 2,5. Ces points hériteront de color=class depuis ggplot().

  3. Ligne 12 : un geom_smooth() uniquement avec les pick-up.

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  # Tous les points de données
  geom_point() +

  # Points de données des pick-up
  geom_point(data=filter(mpg, class=="pickup"), size=4.5, color="black") +
  geom_point(data=filter(mpg, class=="pickup"), size=2.5) +

  # Courbe pour les pick-up
  geom_smooth(data=filter(mpg, class=="pickup"))
Nuage de points de hwy en fonction de displ où les pick-up sont mis en évidence par des points plus grands cerclés de noir et leur propre courbe de régression

L'objectif est de centrer le graphique sur les pick-up. Les points de taille 2,5 sont déclarés après les points de taille 4,5, de sorte que les petits points se superposent aux grands. L'objet geom_smooth() est déclaré en tout dernier et apparaît donc au premier plan du graphique.