De nombreuses extensions permettent d’étendre les possibilités graphiques de ggplot2. Certaines ont déjà été abordées dans les différents chapitres d’analyse-R. Le présent chapitre ne se veut pas exhaustif et ne présente qu’une sélection choisie d’extensions.

Le site ggplot2 extensions (https://exts.ggplot2.tidyverse.org/gallery/) recense diverses extensions pour ggplot2.

Pour une présentation des fonctions de base et des concepts de ggplot2, on pourra se référer au chapitre dédié ainsi qu’au deux chapitres introductifs : introduction à ggplot2 et graphiques bivariés avec ggplot2.

Pour trouver l’inspiration et des exemples de code, rien ne vaut l’excellent site https://www.r-graph-gallery.com/.

Nouvelles géométries

Étiquettes non superposées

Lorsque l’on affiche des étiquettes de texte, ces dernières peuvent se supperposer lorsqu’elles sont proches. Les géométries geom_text_repel et geom_label_repel de l’extension ggrepel prennent en compte la position des différentes étiquettes pour éviter qu’elles ne se chevauchent.

library(ggplot2)
library(ggrepel)
library(ggrepel)

dat <- subset(mtcars, wt > 2.75 & wt < 3.45)
dat$car <- rownames(dat)
p <- ggplot(dat) +
  aes(wt, mpg, label = car) +
  geom_point(color = "red")

p1 <- p + geom_text() +
  labs(title = "geom_text()")
p2 <- p + geom_text_repel() +
  labs(title = "geom_text_repel()")

cowplot::plot_grid(p1, p2, nrow = 1)

Pour plus d’informations : https://ggrepel.slowkow.com/

Graphiques en sucettes (lollipop)

L’extension ggalt propose une géométrie geom_lollipop permettant de réaliser des graphiques dit en sucettes.

df <- read.csv(text = "category,pct
Other,0.09
South Asian/South Asian Americans,0.12
Interngenerational/Generational,0.21
S Asian/Asian Americans,0.25
Muslim Observance,0.29
Africa/Pan Africa/African Americans,0.34
Gender Equity,0.34
Disability Advocacy,0.49
European/European Americans,0.52
Veteran,0.54
Pacific Islander/Pacific Islander Americans,0.59
Non-Traditional Students,0.61
Religious Equity,0.64
Caribbean/Caribbean Americans,0.67
Latino/Latina,0.69
Middle Eastern Heritages and Traditions,0.73
Trans-racial Adoptee/Parent,0.76
LBGTQ/Ally,0.79
Mixed Race,0.80
Jewish Heritage/Observance,0.85
International Students,0.87", stringsAsFactors = FALSE, sep = ",", header = TRUE)

library(ggplot2)
library(ggalt)
library(scales)

ggplot(df) +
  aes(y = reorder(category, pct), x = pct) +
  geom_lollipop(point.colour = "steelblue", point.size = 2, horizontal = TRUE) +
  scale_x_continuous(expand = c(0, 0), labels = percent, breaks = seq(0, 1, by = 0.2), limits = c(0, 1)) +
  labs(
    x = NULL, y = NULL,
    title = "SUNY Cortland Multicultural Alumni survey results",
    subtitle = "Ranked by race, ethnicity, home land and orientation\namong the top areas of concern",
    caption = "Data from http://stephanieevergreen.com/lollipop/"
  ) +
  theme_minimal()

Graphique d’haltères (dumbbell)

L’extension ggalt propose une géométrie geom_dumbbell permettant de réaliser des graphiques dit en haltères.

library(ggalt)
df <- data.frame(
  trt = LETTERS[1:5],
  l = c(20, 40, 10, 30, 50),
  r = c(70, 50, 30, 60, 80)
)

ggplot(df) +
  aes(y = trt, x = l, xend = r) +
  geom_dumbbell(
    size = 3,
    color = "#e3e2e1",
    colour_x = "#5b8124",
    colour_xend = "#bad744"
  ) +
  labs(x = NULL, y = NULL) +
  theme_minimal()

Accolades de comparaison (bracket)

La géométrie geom_braket de l’extension ggpubr permets d’ajouter sur un graphique des accolades de comparaison entre groupes.

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggplot(df) +
  aes(x = dose, y = len) +
  geom_boxplot() +
  geom_bracket(
    xmin = "0.5", xmax = "1", y.position = 30,
    label = "t-test, p < 0.05"
  )

ggplot(df) +
  aes(x = dose, y = len) +
  geom_boxplot() +
  geom_bracket(
    xmin = c("0.5", "1"),
    xmax = c("1", "2"),
    y.position = c(30, 35),
    label = c("***", "**"),
    tip.length = 0.01
  )

Plus d’informations : https://rpkgs.datanovia.com/ggpubr/

Diagramme en crêtes (ridges)

L’extension ggridges fournit une géométrie geom_density_ridges_gradient pour la création de diagramme en crêtes.

library(ggridges)
ggplot(lincoln_weather, aes(x = `Mean Temperature [F]`, y = Month, fill = stat(x))) +
  geom_density_ridges_gradient(scale = 3, rel_min_height = 0.01) +
  scale_fill_viridis_c(name = "Temp. [F]", option = "C") +
  labs(title = "Temperatures in Lincoln NE in 2016") +
  theme_ridges()
Picking joint bandwidth of 3.37

Plus d’informations : https://wilkelab.org/ggridges/

Graphique en gaufres (waffle)

L’extension waffle propose geom_waffle pour des graphiques dits en gaufres.

ATTENTION : elle s’installe avec la commande install.packages("waffle", repos = "https://cinc.rud.is").

library(waffle)
xdf <- data.frame(
  parts = factor(rep(month.abb[1:3], 3), levels = month.abb[1:3]),
  vals = c(10, 20, 30, 6, 14, 40, 30, 20, 10),
  fct = c(rep("Thing 1", 3), rep("Thing 2", 3), rep("Thing 3", 3))
)

ggplot(xdf) +
  aes(fill = parts, values = vals) +
  geom_waffle() +
  facet_wrap(~fct) +
  scale_fill_manual(
    name = NULL,
    values = c("#a40000", "#c68958", "#ae6056"),
    labels = c("Fruit", "Sammich", "Pizza")
  ) +
  coord_equal() +
  theme_minimal() +
  theme_enhance_waffle()

Plus d’informations : https://github.com/hrbrmstr/waffle

Graphique en mosaïque (mosaic plot)

L’extension ggmosaic permets de réaliser des graphiques en mosaïque avec geom_mosaic.

library(ggmosaic)
ggplot(data = fly) +
  geom_mosaic(
    aes(x = product(RudeToRecline), fill = RudeToRecline),
    na.rm = TRUE
  )

ggplot(data = fly) +
  geom_mosaic(
    aes(x = product(DoYouRecline, RudeToRecline), fill = DoYouRecline),
    na.rm = TRUE
  )

Plus d’informations : https://cran.r-project.org/web/packages/ggmosaic/vignettes/ggmosaic.html

Graphique de pirates : alternative aux boîtes à moustache (pirat plot)

Cette représentation alternative aux boîtes à moustache s’obtient avec la géométrie geom_pirate de l’extension ggpirate1.

library(ggplot2)
library(ggpirate)
ggplot(mpg, aes(x = class, y = cty)) +
  geom_pirate(aes(colour = class, fill = class)) +
  theme_bw()

Pour plus d’informations : https://github.com/mikabr/ggpirate

Axes, légende et facettes

Axes limités

coord_capped_cart et coord_capped_flip de l’extension lemon permet de limiter le dessin des axes au minimum et au maximum. Voir l’exemple ci-dessous.

library(ggplot2)
library(lemon)
p <- ggplot(mtcars) +
  aes(x = cyl, y = mpg) +
  geom_point() +
  theme_classic() +
  ggtitle("Axes classiques")
pcapped <- p +
  coord_capped_cart(bottom = "both", left = "both") +
  ggtitle("Axes limités")
cowplot::plot_grid(p, pcapped, nrow = 1)

Répéter les étiquettes des axes sur des facettes

Lorsque l’on réalise des facettes, les étiquettes des axes ne sont pas répétées.

library(ggplot2)
ggplot(mpg) +
  aes(displ, cty) +
  geom_point() +
  facet_wrap(~cyl)

L’extension lemon propose facet_rep_grid et facet_rep_wrap qui répètent les axes sur chaque facette.

library(lemon)
ggplot(mpg) +
  aes(displ, cty) +
  geom_point() +
  facet_rep_wrap(~cyl, repeat.tick.labels = TRUE)

Cartes

Voir le chapitre dédié.

Graphiques complexes

Graphiques divergents

L’extension ggcharts fournit plusieurs fonctions de haut niveau pour faciliter la réalisation de graphiques divergents en barres (diverging_bar_chart), en sucettes (diverging_lollipop_chart) voire même une pyramide des âges (pyramid_chart).

library(ggcharts)
data(mtcars)
mtcars_z <- dplyr::transmute(
  .data = mtcars,
  model = row.names(mtcars),
  hpz = scale(hp)
)

diverging_bar_chart(data = mtcars_z, x = model, y = hpz)

diverging_lollipop_chart(
  data = mtcars_z,
  x = model,
  y = hpz,
  lollipop_colors = c("#006400", "#b32134"),
  text_color = c("#006400", "#b32134")
)

data("popch")
pyramid_chart(data = popch, x = age, y = pop, group = sex)
Warning: `expand_scale()` is deprecated; use `expansion()`
instead.

Warning: `expand_scale()` is deprecated; use `expansion()`
instead.

Warning: `expand_scale()` is deprecated; use `expansion()`
instead.

Warning: `expand_scale()` is deprecated; use `expansion()`
instead.

Graphiques interactifs

Voir le chapitre dédie.

Graphiques animés

L’extension gganimate permets de réaliser des graphiques animés.

Voici un exemple :

library(ggplot2)
library(gganimate)
library(gapminder)

ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  facet_wrap(~continent) +
  # Here comes the gganimate specific bits
  labs(title = "Year: {frame_time}", x = "GDP per capita", y = "life expectancy") +
  transition_time(year) +
  ease_aes("linear")

Voir le site de l’extension (https://gganimate.com/) pour la documentation et des tutoriels. Il est conseillé d’installer également l’extension gifski avec gganimate.

Surligner certaines données

L’extension gghighlight fournit une fonction gghiglight qui permets de surligner les données qui remplissent des conditions spécifiées.

d <- purrr::map_dfr(
  letters,
  ~ data.frame(
    idx = 1:400,
    value = cumsum(runif(400, -1, 1)),
    type = .,
    flag = sample(c(TRUE, FALSE), size = 400, replace = TRUE),
    stringsAsFactors = FALSE
  )
)

ggplot(d) +
  aes(x = idx, y = value, colour = type) +
  geom_line()

library(gghighlight)
ggplot(d) +
  aes(x = idx, y = value, colour = type) +
  geom_line() +
  gghighlight(max(value) > 20)
label_key: type

ggplot(iris, aes(Sepal.Length, fill = Species)) +
  geom_histogram() +
  gghighlight() +
  facet_wrap(~Species)

Thèmes et couleurs

Palettes de couleurs

Voir le chapitre Couleurs et palettes pour une sélection d’extensions proposant des palettes de couleurs additionnelles.

hrbrthemes

L’extension hrbrthemes fournit plusieurs thèmes graphiques pour ggplot2. Un exemple ci-dessous. Pour plus d’informations, voir https://github.com/hrbrmstr/hrbrthemes.

library(ggplot2)
library(hrbrthemes)
ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(color = factor(carb))) +
  labs(
    x = "Fuel efficiency (mpg)", y = "Weight (tons)",
    title = "Seminal ggplot2 scatterplot example",
    subtitle = "A plot that is only useful for demonstration purposes",
    caption = "Brought to you by the letter 'g'"
  ) +
  scale_color_ipsum() +
  theme_ipsum_rc()

ggthemes

ggthemes propose une vingtaine de thèmes différentes présentés sur le site de l’extension : https://jrnold.github.io/ggthemes/.

Voir ci-dessous un exemple du thème theme_tufte inspiré d’Edward Tufte.

library(ggplot2)
library(ggthemes)

p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  scale_x_continuous(breaks = extended_range_breaks()(mtcars$wt)) +
  scale_y_continuous(breaks = extended_range_breaks()(mtcars$mpg)) +
  ggtitle("Cars")

p + geom_rangeframe() +
  theme_tufte()

p + geom_rug() +
  theme_tufte(ticks = FALSE)

Combiner plusieurs graphiques

Voir le chapitre dédié.


  1. Cette extension n’étant pas sur CRAN, on l’installera avec la commande devtools::install_github("mikabr/ggpirate").↩︎