Visualiser des données avec R: barchart, boxplot, bubblechart 3D, histogramme, parallel coordinates, radar chart, stripchart

André Ourednik, Thursday, December 1, 2016

Cet exercice vous conduit à travers le processus de visualisation de données dans R. Il présuppose que vous avez installé R et RStudio.

Charger les données

Téléchargement

Téléchargez le fichier unine_exercice1.zip depuis le site du cours.

Décompressez le contenu de l’archive zip dans un dossier de votre choix, par exemple dans c:\\unine\cours\data sur un ordinateur Windows ou /Users/votre_nom_d_utilisateur/unine/cours/data  sur un Mac. Après l’opération, il devrait exsiter un nouveau sous-dossier dans ce dossier, par exemple c:\\unine\cours\data\unine_exercice1ou  /Users/votre_nom_d_utilisateur/unine/cours/data/unine_exercice1. Ouvrez le dossier en question pour vérifier qu’il contient bien des données.

Charger les donées dans R

Créez un nouveau script R et enregistrez-le.  Vous ajouterez progressivemet les commandes ci-dessous à ce fichier, de manière à pouvoir exécuter le script dans le futur.

Définir un working directory

Pour faciliter l’accès aux données que vous venez de télécharger, changez le “working directory” avec la commande setwd() . Si vous avez nommé vos dossiers comme dans l’exemple précédent, cela donnera:

  • setwd(“c:/unine/cours/data”) sur Windows. Notez qu’il faut utiliser /  au lieu de \  dans l’adresse.
  • setwd(“/Users/votre_nom_d_utilisateur/unine/cours/data”) sur un Mac.

Le working dirctory est le lieu où R va non seulement chercher les données mais aussi déposer tous les fichiers (images, tableaux etc.) produits par le script, à moins que vous lui indiquiez de faire autrement. Cela va s’avérer pratique pour les retrouver.

Définir l’adresse des données

Pour charger les données, définissez d’abord l’adresse où elles se trouvent dans votre working directory. En l’occurrence dans le fichier donnees_communes.xls, lui même situé dans les sous-dossier unine_exercice1. La commande file.path() permet d’indiquer cette adresse de manière idépendante du système d’exploitation. L’utiliser peut être pratique si vous travaillez sur une machine Windows et conntinuez sur une machine Linux ou Mac.

adresse_fichier <- file.path("unine_exercice1","donnees_communes.xls")

Pour voir si l’adresse a été bien enregistrée, exécutez adresse_fichier (c’est-à-dire écrivez ce nom de variable dans une nouvelle ligne, sélectionnez-la et pressez Ctr-ENTER ou Command-Enter). Une chaîne de caractères devrait s’afficher dans la console. Si vous êtes sur une machie Windows, comparez cette chaîne de caractères à celle obtenue par votre voisin_e sur une machine Mac ou vice versa. Quelle différence voyez-vous?

Charger les données et les stocker dans une variable R

Les données étant dans un tableau Excel, pour les charger, vous aurez besoin du module readxl. Assurez-vous qu’il soit installé. Ensuite, activez le avec la commande library(“readxl”) .

Chargez enfin les données et stockez-les dans une variable avec la commande suivante:

rfpdata <- read_excel(adresse_fichier, na="", sheet="GEOSTAT_ORT01_vz2000_nzpers")

Examinez vos données en sélectionnant des sous-ensembles (subsetting)

Vous venez de stocker un tableau de données dans la variable rfpdata. R permet d’accéder aux colonnes du tableau à l’aide du signe $. Essayez:

rfpdata$P00B21

Essayez de lister les valeurs d’autres colonnes.

R permet également d’afficher un sous-ensemble de données. Avec la commande suivant, affichez la 1ère colonne et les colonnes 5  à 10 :

rfpdata[c(1,5:10)]

Affichez toutes les colonnes, sauf les colonnes 7 à 10 :

rfpdata[-c(7:10)]

Affichez les 2 premières lignes :

rfpdata[1:2,]

Affichez les 2 premières colonnes:

rfpdata[,1:2]

Affichez les valeurs de la variable P00BTOT  pour les 2 premières lignes:

rfpdata[1:2,]$P00BTOT

Listez toutes les données des communes dont la population est inférieure à 2000 personnes:

rfpdata[rfpdata$P00BTOT<2000,]

Listez les noms des communes dont la population est inférieure à 2000

rfpdata[rfpdata$P00BTOT<2000,]$GMDENAME

Vous pouvez aussi stocker le sous-ensemble de données dans une variable

petites_communes<-rfpdata[rfpdata$P00BTOT<2000,]$GMDENAME

Apprenez davantage sur la sélection de sous-ensembles dans R sur cette page internet. Testez les différentes options sur vos données.

Sélectionnez les données et calculez les données proportionnelles

Créez de nouvelles colonnes en calculant de nouvelles variables (vecteurs) qui seront ajoutées comme colonnes au tableau de données (data.frame) rfpdata:

rfpdata$p_P00B21 <- rfpdata$P00B21 / rfpdata$P00BTOT # la proportion des francophones
rfpdata$p_P00B22 <- rfpdata$P00B22 / rfpdata$P00BTOT # la proportion des germanophones
rfpdata$p_P00B23 <- rfpdata$P00B23 / rfpdata$P00BTOT # la proportion des germanophones
rfpdata$p_P00B24 <- rfpdata$P00B24 / rfpdata$P00BTOT # la proportion des locuteurs du romanche
rfpdata$p_P00B25 <- rfpdata$P00B25 / rfpdata$P00BTOT # la proportion des anglophones

Crééz une nouvelle data.frame nommée langues, ne contenant que les variables qui nous intéresseront pour la suite de l’exercice.

langues <- data.frame(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23,rfpdata$p_P00B24,rfpdata$p_P00B25,rfpdata$P00BTOT)
colnames(langues)<-c("germanophones","francophones","italophones","romanchophones","anglophones","population_totale")
rownames(langues)<-rfpdata$GMDENAME

Stripchart

1 dimension

Le stripchart, aussi appelé scatterplot à 1 dimension, permet de visualiser la répartition des données sur une dimension (c’est-à-dire une variable) à la fois.

stripchart(langues$germanophones,xlab="Proportion de germanophones")

Plusieurs distributions unidimensionnelles

Plusieurs stripcharts alignés permettent de comparer la distribution unidimensionnelle de plusieurs variables

stripchart(langues.scaled,vertical=TRUE)

Comme vous le constatez, ce résultat visuel est décevant. On voit bien la répartition de la population totale mais pas celle des proportions de langues parlées. C’est normal: ces proportions varient entre 0 et 1, tandis que la population varie entre min(langues$population_totale) # = 1 et max(langues$population_totale) # = 8440 .

Pour une visualisation plus parlante, il faut faire en sorte que toutes les valeurs soient comprises entre 0 et 1. Pour cela, il suffit de les mettre à l’échelle en divisant chaque valeur par le maximum de sa colonne. Ce maximum est forcément 1 pour les valeurs proportionnelles (germanophones, franncophones, etc.). Il est équivalent à la population maximale pour la population des communes:

scaler <- c(1,1,1,1,1,max(langues$population_totale))
langues.scaled <- data.frame(t(t(langues)/scaler))
stripchart(langues.scaled,vertical=TRUE)

Scatterplots

Passons à deux dimensions et plus.

2 dimensions

Pour ce graphique et les suivants vous aurez besoin du module ggplot2, standard établi dans les graphismes avec R. Assurez-vous qu’il soit installé et jetez un coup d’oeil à sa documentation. Un cours entier pourrait être consacré à ce module seul, mais sa documentation de qualité permet de progresser de manière autonome après avoir vu quelques exemples initiaux que nous allons voir ici.

Activez ggplot avec la commande library(“ggplot2”) . Ensuite, créez un premier graphique

g1 <- ggplot(langues, aes(x=germanophones, y=francophones)) +
  geom_point() +
  xlab("germanophones") +
  ylab("francophones") +
  ggtitle("Proportion de locuteurs dans les communes suisses")

# affichez le premier graphique:
g1

3 dimensions

La 3e dimension sera la taille. Nottez l’usage du paramètre alpha sur la seconde ligne. Ce dernier dote les cercles proportionnnels de transparence et permet de voir les petites communes sinos cachées par les grandes.

g2 <- ggplot(langues, aes(x=germanophones, y=francophones)) +
  geom_point(aes(size=langues$population_totale),alpha=0.5) +
  scale_size_continuous(range = c(0.01,10),name="population") +
  xlab("germanophones") +
  ylab("francophones") +
  ggtitle("Proportion de locuteurs dans les communes suisses")

g2

4 dimensions

La 4e dimension sera la couleur.

g3 <- ggplot(langues, aes(x=germanophones, y=francophones)) +
  geom_point(aes(size=population_totale,color=italophones),alpha=0.5) +
  scale_size_continuous(range = c(0.01,10),name="population") +
  scale_colour_gradient2(name="italophones",midpoint=0.25,low = "yellow", mid="orange", high = "red") +
  xlab("germanophones") +
  ylab("francophones") +
  ggtitle("Proportion de locuteurs dans les communes suisses")
g3

Aligner plusieurs graphiques sur une seule image

Les modules grid et gridExtra vous permettent combiner plusieurs graphiques dans une seule image en alignant les axes et les légendes. L’usage de ces modules sera plutôt rare au début, mais il est bon de les connnaître. Installez-lez et exécutez les lignes suivantes.

library("grid")
library("gridExtra")

g1g <- ggplotGrob(g1)
g2g <- ggplotGrob(g2)
g3g <- ggplotGrob(g3)
g1g$widths <- g2g$widths <- g3g$widths
grid.newpage()
grid.arrange(g1g, g2g, g3g, nrow = 3)

Scatterplot 3D et bubblechart 3D

Explorez la troisième dimension de l’espace en vous assurant chaque fois que les modules requis soient installés.

3 dimensions spatiales

library("scatterplot3d")
scatterplot3d(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23,xlab="germanophones",ylab="francophones",zlab="italophones",type="h",color="red",highlight.3d=T)

4 dimensions (3 spatiales + couleur)

library("plot3D")
scatter3D(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23) # based on plot3D
scatter3D(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23, phi=40, theta=90) # ici, on fixe l'angle de vue

Une version interactive avec le module rgl

library("rgl")
plot3d(x=rfpdata$p_P00B21,y=rfpdata$p_P00B22,z=rfpdata$p_P00B23) 
with(rfpdata, plot3d(p_P00B21, p_P00B22, p_P00B23, size=0)) # équivaut à la ligne précédente

5 dimensions et plus

# Construire une palette de couleurs 
rbPal <- colorRampPalette(c('red','blue')
langues.colors <- rbPal(10)[as.numeric(cut(langues.scaled$romanchophones,breaks = 10))]

library("rgl") # nécessaire seulement si le module n'est pas encore chargé

spheres3d(langues.scaled$germanophones,langues.scaled$francophones,langues.scaled$italophones,radius=langues.scaled$population_totale^(1/3)/15,color=langues.colors)
axes3d()
title3d(xlab="germanophones",ylab="francophones",zlab="italophones")

Parallel coordinates

Pour visualiser les coordonnées parallèles, assurez-vous d’avoir installé le module MASS.

library("MASS")
parcoord(langues, col = rainbow(length(langues[,1])), lty = 1, var.label = TRUE)

Pour montrer le profil du pays entier:

colMax <- function (colData) { apply(colData, MARGIN=c(2), max) }
colMin <- function (colData) { apply(colData, MARGIN=c(2), min) }
langues.means <- data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues))))
parcoord(langues.means, col = 1, lty = 1, var.label = TRUE)

Il sera cependant plus beau, car plus compact, de montrer les données moyennes retenues dans le data.frame langues.means sous forme de radar chart.

Radar charts et wind-rose chart

library("fmsb")
radarchart(langues.means)

radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),langues[1,]))) # la radarchart ne fonctionne que si on donne les maxima et les minima pour chaque colonne dans les lignes 1 et 2 du dataframe

langues.zuerich <- langues[match("Zürich",rfpdata$GMDENAME),] # match() permet de tourver la ligne correspondant à Zürich. On aurait aussi pu utiliser les rownames. Ceci est une variante.
langues.geneve <- langues[match("Genève",rfpdata$GMDENAME),]
langues.scuol <- langues[match("Scuol",rfpdata$GMDENAME),]

radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues)),langues.zuerich)),pfcol = c("grey",NA),pty = 32, plty=1, pcol=c("grey",2))

radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues)),langues.geneve)),pfcol = c("grey",NA),pty = 32, plty=1, pcol=c("grey",2)) 

radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues)),langues.scuol)),pfcol = c("grey",NA),pty = 32, plty=1, pcol=c("grey",2)) 

radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),langues.zuerich,langues.geneve)),pfcol = c(NA,NA),pty = 32, plty=1,&nbsp; pcol=c(2,3))

Les wind-rose charts

stars(t(t(rbind(langues.zuerich,langues.geneve,langues.scuol))/scaler), labels=c("Zurich","Genève","Scuol"),radius = T,draw.segments = F,key.loc=c(5,2), mar=c(3,3,3,3),scale=F) # The key.loc refers to the axes. Try option axes=T to see these axes

stars(t(t(rbind(langues.zuerich,langues.geneve,langues.scuol))/scaler), labels=c("Zurich","Genève","Scuol"),radius = T,draw.segments = T,key.loc=c(5,2), mar=c(3,3,3,3),scale=F) # The key.loc refers to the axes. Try option axes=T to see these axes

langues.mostpopulated <- langues[order(-langues$population_totale),][1:20,]

stars(t(t(langues.mostpopulated)/scaler), labels=rownames(langues.mostpopulated),radius = T,key.loc=c(13,3),draw.segments = T, scale = F,mar=c(3,3,3,3))

 

 

Wind-rose chart locuteurs suisses

Wind-rose chart locuteurs suisses

Boxplots

Les boxplot sont, au fond, des stripcharts améliorés.

langues.forboxlot <- stack(langues.scaled) # melting the dataframe for ggplot boxplot
levels(langues.forboxlot$ind) 
langues.forboxlot$ind = factor(langues.forboxlot$ind,labels=c("germanophones","francophones","italophones","romanchophones","anglophones", "pop. totale (en proportion du max. CH)")) # renaming the factors

ggplot(langues.forboxlot, aes(x=ind, y=values)) +
  geom_boxplot(alpha=0.2) +
  stat_summary(fun.y=mean,geom="point") +
  xlab("locuteurs ") +
  ylab("Proportion dans la population de la commune")

Histogramme

qplot(langues$germanophones, geom="histogram") # avec peu de contrôle sur l'apparence

histogram <- ggplot(langues, aes(x=germanophones)) +
geom_histogram(breaks=seq(0,1,by=0.05),alpha=0.5) +
xlab("proportion de germanophones") +
ylab("nombre de communes") +
scale_y_sqrt(limit=c(0,2000))

histogram

histogram + geom_histogram(breaks=seq(0,1,by=0.2),alpha=0.5)

histogram + geom_histogram(breaks=seq(0,1,by=0.01),alpha=0.5)

histogram <- ggplot(langues, aes(x=germanophones)) +
geom_histogram(aes(y=..density..),breaks=seq(0,1,by=0.02),alpha=0.5) +
xlab("proportion de germanophones") +
ylab("densité de probabilité")

histogram + geom_density(alpha=.2)
Estimation par noyau. (Kernel density)

Estimation par noyau. (Kernel density)

Barchart

La fonction geom_bar(stat=”identity”) a besoin du package plyr pour fonctionner. Vérifiez qu’il soit bien installé avant d’exécuter les lignes suivantes.

barchart <- ggplot(langues.mostpopulated[1:10,],aes(x=rownames(langues.mostpopulated[1:10,]),y=germanophones)) +
geom_bar(stat="identity") +
xlab("noms des communes") +
ylab("proportion de germanophones")

barchart

barchart + coord_flip()

La suite…

La suite de cet exercice montre comment réduire les dimensions de vos données de base et de les regrouper par catégorie.

  •  
  •  
  •  
  •  
  • 2
  •  
Cite as: André Ourednik (2016) « Visualiser des données avec R: barchart, boxplot, bubblechart 3D, histogramme, parallel coordinates, radar chart, stripchart » in Maps and Spaces from https://ourednik.info/maps/2016/12/01/visualiser-des-donnees-avec-r/ [Last-seen March 26th 2019].
Category: Courses, Tools