Représentation graphique avec R

Tour d’horizon personnel des fonctionnalités graphiques disponibles

Hugues Pecout (CNRS, UMR Géographie-Cités)

Journées annuelles SO-MATE 2023, Limoges

Bonjour


Hugues Pecout, ingénieur d’études CNRS en sciences de l’information géographique

Travail dans le domaine de la géographie humaine et quantitative (et un peu quali !) : collecte, gestion, traitement, enrichissement, analyse (statistique, spatiale, de réseau, textuelle…), représentation graphique et cartographie de données géographiques hétérogènes (données conventionnelles, données d’enquête, IGV, webscraping…).


Spécialisé dans l’utilisation de R depuis 2015

Depuis 2018 : Coordination du projet Rzine
Depuis 2022 : Co-animateur du groupe d’utilisateur·rices ElementR
Depuis 2021 : Membre du Groupe de travail Notebook

Outils de représentation de données

Graphiques avec Excel

Rapide
Facile


Fonctionnalités disponibles :

❌ Graphiques par défault
❌ Types de graphiques
❌ Interactivité


Gestion des données :

❌ Manipulation des données
❌ Statistiques
❌ Données volumineuses


Reproductibilité :

❌ Automatisation du pipeline
❌ Collaboration
❌ Versioning

Mais la représentation graphiques avec Excel connaît des limites…

Graphiques avec des outils dédiés

Des fonctionnalités avancées et des sorties graphiques très élégantes, mais des logiciels payants.

Bon outils si on ne pratique pas R régulièrement, mais limité notamment en matière de reproductibilité.



Graphiques avec R ?

I. Représentation graphique en R-base

Fonctions graphiques R-base (1995)

La version 1.0 de R a été publiée en 2000, mais ce langage est distribué en tant que logiciel Open Source et avec des fonctions graphiques depuis 1995. Au centre de l’ecosystème graphique du R-base : la fonction plot()

plot(x = 1, y = 1)

plot()

Une fonction générique très pratique pour l’exploration, qui s’adapte aux différents types des données.

1 variable quantitative - Nuage de points ordonnés

plot(cars$speed)

2 variables quantitatives - Nuage de points

plot(speed ~ dist, data = cars)

1 variable quanti vs 1 variable quali - Boîte à moustache

plot(ncases ~ agegp, data = esoph)

1 variable qualitative - Diagramme en barre

plot(esoph$agegp)

2 variables qualitatives - Graphique en mosaic

plot(alcgp ~ agegp, data = esoph)

1 variable quali vs 1 variable quanti - Spine plot

plot(agegp ~ ncases, data = esoph)

Un tableau de données complet - Un seul type de graphique

plot(iris)

Autres fonctions graphiques R-base

  • hist() : histogramme de distribution
  • stripchart() : diagrammes de dispersion
  • dotchart() : diagramme en points de Cleveland
  • boxplot() : diagramme en boîte
  • qqnorm() : diagramme quantile-quantile théorique normal
  • qqplot() : diagramme quantile-quantile empirique
  • barplot() : diagramme à barres
  • pie() : diagramme en secteurs
  • mosaicplot() : diagramme en mosaïque
  • spineplot() : diagrammes en épine (entre l’histogramme et le mosaic plot)
  • curve() : Représentation d’une expression mathématique
  • matplot() : Dispersions de toutes le variables d’un tableau (un graphique)
  • pairs() : Matrice de nuage de point pour l’ensemble des variables d’un tableau
  • etc….

Note

En fonction du type de variable, la fonction plot() renvoie vers les fonctions barplot(), spineplot(), stripchart(), boxplot(), curve(), pairs()

Histogramme de distribution

hist(cars$speed)

Diagrammes de dispersion

stripchart(cars$speed, method = "stack")

Diagrammes en épine

spineplot(agegp ~ ncases, data = esoph)

Boîte à moustache

boxplot(cars$speed)

Diagramme en points de Cleveland

dotchart(cars$speed)

Camembert

# Create data for the graph.
tab <- data.frame(
          name = c("A", "B", "C"),
          value = c(19,53, 88)
         )

# Plot the chart.
pie(tab$value, tab$name)

Diagramme à barres

barplot(table(esoph$agegp))

Expression mathématique

curve(expr = x^3)

Nuage de points - toutes les variables

pairs(iris)

Les arguments des fonctions graphiques

Une multitude d’arguments permettent de paramétrer la mise en page d’un graphique.

plot(y ~ x, 
  type = "o", # type de tracé: points ("p"), lignes ("l"), les deux ("b" ou "o"), ...
  col = "red", # couleur, tapez `colours()` pour la liste complète
  pch = 20, # type de symboles, un chiffre entre 0 et 25, tapez `?points`
  cex = 1.1, # taille des symboles
  lty = 1, # type de lignes, un chiffre entre 1 et 6
  lwd = 1.4, # taille de lignes
  xlim = c(-2.5, 2.5), # limites de l'axe des x
  ylim = c(-1.5, 1.5), # limites de l'axe des y)
  xlab = "La variable x", # titre pour l'axe des x
  ylab = "Le sinus  de x", # titre pour l'axe des y
  main = "La fonction sinus entre -pi et pi" # titre général pour le graphique
) 

Les fonctions R-base de mise en page

Plusieurs fonctions permettent d’ajouter des éléments sur un graphique existant.

Code
plot(y ~ x, 
  type = "o", # type de tracé: points ("p"), lignes ("l"), les deux ("b" ou "o"), ...
  col = "red", # couleur, tapez `colours()` pour la liste complète
  pch = 20, # type de symboles, un chiffre entre 0 et 25, tapez `?points`
  cex = 1.1, # taille des symboles
  lty = 1, # type de lignes, un chiffre entre 1 et 6
  lwd = 1.4, # taille de lignes
  xlim = c(-2.5, 2.5), # limites de l'axe des x
  ylim = c(-1.5, 1.5), # limites de l'axe des y)
  xlab = "La variable x", # titre pour l'axe des x
  ylab = "Le sinus  de x") # titre pour l'axe des y) 

# Ajout d'un TITRE
title("Titre de mon graphique", 
      cex.main = 1.2,  
      font.main= 4, 
      col.main= "red4")

# Ajout d'une LEGENDE
legend(x = 0.9, # Emplacement de la légende (coin haut gauche)
       y = -1.1, # Emplacement de la légende (coin haut gauche)
       legend = "Fonction sinus entre -pi et pi", 
       bg = "lightgoldenrod",
       col = "red",
       pch = 20,
       cex = 0.7, # Taille de lé lagende
       lty = 1, 
       lwd = 1.4)

# Ajout d'une LIGNE (horizontale)
abline(h = 0, # Coupe l'axe des y à cette valeur 
       lty = 2, # Type de ligne
       lwd = 0.5, # épaisseur
       col = "grey50")

# Ajout d'un POINT
points(x = -0, 
       y = 0, 
       col = "red4", 
       pch = 20,# Type de symbol
       cex = 4)

# Ajout de TEXTE
text("x = 0 = y", # Texte à afficher
     x = 0.4, # Emplacement du texte (centre)
     y = -0.16, # Emplacement du texte (centre)  
     col = "red4")     

# Ajout de TEXTE dans la marge
mtext(text = "Source : données complétement fictives", # Texte à afficher
     side = 4, # Emplacement (1 = bottom, 2 = left, 3 = top...)
     cex = 0.9, # Taille de la police
     col = "grey")  

Gestion de la fenêtre graphique

Trois fonctions permettent de gérer les paramètres de la fenêtre graphique.

I. par() pour définir ou interroger les paramètres de la fenêtre graphique.

Code
par(bg = "royalblue1", # Couleur de fond
    col= "white",      # couleur du graphique
    mfrow = c(2,2),    # Fenêtre découper en deux lignes / deux colonnes (4 graphiques)
    mar = c(5,5,5,5))  # Gestion des marges pour chaque graphique (B,L,T,R)

plot(x = log(1:10), y = 10:1, main = "plot 1")
plot(x = exp(1:10), y = log(1:10), main = "plot 2")
plot(x = sin(1:10), y = 1:10, main = "plot 3")
plot(x = 1:10, y = exp(1:10), main = "plot 4")

II. layout() propose moins d’arguments mais permet un meilleur ajustement de la disposition des figures.

Code
matrix(c(4, 3, 3, 1, 2, 2, 1, 2, 2), 3, 3)
     [,1] [,2] [,3]
[1,]    4    1    1
[2,]    3    2    2
[3,]    3    2    2

Avec la matrice ci-dessus, la fenêtre graphique sera paramétrée pour contenir trois graphiques. Le graphique 1 occupera toute la première ligne. le graphique 2 occupera les deux dernières lignes de la première colonne, et le 3e sera situé dans les deux dernières lignes de la dernière colonne.

Code
# Découpage de la fenêtre graphique
layout(mat = matrix(c(4, 3, 3, 1, 2, 2, 1, 2, 2), 3, 3))

hist(co2, main = "co2")
plot(co2)
boxplot(co2, axes = FALSE)
qqnorm(co2, main = "")

II. dev.off() ferme le graphique en cours et réinitialise par défault la fenêtre graphique.

Code
par(bg = "royalblue1") 

plot(1,1)

Code
dev.off()
null device 
          1 
Code
plot(1,1)

La fonction locator()


  • Permet de récupérer des coordonnées dans la fenêtre graphique

 

  • Peut être utilisé pour du placement intéractif d’éléments de mise en page

 
 

Attention

Ne fonctionne pas avec tous les packages qui proposent des représentations graphiques sur un système de référence orthonormé différent de celui proposé par défault par la fénétre graphique.

Limites des fonctions graphiques R-base


Si il existe déjà un certains nombre de fonctionnalités pour la représentation graphique en R-base, ce socle commun présente des limites. Ces fonctions sont très simples d’utilisation, mais sont à privilégier dans un contexte d’exploration des données car :

  • Les types de représentation graphique sont limitées
  • La syntaxe est peu générique
  • Un graphique + les éléments de mise en page ne peuvent pas être stockés dans un seul objet
  • Le rendu graphique restera toujours assez rudimentaire…


Les extensions graphiques

Il existe de nombreux packages qui offrent une palette importante de fonctionnalités pour la production de graphiques spécifiques et élégants, en seulement quelques lignes de code…

II. La révolution ggplot2

L’avant ggplot2

Le package lattice (Sarkar 2008), sortie en 2001, vise à améliorer les graphiques de base de R en fournissant des valeurs par défaut améliorées et une visualisation simplifiée des relations multivariées.

L’une de ses principales caractéristiques est la prise en charge de la création de graphiques en treillis, qui permettent d’afficher des variables ou des relations entre variables, conditionnées par une ou plusieurs autres variables.

Note

Ce package apporte des fonctionnalités supplémentaires aux fonctions graphiques R-base. Cependant, le rendu graphique reste rudimentaire.

ggplot2 (2007 - 2012)

le package ggplot2 (Wickham 2016) est une véritable révolution en matière de représentation graphique, qui dépasse le périmètre de la communauté R. Ce package :

  • Repose sur le concept de La Grammar of Graphics (Wilkinson 1999)
  • Produit des graphiques très élégants par défault
  • Est adapté au développement d’extensions
  • Ouvre la possibilité de construire des représentations graphiques variées et personnalisées.

ggplot2, au delà de R…

La syntaxe de la grammaire des graphiques, implementée dans un premier temps en langage R, a été reprise et adaptée dans plusieurs langages de programmation.


La grammaire des graphiques avec ggplot2 :

library(ggplot2)

ggplot(data = cars) +
  geom_point(aes(x = Horsepower,
                 y = Miles_per_Gallon,
                 color = Origin))

La grammaire des graphiques en Python (altair)


import altair as alt

alt.Chart(cars).
  mark_circle(size=60).
  encode(x='Horsepower',
         y='Miles_per_Gallon',
         color='Origin')

La grammaire des graphiques en JavaScript (vegalite)


{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {"url": "data/cars.json"},
  "mark": "point",
  "encoding": {
    "x": {"field": "Horsepower",
          "type": "quantitative"},
    "y": {"field": "Miles_per_Gallon",
          "type": "quantitative"},
    "color": {"field": "Origin",
              "type": "nominal"}
  }
}

La grammaire des graphiques en Observable JS (Plot)


Plot.plot({
  grid: true,
  color: {
    legend: true
  },
  marks: [
    Plot.dot(cars, {
    x: "Horsepower",
    y: "Miles_per_Gallon",
    fill: "Origin"
    })
  ]
})

Les extensions de ggplot2

De nombreuses extensions de ggplot2 ont été développées et offrent de nouvelles fonctionnalités en matière de mise en forme, de types de représentation graphique, d’animation, d’intéractivité, d’objet pris en compte…

esquisse, pour se lancer !

esquisse est un package français (Meyer et Perrier 2022). C’est l’une des extensions ggplot2 les plus téléchargées. Il s’agit d’un addin (shiny) pour créer des graphiques ggplot2 de manière interactive, puis récupérer le code R généré automatiquement.

library(esquisse)

esquisser()

ggplot2, de la customization avancée…

X-Men Characters, by Cedric Scherer

https://www.cedricscherer.com/top/dataviz/


Best selling Authors, by Tania Shapiro

https://www.tanyashapiro.com/


Spatio-temporal Wikidata. Exploration de données ouvertes et liées du web 3.0, par R. Krummeich, H. Pecout & S. Rey-Coyrehourcq

https://rzine-reviews.github.io/wikidata_sparql_rzine/#content

… à l’art graphique numérique

Thomas Lin Pedersen (Rstudio)

https://www.data-imaginist.com/art





Palettes de couleurs

De nombreuses palettes de couleurs sont directement disponibles en R-base :

Au cas où, près de 70 (!) packages proposent des palettes de couleurs

cols4all::c4a_gui()

III. Packages thématiques et représentation graphique

Analyse statistique multivariée


Package FactoMineR (Lê, Josse, et Husson 2008)

Et ses packages d’exploration et de visualisation associés : FactoInvestigate, factoextra, Factoshiny

Code
par(mfrow = c(2, 3))

library("factoextra")
data("decathlon2")

df <- decathlon2[1:23, 1:10]

library("FactoMineR")
res.pca <- PCA(df,  graph = FALSE)

# Visualize eigenvalues/variances
fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 50))

Code
fviz_pca_var(res.pca, col.var="contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Avoid text overlapping
             )

Code
# Contributions of variables to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)

Code
# Contributions of variables to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)

Code
fviz_pca_ind(res.pca, col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Avoid text overlapping (slow if many points)
             )

Code
# Biplot of individuals and variables
fviz_pca_biplot(res.pca, repel = TRUE)

Code
# Compute PCA on the iris data set
# The variable Species (index = 5) is removed
# before PCA analysis
iris.pca <- PCA(iris[,-5], graph = FALSE)

# Visualize
# Use habillage to specify groups for coloring
fviz_pca_ind(iris.pca,
             label = "none", # hide individual labels
             habillage = iris$Species, # color by groups
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE # Concentration ellipses
             )


Package explor (Barnier 2023)

library(FactoMineR)
data(hobbies)
res.mca <- MCA(hobbies,quali.sup=19:22,quanti.sup=23)

library(explor)
explor(res.mca)

Textométrie - Nuage de mots


Package wordcoud (Fellows 2018)

Code
library(wordcloud) 


wordcloud(words = demoFreq$word, 
          freq = demoFreq$freq, 
          min.freq = 1,
          max.words=200, 
          random.order=FALSE, 
          rot.per=0.35,            
          colors=brewer.pal(8, "Dark2"))


Package wordcoud2 (Lang et Chien 2018)

Code
library(wordcloud2) 

wordcloud2(demoFreq, size = 0.7, shape = 'star')


Ou ggwordcloud et ggwordcloud2 si vous préférez la syntaxe ggplot.

Analyse de réseaux


Package igraph (Csárdi et al. 2023)

Code
# Chargement jeu de données exemple
library(igraphdata)
data(karate)

# Affichage d'un objet igraph (réseau)
library(igraph)
plot(karate)

Code
# Mise en page  d
plot(karate, 
     vertex.color = V(karate)$Faction,      # couleur des sommets
     vertex.frame.color = "white",          # couleur des contours des sommets
     vertex.shape = "square",               # forme des sommets
     vertex.size = degree(karate),          # taille des sommets
     vertex.label = NA,                     # étiquettes des sommets
     vertex.label.degree = 0,       # position / au centre du sommet (0 = droite, "pi"= gauche)
     edge.color = "goldenrod3",     # couleur des arêtes
     edge.curved=.1,                # courbure des arêtes (0 = droit)
     # arrow.mode = 3,              # type de flèche 
     # edge.arrow.size = 12,        # taille de la pointe de la flèche
     edge.width = E(karate)$weight,          # largeur des arêtes
     edge.lty = 1,                           # type de trait (1=plein, 2=pointillés, 3=points...)
     margin =  c(0,0,0.2,0),                 # marges
     main = graph_attr(karate, "name"),      # titre principal
     sub = graph_attr(karate, "Author"),     # sous-titre
     layout = layout_(karate, with_lgl()))             # sous-titre                   


Package ggraph (Pedersen 2022)

Code
library(ggraph)
library(tidygraph)
library(tidyverse)

# Create graph of highschool friendships
graph <- as_tbl_graph(highschool) %>% 
    mutate(Popularity = centrality_degree(mode = 'in'))

# plot using ggraph
ggraph(graph, layout = 'kk') + 
    geom_edge_fan(aes(alpha = after_stat(index)), show.legend = FALSE) + 
    geom_node_point(aes(size = Popularity)) + 
    facet_edges(~year) + 
    theme_graph(foreground = 'steelblue', fg_text_colour = 'white')

Analyse de séquence


Package TraMineR

Code
library(TraMineR)

data(mvad)

mvad.alphabet <- c("employment", "FE", "HE", "joblessness", "school", "training")
mvad.labels <- c("employment", "further education", "higher education", "joblessness", "school", "training")
mvad.scodes <- c("EM", "FE", "HE", "JL", "SC", "TR")

mvad.seq <- seqdef(mvad, 17:86, 
                   alphabet = mvad.alphabet, 
                   states = mvad.scodes, 
                   labels = mvad.labels, 
                   xtstep = 6)

par(mfrow = c(2, 2))

seqiplot(mvad.seq, with.legend = FALSE, border = NA, main = "The first 10 sequences in the mvad.seq sequence object")
seqIplot(mvad.seq, sortv = "from.start", with.legend = FALSE, main = "All the sequences in the data set, sorted by states from start")
seqfplot(mvad.seq, with.legend = FALSE, border = NA, main ="The 10 most frequent sequences.")
seqlegend(mvad.seq)


  • Gabadinho, A. & Ritschard, G. (2013), Searching for typical life trajectories applied to child birth histories, In R. Lévy & E. Widmer (eds.), Gendered life courses. pp. 287-312. Vienna: LIT
  • Gabadinho, A., Ritschard, G., Müller, N. S., & Studer, M. (2011). Analyzing and Visualizing State Sequences in R with TraMineR. Journal of Statistical Software, 40(4), 1-37. DOI https://doi.org/10.18637/jss.v040.i04. s

Du coté des sciences dures…

Carte de chaleur


Package superheat (Barter et Yu 2017)


Package ComplexHeatmap (Gu 2022)

Graphique circulaire


Package circlize (Gu et al. 2014)

Graphique “3D”


Package Scatterplot3D (Ligges et Mächler 2003)

Code
library(scatterplot3d)

shapes = c(16, 17, 18) 
shapes <- shapes[as.numeric(iris$Species)]
colors <- c("#999999", "#E69F00", "#56B4E9")
colors <- colors[as.numeric(iris$Species)]


s3d <- scatterplot3d(iris[,1:3], 
                     pch = shapes, 
                     color= colors )

legend("bottom", legend = levels(iris$Species),
      col =  c("#999999", "#E69F00", "#56B4E9"), 
      pch = c(16, 17, 18), 
      inset = -0.25, xpd = TRUE, horiz = TRUE)

Cartographie 😄


Package sf (Pebesma 2018)

Pour importer, manipuler, traiter et afficher des données géographiques vectorielles.

library(sf)

mtq <- st_read(dsn = "data/mtq.gpkg", layer = "mtq")
Reading layer `mtq' from data source 
  `C:\Users\HP\Desktop\SO_MATE_2023\data\mtq.gpkg' using driver `GPKG'
Simple feature collection with 34 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 690574 ymin: 1592536 xmax: 735940.2 ymax: 1645660
Projected CRS: WGS 84 / UTM zone 20N
plot(mtq)

plot(st_geometry(mtq))


Package terra (Hijmans 2023)

Pour importer, manipuler, traiter et afficher des données géographiques raster (avec vecteur).

library(terra)

# Couche raster
alt_raw <- rast("data/altitude.tif") 

plot(alt_raw)

# Couche vecteur
mtq_terra <- vect("data/mtq.gpkg", layer="mtq")

plot(mtq_terra)


Package mapsf (Giraud 2022)

Pour produire des cartes thématiques.

library(mapsf)

mf_map(x = mtq)

mf_map(x = mtq, 
       var = "POP", 
       type = "prop")

mf_layout(title = "Population in Martinique",
          credits = "H. Pecout; Sources: INSEE & IGN, 2018")

Code
mf_theme("agolalight", bg = "ivory1")

mf_export(
  x = mtq, filename = "images/mtq.png",
  width = 600, res = 120,
  expandBB = c(0, 0, 0, .3)
)

mf_shadow(mtq, col = "grey90", add = TRUE)

mf_map(
  x = mtq, var = "MED", type = "choro",
  pal = "Dark Mint",
  breaks = "quantile",
  nbreaks = 6,
  leg_title = "Median Income\n(euros)",
  leg_val_rnd = -2,
  add = TRUE
)

mf_inset_on(x = "worldmap", pos = "right")

mf_worldmap(mtq, col = "#0E3F5C")

mf_inset_off()

mf_title("Wealth in Martinique, 2015")

mf_credits("T. Giraud\nSources: INSEE & IGN, 2018")

mf_scale(size = 5)

mf_arrow("topleft")

dev.off()


Package tmap (Tennekes 2018)

Pour produire des cartes thématiques statique ou intéractive avec la syntaxe ggplot.

library(tmap)

tm_shape(mtq) +
    tm_polygons("STATUS")

tmap_mode("view")

tm_shape(mtq) +
    tm_polygons("STATUS")


Ou encore ggplot2 & ggmap (Kahle et Wickham 2013)

IV. Animation & intéractivité

Représentation animée

Il est possible de crée un GIF ou une vidéo à partir de plusieurs images avec R. L’étendue des possibilités de réaliser des animation graphique est donc large… Mais il faut être prêt à bricoler !

Heureusement, plusieurs packages facilitent la création de représentations graphiques animées, en mettant des fonctions simple d’utilisation à disposition.

L’extension gganimate (Pedersen et Robinson 2022)

Code
library(gganimate)


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) +
  labs(title = 'Year: {frame_time}', x = 'GDP per capita', y = 'life expectancy') +
  transition_time(year) +
  ease_aes('linear')


Le package t_map (Tennekes 2018)

Code
library(tmap)
data(World, metro)

m4 <- tm_shape(World) +
        tm_polygons() +
        tm_shape(metro) +
        tm_bubbles(col = "red") +
        tm_text("name", ymod = -1) +
        tm_facets(by = "name", free.coords = F, nrow = 1, ncol = 1) +
        tm_layout(panel.show = FALSE, frame = FALSE)

tmap_animation(m4,
               filename = "World_cities.mp4", 
               width=1200, 
               height = 600, 
               fps = 1, 
               outer.margins = 0)



Exemple personnel ggplot2 + gganimate

https://gitlab.huma-num.fr/hpecout/courbe_rotative

Représentation intéractive

Le langage R, seul, ne permet pas de produire de représentation graphique interactive. Cette fonctionnalité est accessible grâce au langage javascript (+ un navigateur web). Il est possible de créer des htmlwidgets, des packages qui permettent de faire un lien avec des librairies javascript…





Quelques exemples :


Package leaflet (Cheng, Karambelkar, et Xie 2023)

Reading layer `mtq' from data source 
  `C:\Users\HP\Desktop\SO_MATE_2023\data\mtq.gpkg' using driver `GPKG'
Simple feature collection with 34 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 690574 ymin: 1592536 xmax: 735940.2 ymax: 1645660
Projected CRS: WGS 84 / UTM zone 20N
Code
map <- leaflet(mtq)

pal <- colorNumeric(palette = "Blues",
                    domain = mtq$CHOM)

map %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~pal(CHOM))


Package mapview (Appelhans et al. 2022)

Code
library(mapview)

mapview(mtq)


Package mapdeck (Cooley 2020)


Package networkD3 (Allaire et al. 2017)

Code
data <- data.frame(
  from=c("A", "A", "B", "D", "C", "D", "E", "B", "C", "D", "K", "A", "M"),
  to=c("B", "E", "F", "A", "C", "A", "B", "Z", "A", "C", "A", "B", "K")
)

library(networkD3)
simpleNetwork(data , height="100px", width="100px",        
              Source = 1,                 # column number of source
              Target = 2,                 # column number of target
              linkDistance = 10,          # distance between node. Increase this value to have more space between nodes
              charge = -900,              # numeric value indicating either the strength of the node repulsion (negative value) or attraction (positive value)
              fontSize = 14,              # size of the node names
              fontFamily = "serif",       # font og node names
              linkColour = "#666",        # colour of edges, MUST be a common colour for the whole graph
              nodeColour = "#69b3a2",     # colour of nodes, MUST be a common colour for the whole graph
              opacity = 0.9,              # opacity of nodes. 0=transparent. 1=no transparency
              zoom = T                    # Can you zoom on the figure?
              )


Package visNetwork (Almende B.V. and Contributors et Thieurmel 2022)

Code
library(visNetwork)

data <- toVisNetworkData(karate)

visNetwork(nodes = data$nodes, edges = data$edges, height = "500px") 


Package rgl (Murdoch et Adler 2023)

Code
library(rgl)

x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)

plot3d(x, y, z, col = rainbow(1000))






Package plotly (Sievert 2020)

Code
library(plotly)

plot_ly(x = mtq$POP, 
               y = mtq$MED, 
               z = mtq$ACT,
               color= as.factor(mtq$STATUS),
                colors = c("red", "orange", "grey"),
               size=0.6) %>% 
add_markers() %>% 
layout(scene = list(xaxis = list(title = 'POP'),
       yaxis = list(title = 'MED'),
       zaxis = list(title = 'ACT')))


Ce package est également compatible avec les graphiques ggplot2, qu’il peut rendre intéractif.

Code
mon_plot <- ggplot(mtcars, aes(x= hp, y =drat, fill = am)) + 
               geom_point()


library(plotly)

ggplotly(mon_plot)


Et aussi :


Package rbokeh (Hafen et Continuum Analytics, Inc. 2021)


Package highcharter (Kunst 2022)


Package echarts4r (Coene 2023)


Package robservable (Barnier et Russell 2022)



V. Valoriser un graphique fait avec R


Export classique

eps, ps, tex, pdf, jpeg, tiff, png, bmp, svg, wmf


En R-base :

pdf(file = "myplot.pdf")

plot(mtcars$wt, mtcars$mpg)

dev.off()

Avec ggplot2 :

library(ggplot2)

ggplot(mtcars, aes(wt, mpg)) + geom_point()

ggsave("myplot.pdf")

   

En clic-bouton avec Rstudio :

L’export de GIF, de mp4, html… pour les représentations animées s’effectue automatiquement via des fonctions mis à disposition pas des packages.

Les documents computationnels

Rmarkdown & Quarto


Les applications shiny



Ressources utiles

r-graph-gallery.com

r-charts.com

rzine.fr

ggplot2.tidyverse.org

https://exts.ggplot2.tidyverse.org/gallery/

http://gallery.htmlwidgets.org/

Ateliers pratiques

Le jeu de données


Le réseau des routes de poste en France de 1632 à 1833

Nicolas Verdier, Anne Bretagnolle. L’extension du réseau des routes de poste en France, de 1708 à 1833. Histoire des réseaux postaux en Europe du XVIIIe au XXIe siècle, May 2007, Paris, France. pp.155-193. ⟨halshs-00144693⟩


  • 16 couches géographiques au format shapefile (.shp) :

Les relais de poste

Couche de points géoréférencés x 8

Les routes postales

Couche de lignes géoréférencées x 8


  • À 8 dates : 1632, 1708, 1733, 1758, 1783, 1810 et 1833


Soit 8 cartographie du réseau des routes de poste en France entre 1632 et 1833.


Des relais caractérisés par des variables (attributs)

Ex: Relais de 1833



Des routes caractérisées par des variables (attributs)

Ex: Routes de 1833

Un projet Rstudio pour deux TD


1. Représentation de réseau avec igraph
2. Cartographie avec mapsf



Télécharger le projet Rstudio (.zip)

I. Atelier igraph

II. Atelier mapsf



Pour aller plus loin :

Documentation du package mapsf (Giraud 2022) :

Une remarque ? Une question ? Une proposition d’amélioration pour mapsf ?

timothee.giraud@cnrs.fr

Sources & bibliographie


Plusieurs passages sont fortement inspirés de supports existant, mis gracieusement en ligne par leur auteurs. Trois supports de communication ont principalement été utilisés :


Références bibliographiques

Allaire, J. J., Christopher Gandrud, Kenton Russell, et CJ Yetman. 2017. networkD3: D3 JavaScript Network Graphs from R. https://CRAN.R-project.org/package=networkD3.
Almende B.V. and Contributors, et Benoit Thieurmel. 2022. visNetwork: Network Visualization using ’vis.js’ Library. https://CRAN.R-project.org/package=visNetwork.
Appelhans, Tim, Florian Detsch, Christoph Reudenbach, et Stefan Woellauer. 2022. mapview: Interactive Viewing of Spatial Data in R. https://CRAN.R-project.org/package=mapview.
Barnier, Julien. 2023. explor: Interactive Interfaces for Results Exploration. https://CRAN.R-project.org/package=explor.
Barnier, Julien, et Kenton Russell. 2022. robservable: Import an Observable Notebook as HTML Widget. https://CRAN.R-project.org/package=robservable.
Barter, Rebecca, et Bin Yu. 2017. superheat: A Graphical Tool for Exploring Complex Datasets Using Heatmaps. https://CRAN.R-project.org/package=superheat.
Cheng, Joe, Bhaskar Karambelkar, et Yihui Xie. 2023. leaflet: Create Interactive Web Maps with the JavaScript ’Leaflet’ Library. https://CRAN.R-project.org/package=leaflet.
Coene, John. 2023. echarts4r: Create Interactive Graphs with ’Echarts JavaScript’ Version 5. https://CRAN.R-project.org/package=echarts4r.
Cooley, David. 2020. mapdeck: Interactive Maps Using ’Mapbox GL JS’ and ’Deck.gl’. https://CRAN.R-project.org/package=mapdeck.
Csárdi, Gábor, Tamás Nepusz, Vincent Traag, Szabolcs Horvát, Fabio Zanini, Daniel Noom, et Kirill Müller. 2023. igraph: Network Analysis and Visualization in R. https://doi.org/10.5281/zenodo.7682609.
Fellows, Ian. 2018. wordcloud: Word Clouds. https://CRAN.R-project.org/package=wordcloud.
Giraud, Timothée. 2022. mapsf: Thematic Cartography. https://CRAN.R-project.org/package=mapsf.
Giraud, Timothée, et Hugues Pecout. 2023a. « Cartographie avec R ». https://doi.org/10.5281/zenodo.7528161.
———. 2023b. « Géomatique avec R ». https://doi.org/10.5281/zenodo.7528145.
Gu, Zuguang. 2022. « Complex Heatmap Visualization ». iMeta. https://doi.org/10.1002/imt2.43.
Gu, Zuguang, Lei Gu, Roland Eils, Matthias Schlesner, et Benedikt Brors. 2014. « circlize implements and enhances circular visualization in R  ». Bioinformatics 30 (19): 2811‑12. https://doi.org/10.1093/bioinformatics/btu393.
Hafen, Ryan, et Continuum Analytics, Inc. 2021. rbokeh: R Interface for Bokeh. https://CRAN.R-project.org/package=rbokeh.
Hijmans, Robert J. 2023. terra: Spatial Data Analysis. https://CRAN.R-project.org/package=terra.
Hvitfeldt, Emil. 2021. paletteer: Comprehensive Collection of Color Palettes. https://github.com/EmilHvitfeldt/paletteer.
Kahle, David, et Hadley Wickham. 2013. « ggmap: Spatial Visualization with ggplot2 ». The R Journal 5 (1): 144‑61. https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf.
Kunst, Joshua. 2022. highcharter: A Wrapper for the ’Highcharts’ Library. https://CRAN.R-project.org/package=highcharter.
Lang, Dawei, et Guan-tin Chien. 2018. wordcloud2: Create Word Cloud by ’htmlwidget’. https://CRAN.R-project.org/package=wordcloud2.
Lê, Sébastien, Julie Josse, et François Husson. 2008. « FactoMineR: A Package for Multivariate Analysis ». Journal of Statistical Software 25 (1): 1‑18. https://doi.org/10.18637/jss.v025.i01.
Ligges, Uwe, et Martin Mächler. 2003. « Scatterplot3d - an R Package for Visualizing Multivariate Data ». Journal of Statistical Software 8 (11): 1‑20. https://doi.org/10.18637/jss.v008.i11.
Meyer, Fanny, et Victor Perrier. 2022. esquisse: Explore and Visualize Your Data Interactively. https://CRAN.R-project.org/package=esquisse.
Murdoch, Duncan, et Daniel Adler. 2023. rgl: 3D Visualization Using OpenGL. https://CRAN.R-project.org/package=rgl.
Pebesma, Edzer. 2018. « Simple Features for R: Standardized Support for Spatial Vector Data ». The R Journal 10 (1): 439‑46. https://doi.org/10.32614/RJ-2018-009.
Pedersen, Thomas Lin. 2022. ggraph: An Implementation of Grammar of Graphics for Graphs and Networks. https://CRAN.R-project.org/package=ggraph.
Pedersen, Thomas Lin, et David Robinson. 2022. gganimate: A Grammar of Animated Graphics. https://CRAN.R-project.org/package=gganimate.
Sarkar, Deepayan. 2008. Lattice: Multivariate Data Visualization with R. New York: Springer. http://lmdvr.r-forge.r-project.org.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman; Hall/CRC. https://plotly-r.com.
Tennekes, Martijn. 2018. « tmap: Thematic Maps in R ». Journal of Statistical Software 84 (6): 1‑39. https://doi.org/10.18637/jss.v084.i06.
———. 2023. cols4all: Colors for all. https://CRAN.R-project.org/package=cols4all.
Wickham, Hadley. 2010. « A Layered Grammar of Graphics ». Journal of Computational and Graphical Statistics 19 (1): 3‑28. https://doi.org/10.1198/jcgs.2009.07098.
———. 2016. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
Wilkinson, Leland. 1999. The Grammar of Graphics. Springer-Verlag New York, Inc.


Merci de votre attention