Introduction

Principaux systèmes graphiques R

ggplot2 vs autres systèmes graphiques

Illustrations : basis graphics and ggplot2

R basics

library(car)
## Loading required package: carData
library(ggplot2)
## Warning in as.POSIXlt.POSIXct(Sys.time()): unable to identify current timezone 'T':
## please set environment variable 'TZ'
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
## 
##     recode
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data(Salaries)
plot(Salaries$yrs.since.phd,Salaries$salary, main = "Salaires suivant le nombre d'années depuis le PhD", xlab = "Année depuis Phd", ylab = "Salaires")+
#lm(salary ~ yrs.since.phd,data = Salaries)
abline(lm(salary ~ yrs.since.phd,data = Salaries))

## integer(0)

ggplot2 systems

ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth(method="lm", formula= y~x, se=FALSE) + geom_point()

Grammaire des graphiques

Ce que ggplot2 ne permet pas de faire?

Présentation de la base de données utilisée

Statistiques descriptives

glimpse(Salaries)
## Observations: 397
## Variables: 6
## $ rank          <fct> Prof, Prof, AsstProf, Prof, Prof, AssocProf, Prof, Pr...
## $ discipline    <fct> B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, A,...
## $ yrs.since.phd <int> 19, 20, 4, 45, 40, 6, 30, 45, 21, 18, 12, 7, 1, 2, 20...
## $ yrs.service   <int> 18, 16, 3, 39, 41, 6, 23, 45, 20, 18, 8, 2, 1, 0, 18,...
## $ sex           <fct> Male, Male, Male, Male, Male, Male, Male, Male, Male,...
## $ salary        <int> 139750, 173200, 79750, 115000, 141500, 97000, 175000,...
library("knitr")

kable(head(Salaries))
rank discipline yrs.since.phd yrs.service sex salary
Prof B 19 18 Male 139750
Prof B 20 16 Male 173200
AsstProf B 4 3 Male 79750
Prof B 45 39 Male 115000
Prof B 40 41 Male 141500
AssocProf B 6 6 Male 97000
salary_sum <- summary(Salaries$salary)
rank_sum <- summary(Salaries$rank)
discpl_sum <- summary(Salaries$discipline)
sex_sum <- summary(Salaries$sex)

salary_sum
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   57800   91000  107300  113706  134185  231545
rank_sum
##  AsstProf AssocProf      Prof 
##        67        64       266
discpl_sum
##   A   B 
## 181 216
sex_sum
## Female   Male 
##     39    358

Parlons à présent des représentations graphiques

La fonction ggplot()

Elle permet de spécifier la base de données utilisées et les variables à représenter.

Les fonctions geom:

  • Alors que la fonction ggplot() spécifie la base de données et les différentes variables à représenter.

  • Les fonctions geom spécifient comment ces variables doivent être représentées visuellement (en utilisant des points, des barres, des lignes et des régions ombrées).

  • La figure ci dessous donne une idée des fonctions geoms courantes et leurs différentes options.

Parlons des différentes options:

  • Chaque fonction geom possède un ensemble d’options qui peuvent être utilisées pour modifier sa représentation.

  • Les options courantes sont répertoriées dans le tableau suivant:

Essayons à présent des graphiques

  • Histogramme : Un graphique trop simple d’abord:
ggplot(Salaries, aes(x=salary)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Boxplot : Un graphique trop simple d’abord:
ggplot(Salaries, aes(y=salary)) + geom_boxplot()

  • Pas besoin de beaucoup de temps pour faire de jolis graphiques: multitude de thèmes:
ggplot(Salaries, aes(x=salary)) + geom_histogram()+theme_light()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(Salaries, aes(x=salary)) + geom_histogram()+theme_dark()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Un graphique un peu plus complet: ajouter d’un titre, les titres des axes
salary_hist <- Salaries %>% ggplot(aes(x = salary)) +
 geom_histogram(color = "black", fill = "blue", bins = 50, binwidth=5000) + labs(x = "Nine-Month Salary (in dollars)", y = "Count",title = "Nine-Month Salary Distribution")
salary_hist

phd_hist <- Salaries %>% ggplot(aes(x = yrs.since.phd)) +
  geom_histogram(color = "black", fill = "green", bins = 50) +
  labs(x = "Years since Ph.D.", y = "Count", 
       title = "Years since Ph.D. Distribution")

phd_hist

  • Au lieu de l’histogramme, je peux représenter les densités des variables:

  • Nous pouvons représenter également les densités des variables

ggplot(data=Salaries, aes(x = salary))+geom_density(alpha=.3)

  • Une manière d’étudier la distribution des variables quantitatives, est de faire une boite à moustache (boxplot). Elle permet d’avoir une idée des valeurs aberrantes.

  • Boxplot de la variable salaire:

ggplot(Salaries, aes(y=salary)) + geom_boxplot()

ggplot(Salaries, aes(y=salary)) + geom_boxplot(outlier.colour = "green", outlier.size = 3)

  • Pour ajouter plus d’options:
ggplot(Salaries, aes(y=salary)) + geom_boxplot(color="red", fill="blue", alpha=0.50, notch=FALSE)+ labs(y = "Salaire", 
       title = "Salary distribution")

  • Faisons le boxplot suivant une variable qualitative: rank variable
ggplot(Salaries, aes(x=rank, y=salary)) + geom_boxplot()+geom_point()

  • D’autres options: il s’agit ici de combiner plusieurs fonctions geoms.
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_boxplot(fill="cornflowerblue",
color="black", notch=TRUE)+
geom_point(position="jitter", color="blue", alpha=.5)+
geom_rug(side="l", color="black")
## Warning: Ignoring unknown parameters: side

  • La puissance de ggplot2: on peut combiner plusieurs fonctions. goem_violin permet de représenter la densité en miroire qui est affiché de la même manière qu’un boxplot.
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_violin(fill="lightblue") + 
geom_boxplot(fill="lightgreen", width=.2)

  • Nous pouvons représenter également les densités des variables suivant une variable qualitative, le rang du prof
ggplot(data=Salaries, aes(x=salary, fill = rank)) +
geom_density(alpha=.3)

A présent, étudions la relation entre le salaire des professeurs et le nombre d’années depuis l’obtention du PhD

  • Les deux variables étant quantitatives, on peut faire facilement un nuage de points pour voir la nature de la relation entre ces deux variables:
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary)) + 
  geom_point()+labs(title="Relation entre salaire et année après le doctorat")

- Plus d’options:

ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +geom_point(colour = "red", size = 3, shape=15)

  • Nature de la relation entre homme et femme:
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary, color = sex)) +  geom_point()

  • Nature de la relation suivant le sexe:
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary, color = sex, shape=sex)) +  geom_point()

Faceting

  • Parfois, les relations sont plus claires si les groupes apparaissent dans des graphiques côte à côte plutôt que de se chevaucher dans un seul graphique.

  • Utiliser des fonctions facet_wrap () et facet_grid ().

  • La syntaxe est donnée dans le tableau suivant, où var, rowvar et colvar sont des facteurs.

Essayons :

  • Une autre manière de percevoir la relation entre les deux variables suivant une seule variable, est de représenter le nuage de points pour chaque modalité de la variable, en utilisant l’option facet_wrap.
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary, shape = rank, color=rank)) + 
  geom_point() + 
  facet_wrap(~ rank, nrow = 2)

  • Une manière plus générale de le faire, est d’utiliser la fonction facet_grid qui permet de croiser deux variables.
ggplot(data = Salaries) + 
  geom_point(mapping = aes(x = yrs.since.phd, y = salary)) + 
  facet_grid(rank ~ sex)

  • Il faut noter que la fonction facet_grid est plus générale que la fonction facet_wrap
ggplot(data = Salaries,aes(x = yrs.since.phd, y = salary)) + 
  geom_point() +facet_grid(. ~ rank)

ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary)) + 
  geom_point() + 
  facet_grid(rank ~ .)

Ajout de lignes lissées: droite de régression linéaire, et autres

  • Parlons des transformations statistiques. Il faut signaler que ggplot2 contient un large éventail de fonctions permettant de calculer des résumés statistiques qui peuvent être ajoutés aux graphiques.

  • Il s’agit notamment des fonctions de regroupement des données et de calcul des densités, des contours et des quantiles.

  • Cette section examine les méthodes d’ajout de lignes lissées (linéaires, non linéaires et non paramétriques) aux nuages de points.

  • Vous pouvez utiliser la fonction geom_smooth () pour ajouter une variété de lignes lissées et de régions de confiance.

  • La figure ci dessous résume les principales options de cette fonctions

Essayons cette fonction dans notre cas:

  • Examinons la relation entre les années depuis l’obtention d’un doctorat et les salaires des professeurs.

  • Tout, d’abord; on ajoute une droite de régression linéaire simple avec les limites de confiance de 95% au nuage de points.

ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth(method="lm", formula= y~x, se=TRUE) + geom_point()

  • Faisons un peu plus compliqué: ajouter une ligne lissée non paramétrique (loess) avec les limites de confiance de 95%.
library(ggplot2)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method="loess", formula= y~x, se=TRUE) + geom_point()

  • Ensuite, ajustons une régression polynomiale quadratique séparément par sexe:
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary,
linetype=sex, shape=sex, color=sex)) +
geom_smooth(method=lm, formula=y~poly(x,2),
se=FALSE, size=1) +
geom_point(size=2)

Parlons un peu du traitement des variables qualitatives

Nous pouvons essayer de visualiser le nombre de professeurs suivant la variable “rank” et le “sex” en utilisant un graphique à barres groupées.

ggplot(Salaries, aes(x=rank)) +
geom_bar() 

ggplot(Salaries, aes(x=rank)) +
geom_bar(color="red", fill="blue") + labs(title='Bar graphics')

ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="stack") + labs(title='position="stack"')

ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="dodge") + labs(title='position="dodge"')

ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="fill") + labs(title='position="fill"')

Notez que l’étiquette sur l’axe des y pour le troisième graphique n’est pas correcte. Il devrait indiquer la proportion plutôt que le nombre. Vous pouvez corriger cela en ajoutant y = “Proportion” à la fonction labs ().

Attention

Les options peuvent être utilisées de différentes manières, selon qu’elles se produisent à l’intérieur ou à l’extérieur de la fonction aes (). Regardez les exemples suivants et essayez de deviner ce qu’ils font:

ggplot(Salaries, aes(x=rank, fill=sex))+ geom_bar()

ggplot(Salaries, aes(x=rank)) + geom_bar(fill="red")

ggplot(Salaries, aes(x=rank, fill="red")) + geom_bar()

  • Notes: Dans le premier exemple, le sexe est une variable représentée par la couleur de remplissage dans le graphique à barres. Dans le deuxième exemple, chaque barre est remplie de couleur rouge. Dans le troisième exemple, ggplot2 suppose que “rouge” est le nom d’une variable, et vous obtenez des résultats inattendus (et indésirables). En général, les variables doivent aller à l’intérieur de aes () et les constantes affectées doivent aller à l’extérieur de aes ().

Modification de l’apparence des graphiques ggplot2

Modification des axes:

  • Le package ggplot2 crée automatiquement des axes de tracé avec des graduations, des étiquettes de graduation,et les étiquettes des axes.

  • Souvent, ils ont l’air bien, mais parfois vous voudrez prendre un plus grand contrôle sur leur apparence.

  • Vous avez déjà vu comment utiliser la fonction labs () pour ajouter un titre et modifier les étiquettes des axes.

  • Dans cette section, vous allez personnaliser les axes eux-mêmes.

  • Les fonctions sont regroupées dans les tableaux suivants:

  • Comme vous pouvez le voir, les fonctions ggplot2 distinguent les axes x et y et si un axe représente une variable continue ou discrète (facteur).

  • Appliquons ces fonctions à un graphique avec des boîtes à moustaches groupées pour les salaires des professeurs par rang et sexe. Le code est comme suit:

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Sex", x="", y="")

Personnalisez mes légendes: “left”, “top”, “right” (the default), and “bottom”.

  • Plus simple d’abord:
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position="top")

  • Plus avancé:
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position=c(.1,.8))

Modifications de la couleur des graphiques

  • Vous avez la possibilité de définir vos propres couleurs couleurs.
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
scale_color_manual(values=c("orange", "olivedrab", "navy")) +
geom_point(size=2)

  • Essayer des couleurs deja existants et interessants: palette=“Set1” with another value (such as “Set2”,“Set3”, “Pastel1”, “Pastel2”, “Paired”, “Dark2”, or “Accent”).
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
scale_color_brewer(palette="Accent") + geom_point(size=2)

Voir les couleurs existantes:

To see the available color sets, use

library(RColorBrewer)
display.brewer.all()

Personnaliser votre thème

mytheme <- theme(plot.title=element_text(face="bold.italic",
size="14", color="brown"),
axis.title=element_text(face="bold.italic",
size=10, color="brown"),
axis.text=element_text(face="bold", size=9,
color="darkblue"),
panel.background=element_rect(fill="white",
color="darkblue"),
panel.grid.major.y=element_line(color="grey",
linetype=1),
panel.grid.minor.y=element_line(color="grey",
linetype=2),
panel.grid.minor.x=element_blank(),
legend.position="top")



ggplot(Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Salary by Rank and Sex", x="Rank", y="Salary") +
mytheme

  • Essayons un autre graphique avec notre thème
ggplot(Salaries, aes(x=rank))+ geom_bar() + mytheme

Plusieurs graphiques par page

  • mfrow que vous connaissez ne marche pas avec les graphiques ggplot2

  • La façon la plus simple de placer plusieurs graphiques ggplot2 dans une seule figure consiste à utiliser la fonction grid.arrange () disponible dans le package gridExtra.

#install.packages("gridExtra")
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
p1 <- ggplot(data=Salaries, aes(x=rank)) + geom_bar()
p2 <- ggplot(data=Salaries, aes(x=sex)) + geom_bar()
p3 <- ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) + geom_point()
grid.arrange(p1, p2, p3, ncol=3)

Mais, enfin, comment enregistrer nos graphiques

  • Vous avez la possibilité d’enregister vos graphiques sous forme png, jpeg ou pdf dans notre répertoire de travail.

  • On enregistre d’abord au format .png

myplot <- ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file="mygraph.png", plot=myplot, width=5, height=4)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
  • On enregistre au format .pdf
ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggsave(file="mygraph.pdf", plot=myplot, width=5, height=4)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Conclusion

FIN DE MON EXPOSE, JE VOUS REMERCIE DE VOTRE ATTENTION.

Any questions?