Dataviz avec des librairies dédiées sous R

Cette page est un peu à part : elle pourrait se disperser dans toute la rubrique graphique (et elle le fait d'ailleurs).

Elle est là pour présenter des librairies réputées de visualisation de données.

Ces librairies, il s'agit de lattice mais surtout de ggplot/ggplot2 et plotly. Lattice est moins connu mais se rapproche de la syntaxe classique de R.

Les deux autres ggplot et ploly donnent la possibilité à l'utilisateur d'ajouter, de supprimer ou de modifier des composants d'un graphe à un niveau élevé d'abstraction (bon forcément, c'est plus lent).

C'est un peu un langage dans le langage. Cela permet d'obtenir des graphiques très complexe très simplement MAIS cela requiert un apprentissage complémentaire et trouvera rapidement ses limites si on veut aller au-delà du format de base imposé par ces librairies.

L'essentiel de cette page !

Réaliser très rapidement n'importe quelle type de graphique avec une jolie mise en forme peut se faire avec lattice (rudimentaire) ou avec ggplot2 dont la prise en main est un peu délicate mais qui ira aussi loin que vous voudrez avec une mise en forme toutefois plus limitée qu'avec R natif.

1- La librairie lattice

Inconvénients : ça apporte un plus un la syntaxe de R mais ça exige d'ajouter de nouvelles commandes à son panel de connaissances.

Avantages : ça supporte bien le paramétrage de formatage de base de R.

Lien extérieur pour aller plus loin avec lattice.

Pour installer et exécuter lattice

install.packages("lattice")
library("lattice")

Pour ouvrir les données (en exemple ici)

data<- read.table(file.choose(),header=T,sep="\t") ; head(data) # Ouvrir exercice4.txt

Réaliser automatiquement autant de graphique que de catégories

# Formule xyplot(y~x|A)
xyplot(data$Poids~data$Age|factor(data$Certification),xlab="Age",ylab="Poids")

Réaliser automatiquement des graphiques par catégories croisées

# Formule xyplot(y~x|A*B)
xyplot(data$Poids~data$Age|factor(data$Certification)*factor(data$Sexe),xlab="Age",ylab="Poids")

Réaliser une courbe de densité (équivalent de la fonction histogramme)

densityplot(data$Poids,col="red",lwd=2,xlab="Poids")

Un graphique 3D non interactif en une ligne

# formule cloud(z~x*y)
cloud(data$Prix~data$Age*data$Poids,xlab="Poids",ylab="Age",zlab="Prix",col="orange")

2- La librairie ggplot2, la lamborgini des graphiques sous R

Inconvénients : un langage dans le langage R. ggplot2 présente un au niveau d'abstraction dans sa rédaction. Sa prise en main est donc (pour le moins au début, peu intuitive). Il est très laborieux de contourner les limites graphiques de ggplot2. Si une fonction est limitée, on aura dû mal à changer sa forme. Enfin, ggplot2 est relativement lent pour les gros jeux de données.

Avantages : très performant, son potentiel de réalisation de graphiques est extraordinaire. On peut superposer une quantité d'information conséquente et lui donner une interfacte avec plotly (une autre librairie).

Pour aller plus loin avec ggplot2 : mieux vaut changer de site internet. Ce site ne développe pas en profondeur ggplot2 qui nécessiterait un site en lui-même.

Croiser les catégories avec ggplot2, c'est facile !

library("ggplot2")
ggplot(data, aes(x = Age, y=Poids))+
  geom_point(alpha=.05,col="red")+
  facet_grid(Certification~Sexe)

On voit dans cette syntaxe qu'il suffit de mettre un "+" pour ajouter des informations au graphique !

Changeons les couleurs des catégories, ajoutons une courbe moyenne !

library("ggplot2")
p <- ggplot(iris, aes(x = Sepal.Length, y=Sepal.Width,colour=factor(Species))) +
  geom_point(alpha=.9)+ facet_grid(. ~ Species)
p
p+geom_line(colour="green")  
p+stat_summary(fun.y=mean, colour="red", geom="line") 

Faire un ridget plot : des courbes de densité qui permettent la comparaison des données de chaque classe.

install.packages("ggridges")
library(ggplot2)
library(ggridges)
data(iris)

ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(aes(fill = Species)) +
  scale_fill_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

Ridget plot - Comparer les courbes de densité de plusieurs classes sur les modalités d'une variable

library(openxlsx)
data = read.xlsx(file.choose()) # data étudiants
colnames(data)
colnames(data)[7] <- "Sport"
ggplot(data, aes(x=Poids, y=Sport, color=Sexe, point_color=Sexe, fill=Sexe)) +
  geom_density_ridges(
    jittered_points=TRUE, scale = .95, rel_min_height = .01,
    point_shape = "|", point_size = 3, size = 0.25,
    position = position_points_jitter(height = 0)
  ) +

  scale_y_discrete(expand = c(.01, 0)) +
  scale_x_continuous(expand = c(0, 0), name = "height [cm]") +
  scale_fill_manual(values = c("#D55E0050", "#0072B250"), labels = c("female", "male")) +
  scale_color_manual(values = c("#D55E00", "#0072B2"), guide = "none") +
  scale_discrete_manual("point_color", values = c("#D55E00", "#0072B2"), guide = "none") +
  guides(fill = guide_legend(
    override.aes = list(
    fill = c("#D55E00A0", "#0072B2A0"),
    color = NA, point_color = NA))
  ) +
  ggtitle("Répartition des étudiants faisant du sport par sexe") +
  theme_ridges(center = TRUE)

geom_point(size, shape, colour, alpha)

Exemple à intégrer

p <- ggplot(data, aes(x = date, y=PCB_52))+

geom_point(col="red")+ facet_grid(Species~Lieu)+

stat_summary(fun.y=mean, colour="red", geom="line")

p+geom_point(aes(x = date, y=PCB_28))+stat_summary(aes(x = date, y=PCB_28),fun.y=mean, colour="black", geom="line")+

geom_point(aes(x = date, y=PC_101),colour="blue")+stat_summary(aes(x = date, y=PC_101),fun.y=mean, colour="blue", geom="line")+

geom_point(aes(x = date, y=PCB_118),colour="green")+stat_summary(aes(x = date, y=PCB_118),fun.y=mean, colour="green", geom="line")

Les graphiques peuvent être animés avec gganimate de ggplot.