Textométrie

Comptages et graphiques simples

Lise Vaudor

ISIG, UMR 5600 EVS

2024-10-01

Introduction

ggplot2 est un package utilisé pour réaliser des graphiques selon des principes qui lui sont propres.

(en l’occurrence, ces principes sont inspirés du livre “The Grammar of Graphics” de Leland Wilkinson, d’où le gg de ggplot).

ggplot2 se distingue des autres outils de production graphique sous R, et notamment des fonctions graphiques “de base” comme “hist”, “boxplot”, etc. par son principe général qui est de décrire et donc produire un graphique comme un assemblage de couches

=> production simple et intuitive de graphiques beaux et riches

illustration Allison Horst

Introduction

Commençons par charger le package ggplot2 -après l’avoir, si nécessaire, installé- :

library(ggplot2)

Jeu de données illustratif

Pour vous illustrer les principes et résultats graphiques du package ggplot2, je vais réutiliser le jeu de données catdata:

catdata <- read.csv("../../../datasets/catdata.csv", sep=";")
head(catdata)
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
black tabby female 5.5 6 dry
white tabby female 5.6 8 wet
red tabby female 6.1 5 dry
brown solid female 5.3 7 dry
black tabby male 6.9 5 wet

Les bases: jeu de données, aethetics, et geoms

On crée un graphique à l’aide de la fonction ggplot. On spécifie sur quel jeu de données le graphique va être construit, ainsi que les aesthetics x et y:

p <- ggplot(data=catdata,
            mapping=aes(x=haircolor,y=weight))
plot(p)

On peut simplifier l’écriture de cette commande en omettant de préciser les noms des arguments data et mapping, et afficher directement le graphique (sans lui assigner un nom, ici p):

ggplot(catdata,
       aes(x=haircolor,y=weight))

Geom

On peut par exemple de représenter l’information à l’aide d’un geom “point”:

ggplot(catdata,aes(x=haircolor,y=weight)) +
  geom_point()

Si je souhaite réaliser un graphique de type boxplot plutôt que point alors il faudra que je modifie la fonction geom() que j’utilise…

Remarque

Vous devez choisir un type de geom compatible avec la nature des informations (en x et y) que vous voulez représenter!

ggplot(catdata,aes(x=haircolor)) +
  geom_point()
Error in `geom_point()`:
! Problem while setting up geom.
ℹ Error occurred in the 1st layer.
Caused by error in `compute_geom_1()`:
! `geom_point()` requires the following missing
  aesthetics: y

Types de geom

Graphique univarié, x discrète

ggplot(catdata,aes(x=haircolor)) +
  geom_bar()

Remarque: ici c’est la fonction geom_bar() qui se charge de calculer les effectifs par classe

Graphique univarié, x continue

ggplot(catdata,aes(x=weight)) +
  geom_histogram()

Modification du type de geom

Bivarié, x et y continues

ggplot(catdata,aes(x=age, y=weight)) +
  geom_point()

Bivarié, x et y continues

ggplot(catdata,aes(x=age, y=weight)) +
  geom_bin2d()

Modification du type de geom

Bivarié, x discrète et y continue

ggplot(catdata,aes(x=haircolor, y=weight)) +
  geom_boxplot()

Bivarié, x discrète et y continue

ggplot(catdata,aes(x=haircolor, y=weight)) +
  geom_violin()

Modification du type de geom

ggplot(catdata,aes(x=haircolor)) +
  geom_bar()

haircolor_n=catdata %>%
         group_by(haircolor) %>%
         summarise(n=n())
haircolor_n
haircolor n
black 79
brown 22
red 29
white 23
ggplot(haircolor_n, aes(x=haircolor,y=n))+
  geom_col()

ggplot(haircolor_n, aes(x=haircolor,y=n))+
  geom_bar(stat="identity")

Superposition de geoms

ggplot(catdata, aes(x=haircolor, y=age))+
  geom_point(col="blue", size=2) +
  geom_jitter(col="pink", size=2)

Paramétrisation du geom

Evidemment tous les geoms peuvent être paramétrés. Je peux par exemple modifier la couleur de mes boîtes à moustache de la façon suivante:

ggplot(catdata,aes(x=haircolor,y=weight)) +
  geom_boxplot(fill="lightskyblue")

Parmi les arguments les plus utilisés pour paramétrer les geoms, on peut citer:

  • color: la couleur des lignes
  • fill: la couleur de remplissage
  • linetype: le type de ligne
  • size: la taille des symboles ou l’épaisseur des lignes
  • alpha: la transparence

Paramétrisation du geom

ggplot(catdata, aes(x=age, y= weight)) +
  geom_point(shape=24,
             color="blue",
             fill="lightskyblue",
             alpha=0.6,
             size=3)

ggplot(catdata, aes(x=age)) +
  geom_density(color="red",
               fill="pink",
               linetype=3,
               lwd=2)

On récapitule!

On a parlé de quoi, déjà?
  • principes du package ggplot2, construction d’un graphique par “couches”
  • représentation de l’information par des geoms
  • exploration de divers geoms (geom_point, geom_boxplot, geom_violin, geom_density, geom_bar, geom_histogram, geom_jitter, geom_bin2d, etc.)
  • paramétrisation des geoms (color, fill, shape, alpha, size, lwd, linetype etc.)

Relier paramètres graphiques et variables: mapping

Nous avons vu comment définir les paramètres des geoms de manière “absolue”. Par exemple:

ggplot(catdata,
       mapping=aes(x=haircolor, y=weight)) +
  geom_boxplot(fill="lightskyblue")

Je peux aussi lier un paramètre graphique à une variable. On appelle ce procédé mapping.

Cette variable fait alors partie des aesthetics.

ggplot(catdata,
       mapping=aes(x=haircolor,y=weight)) + 
  geom_boxplot(mapping=aes(fill=haircolor))

Relier paramètres graphiques et variables: mapping

On peut utiliser en aesthetic des variables autres que celles qui définissent x et y… Cela veut dire que l’on peut très simplement rajouter des couches d’information (et les légendes correspondantes!) au graphique.

ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex))

Esthétique propre à un geom vs esthétique propre à un graphique

Remarquez que l’esthétique fill=sex peut être spécifiée à la fois dans l’appel à geom_boxplot() et l’appel à ggplot() elle-même

ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex))

ggplot(catdata,aes(x=haircolor,y=weight, fill=sex)) + 
  geom_boxplot()

Esthétique propre à geom vs esthétique propre à graphique

Cependant l’endroit où l’esthétique est spécifiée peut avoir un effet quand le graphique comprend plusieurs couches:

ggplot(catdata,aes(x=haircolor,y=weight)) + 
  geom_boxplot(aes(fill=sex))+
  geom_point(shape=24,size=2)

ggplot(catdata,aes(x=haircolor,y=weight, fill=sex)) + 
  geom_boxplot() +
  geom_point(shape=24,size=2)

Facettes (en lignes)

ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  facet_grid(rows=vars(hairpattern))

Facettes (en colonnes)

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype))  
pf=p+facet_grid(cols=vars(haircolor))
plot(pf)

Facettes (en grille)

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype))  
pf=p+facet_grid(rows=vars(hairpattern),
                cols=vars(haircolor))
plot(pf)

Facettes (libres)

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype))  
pf=p+facet_wrap(vars(hairpattern))
plot(pf)

Titres des axes

ggplot2 offre également des outils pour travailler facilement sur les problèmes de titres, d’échelles et d’axes.

ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",
       y="âge")

Echelles des axes

Un des aspects les plus intéressants de ggplot2 est la facilité avec laquelle on peut transformer les variables de position x et y.

** sans transformation d’échelle**

p <-ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",y="âge")
plot(p)

** avec transformation d’échelle**

p_log <- p +
  scale_y_log10(breaks=seq(2,17,by=2))
plot(p_log)

Limites des axes

On peut également définir des limites d’axes

** sans limites d’axes**

p <- ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",
       y="âge")
plot(p)

** avec limites d’axes**

On peut également définir des limites d’axes

p_lims <- p + 
  scale_y_continuous(limits=c(0,20))
plot(p_lims)

Etiquettes des axes

Ou définir les endroits où les barres s’affichent sur l’axe (argument breaks), ainsi que les étiquettes associées (argument labels).

ggplot(catdata, aes(x=foodtype, y=age)) +
  geom_boxplot(aes(fill=foodtype)) + 
  labs(x="type de nourriture",
       y="âge") +
  scale_y_continuous(limits=c(0,20),
                     breaks=c(0,5,10,15),
                     labels=c("bébé","jeune","moyen","âgé")) +
  scale_x_discrete(labels=c("dry"="croquettes",
                            "wet"="pâtée",
                            "other"="autre"))

Echelles colorées

p <-ggplot(catdata, aes(x=haircolor, y=weight, fill=haircolor))+
  geom_boxplot()+
  scale_fill_manual(values=c("black","brown","orange","white"))
plot(p)

p <-ggplot(catdata, aes(x=age, y=weight, color=haircolor))+
  geom_point(size=2)+
  scale_color_manual(values=c("black","brown","orange","white"))
plot(p)

Echelles colorées

p <-ggplot(catdata, aes(x=hairpattern))+
  geom_bar(aes(fill=hairpattern))+
  scale_fill_brewer(palette="Purples")
plot(p)

p <-ggplot(catdata, aes(x=age, y=weight))+
  geom_bin2d(binwidth=1)+
  scale_fill_gradient(low="yellow",high="green")
plot(p)

Thèmes

Les thèmes permettent de définir l’allure globale du graphique. On peut modifier le thème de la manière suivante :

classic

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_classic()
plot(p)

black & white

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_bw()
plot(p)

Thèmes

Les thèmes permettent de définir l’allure globale du graphique. On peut modifier le thème de la manière suivante :

minimal

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_minimal()
plot(p)

grey

p <- ggplot(catdata, aes(x=age, y=weight, color=haircolor)) +
  geom_point() +
  theme_grey()
plot(p)

On récapitule!

On a parlé de quoi, déjà?
  • titres du graphique, et des axes
  • échelles, limites et étiquettes des axes
  • échelles colorées
  • thèmes

Nuage de mots

Le nuage de mots constitue sans doute l’une des représentations les plus classiques pour une table lexicale…

On le réalise ici avec le package ggwordcloud (et sa fonction wordcloud())

On repart ici de la table freq_lemmes

freq_lemmes_top_100 <- freq_lemmes %>%
  top_n(100,freq)

library(ggwordcloud)
ggplot(freq_lemmes_top_100, aes(label = lemma,size=freq, color=log10(freq))) +
  geom_text_wordcloud() +
  theme_minimal()+
  scale_color_gradient(low = "red", high = "forestgreen")