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")

Rendering [------------------------] at 2.1 fps ~ eta: 47s
Rendering [------------------------] at 1.8 fps ~ eta:  1m
Rendering [>-----------------------] at 1.7 fps ~ eta:  1m
Rendering [>-----------------------] at 1.8 fps ~ eta:  1m
Rendering [>-----------------------] at 1.7 fps ~ eta:  1m
Rendering [=>----------------------] at 1.7 fps ~ eta:  1m
Rendering [==>---------------------] at 1.6 fps ~ eta:  1m
Rendering [===>--------------------] at 1.6 fps ~ eta:  1m
Rendering [====>-------------------] at 1.6 fps ~ eta:  1m
Rendering [====>-------------------] at 1.5 fps ~ eta:  1m
Rendering [=====>------------------] at 1.5 fps ~ eta:  1m
Rendering [=====>------------------] at 1.5 fps ~ eta: 49s
Rendering [=====>------------------] at 1.5 fps ~ eta: 48s
Rendering [=====>------------------] at 1.6 fps ~ eta: 47s
Rendering [======>-----------------] at 1.6 fps ~ eta: 46s
Rendering [======>-----------------] at 1.6 fps ~ eta: 45s
Rendering [======>-----------------] at 1.6 fps ~ eta: 44s
Rendering [======>-----------------] at 1.6 fps ~ eta: 43s
Rendering [=======>----------------] at 1.6 fps ~ eta: 42s
Rendering [=======>----------------] at 1.6 fps ~ eta: 41s
Rendering [=======>----------------] at 1.6 fps ~ eta: 40s
Rendering [=======>----------------] at 1.6 fps ~ eta: 39s
Rendering [========>---------------] at 1.7 fps ~ eta: 39s
Rendering [========>---------------] at 1.7 fps ~ eta: 38s
Rendering [========>---------------] at 1.6 fps ~ eta: 37s
Rendering [=========>--------------] at 1.6 fps ~ eta: 37s
Rendering [=========>--------------] at 1.6 fps ~ eta: 36s
Rendering [==========>-------------] at 1.6 fps ~ eta: 36s
Rendering [==========>-------------] at 1.6 fps ~ eta: 35s
Rendering [==========>-------------] at 1.6 fps ~ eta: 34s
Rendering [===========>------------] at 1.5 fps ~ eta: 34s
Rendering [===========>------------] at 1.5 fps ~ eta: 33s
Rendering [===========>------------] at 1.5 fps ~ eta: 32s
Rendering [===========>------------] at 1.5 fps ~ eta: 31s
Rendering [============>-----------] at 1.5 fps ~ eta: 30s
Rendering [============>-----------] at 1.6 fps ~ eta: 30s
Rendering [============>-----------] at 1.6 fps ~ eta: 29s
Rendering [============>-----------] at 1.6 fps ~ eta: 28s
Rendering [=============>----------] at 1.6 fps ~ eta: 28s
Rendering [=============>----------] at 1.6 fps ~ eta: 27s
Rendering [=============>----------] at 1.6 fps ~ eta: 26s
Rendering [==============>---------] at 1.6 fps ~ eta: 25s
Rendering [==============>---------] at 1.6 fps ~ eta: 24s
Rendering [==============>---------] at 1.6 fps ~ eta: 23s
Rendering [===============>--------] at 1.6 fps ~ eta: 22s
Rendering [===============>--------] at 1.6 fps ~ eta: 21s
Rendering [===============>--------] at 1.6 fps ~ eta: 20s
Rendering [================>-------] at 1.6 fps ~ eta: 19s
Rendering [================>-------] at 1.6 fps ~ eta: 18s
Rendering [================>-------] at 1.6 fps ~ eta: 17s
Rendering [=================>------] at 1.6 fps ~ eta: 16s
Rendering [=================>------] at 1.7 fps ~ eta: 16s
Rendering [=================>------] at 1.7 fps ~ eta: 15s
Rendering [=================>------] at 1.7 fps ~ eta: 14s
Rendering [==================>-----] at 1.7 fps ~ eta: 13s
Rendering [==================>-----] at 1.7 fps ~ eta: 12s
Rendering [==================>-----] at 1.7 fps ~ eta: 11s
Rendering [===================>----] at 1.7 fps ~ eta: 11s
Rendering [===================>----] at 1.7 fps ~ eta: 10s
Rendering [===================>----] at 1.7 fps ~ eta:  9s
Rendering [====================>---] at 1.7 fps ~ eta:  8s
Rendering [====================>---] at 1.7 fps ~ eta:  7s
Rendering [====================>---] at 1.7 fps ~ eta:  6s
Rendering [=====================>--] at 1.7 fps ~ eta:  6s
Rendering [=====================>--] at 1.7 fps ~ eta:  5s
Rendering [=====================>--] at 1.7 fps ~ eta:  4s
Rendering [======================>-] at 1.7 fps ~ eta:  3s
Rendering [======================>-] at 1.7 fps ~ eta:  2s
Rendering [=======================>] at 1.8 fps ~ eta:  1s
Rendering [========================] at 1.8 fps ~ eta:  0s
                                                          

Frame 1 (1%)
Frame 2 (2%)
Frame 3 (3%)
Frame 4 (4%)
Frame 5 (5%)
Frame 6 (6%)
Frame 7 (7%)
Frame 8 (8%)
Frame 9 (9%)
Frame 10 (10%)
Frame 11 (11%)
Frame 12 (12%)
Frame 13 (13%)
Frame 14 (14%)
Frame 15 (15%)
Frame 16 (16%)
Frame 17 (17%)
Frame 18 (18%)
Frame 19 (19%)
Frame 20 (20%)
Frame 21 (21%)
Frame 22 (22%)
Frame 23 (23%)
Frame 24 (24%)
Frame 25 (25%)
Frame 26 (26%)
Frame 27 (27%)
Frame 28 (28%)
Frame 29 (29%)
Frame 30 (30%)
Frame 31 (31%)
Frame 32 (32%)
Frame 33 (33%)
Frame 34 (34%)
Frame 35 (35%)
Frame 36 (36%)
Frame 37 (37%)
Frame 38 (38%)
Frame 39 (39%)
Frame 40 (40%)
Frame 41 (41%)
Frame 42 (42%)
Frame 43 (43%)
Frame 44 (44%)
Frame 45 (45%)
Frame 46 (46%)
Frame 47 (47%)
Frame 48 (48%)
Frame 49 (49%)
Frame 50 (50%)
Frame 51 (51%)
Frame 52 (52%)
Frame 53 (53%)
Frame 54 (54%)
Frame 55 (55%)
Frame 56 (56%)
Frame 57 (57%)
Frame 58 (58%)
Frame 59 (59%)
Frame 60 (60%)
Frame 61 (61%)
Frame 62 (62%)
Frame 63 (63%)
Frame 64 (64%)
Frame 65 (65%)
Frame 66 (66%)
Frame 67 (67%)
Frame 68 (68%)
Frame 69 (69%)
Frame 70 (70%)
Frame 71 (71%)
Frame 72 (72%)
Frame 73 (73%)
Frame 74 (74%)
Frame 75 (75%)
Frame 76 (76%)
Frame 77 (77%)
Frame 78 (78%)
Frame 79 (79%)
Frame 80 (80%)
Frame 81 (81%)
Frame 82 (82%)
Frame 83 (83%)
Frame 84 (84%)
Frame 85 (85%)
Frame 86 (86%)
Frame 87 (87%)
Frame 88 (88%)
Frame 89 (89%)
Frame 90 (90%)
Frame 91 (91%)
Frame 92 (92%)
Frame 93 (93%)
Frame 94 (94%)
Frame 95 (95%)
Frame 96 (96%)
Frame 97 (97%)
Frame 98 (98%)
Frame 99 (99%)
Frame 100 (100%)
Finalizing encoding... done!

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").↩︎