-
Notifications
You must be signed in to change notification settings - Fork 42
/
combiner-plusieurs-graphiques.Rmd
123 lines (86 loc) · 4.42 KB
/
combiner-plusieurs-graphiques.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
---
title: "Combiner plusieurs graphiques"
---
```{r options_communes, include=FALSE, cache=FALSE}
source("options_communes.R")
```
<div class="guide-R">
Une version actualisée de ce chapitre est disponible sur **guide-R** : [Graphiques avec ggplot2](https://larmarange.github.io/guide-R/analyses/ggplot2.html)
</div>
<div class="webin-R">
Ce chapitre est évoqué dans le webin-R #14 (exemples de graphiques avancés - 2) sur [YouTube](https://youtu.be/iJT46MGSQA8).
</div>
Vous savez réaliser des [graphiques avec **ggplot2**](intro-ggplot2.html) ? Il est très facile de combiner plusieurs graphiques en un seul.
Commençons par créer quelques graphiques avec `ggplot2`{.pkg}.
```{r}
library(ggplot2)
p1 <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
p2 <- ggplot(mtcars, aes(factor(cyl))) + geom_bar()
p3 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_violin()
p4 <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_boxplot()
```
## plot_grid (cowplot)
L'extension `cowplot`{.pkg} propose une fonction `plot_grid`{data-pkg="cowplot"}. Son usage est expliqué en détail dans les vignettes dédiées inclues avec l'extension : <https://wilkelab.org/cowplot/>.
```{r}
library(cowplot)
# simple grid
plot_grid(p1, p2, p3, p4)
# simple grid with labels and aligned plots
plot_grid(p1, p2, p3, p4, labels=c('A', 'B', 'C', 'D'), align="hv")
# manually setting the number of rows, auto-generate upper-case labels
plot_grid(p1, p2, p3, nrow=3, labels="AUTO", label_size=12, align="v")
# making rows and columns of different widths/heights
plot_grid(p1, p2, p3, p4, align='hv', rel_heights=c(2,1), rel_widths=c(1,2))
```
On notera en passant que le chargement de `cowplot`{.pkg} modifie le style par défaut des graphiques `ggplot2`{.pkg}. Voir <https://cran.r-project.org/web/packages/cowplot/vignettes/introduction.html>.
## patchwork
Citons également l'extension `patchwork`{.pkg}, disponible sur GitHub (<https://github.com/thomasp85/patchwork>) qui propose une syntaxe un petit peu différente, par <q>addition</q> de graphiques.
```{r}
library(patchwork)
p1 + (p2 + p3) + p4 + plot_layout(ncol = 1)
```
## multiplot (JLutils)
Dans son ouvrage *Cookbook for R*, Winston Chang propose une fonction `multiplot`{data-pkg="JLutils"} pour combiner plusieurs graphiques^[Voir <http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/>.]
L'extension `JLutils`{.pkg} disponible sur [GitHub](https://github.com/larmarange/JLutils) propose une version améliorée de cette fonction.
Pour installer `JLutils`{.pkg} si non disponible sur votre PC, copier/coller le code ci-dessous.
```{r, eval=FALSE}
if (!require(devtools)){
install.packages('devtools')
library(devtools)
}
install_github("larmarange/JLutils")
```
Parce que quelques exemples valent mieux qu'un long discours.
```{r}
library(JLutils)
multiplot(p1, p2, p3, p4)
multiplot(p1, p2, p3, p4, cols = 2)
multiplot(p1, p2, p3, layout = matrix(c(1,2,3,3), nrow = 2))
multiplot(p1, p2, p3, layout = matrix(c(1,2,3,3), nrow = 2, byrow = TRUE))
multiplot(p1, p2, p3, layout = matrix(c(1,2,3,3), nrow = 2, byrow = TRUE), heights = c(3, 1))
```
## Légende partagée entre plusieurs graphiques
`JLutils`{.pkg} et `cowplot`{.pkg} fournissent tous deux une fonction `get_legend`{data-pkg="cowplot"} permettant d'extraire la légende d'un graphique puis de l'utiliser avec `multiplot`{data-pkg="JLutils"} ou `plot_grid`{data-pkg="cowplot"}.
Créons quelques graphiques.
```{r}
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(carat, price, data=dsamp, colour=clarity) +
theme(plot.margin = unit(c(6,0,6,0), "pt"))
p2 <- qplot(depth, price, data=dsamp, colour=clarity) +
theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")
p3 <- qplot(color, price, data=dsamp, colour=clarity) +
theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")
```
Récupérons la légende du premier graphique graphique puis supprimons là dans les trois graphiques.
```{r}
leg <- get_legend(p1)
p1 <- p1 + theme(legend.position = "none")
p2 <- p2 + theme(legend.position = "none")
p3 <- p3 + theme(legend.position = "none")
```
Combinons le tout.
```{r}
multiplot(p1, p2, p3, leg, cols = 2)
plot_grid(p1, p2, p3, leg, ncol = 2)
```
Enfin, citons également la fonction `grid_arrange_shared_legend`{data-pkg="lemeon"} de l'extension `lemon`{.pkg}^[`lemon` fournit également diverses fonctions pour manipuler des graphiques `ggplot2`{.pkg}, comme par exemple la possibilité de répéter les axes quand on utilise des facettes.].