-
Notifications
You must be signed in to change notification settings - Fork 4
/
tp1.Rmd
2084 lines (1789 loc) · 98.9 KB
/
tp1.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
title: "Visualisation de données avec R — TP1"
author: "Arthur Katossky"
date: "Janvier 2019"
output:
pdf_document:
toc: yes
latex_engine: xelatex
# keep_tex: true
includes:
in_header: latex.sty
html_document:
toc: yes
toc_float: yes
# à choisir entre 'professeur' et 'élève'
version: professeur
---
```{r setup, echo=FALSE, warning = FALSE, message = FALSE}
library(tidyverse)
knitr::opts_chunk$set(fig.width=8, out.width='100%', fig.height=4)
# TO DO:
# - remplacer les données simmulées de la question 3.3 par des données réelles
# - remplacer les citations par un environnement "correction"
# - enlever les points à la fin des titres
# - trick to embed backticks inside R expressions
# - critique de graphique:
# - add a Venn diagram
# - autres questions sur les graphiques Q: le titre est-il clair? (y a-t-il un titre?) ; y a-t-il des commentaires pour aider la lecture? des annotations? V: test d'autosuffisance ; D: les données sont-elles accessibles? sont-elles produites par un organisme fiable? selon quelle méthode? ; coquilles et imperfections ; adapté à l'audience, adapté au medium de publication (longs graphiques pour le web, graphique photococipable, etc.) ; re-discuter de la notion d'efficacité
```
## Introduction `r if(rmarkdown::metadata$version=='professeur') "~ 10 min."`
Les premières sections de cette introduction sont fortement inspirée du chapitre introductif de Munzner (2014).
### La visualisation de données, une représentation _visuelle_
La visualisation repose sur la vision car c'est le sens le plus adapté comme support de mémoire externe:
- \dotfill
- \dotfill
- \dotfill
- \dotfill
`r if(rmarkdown::metadata$version!='professeur') "\\begin{comment}"`
> parallélisation inconsciente du traitement ; perception simmultanée ; zones cérébrales spécialisées et développées ; possibilité technique (écrans, imprimerie)"
`r if(rmarkdown::metadata$version!='professeur') "\\end{comment}"`
### Une représentation _complexe_
La visualisation présente des données les plus désagrégées possibles, pour ne pas tomber dans le piège de la synthèse (**Figure 1**).
![**Le piège de la synthèse.** Le quartet d'Anscombe est cet ensemble de quatre droites de régression identiques, bien que construites sur des données très différentes. La visualisation permet de proposer simmulaténement une lecture agrégée et désagrégée des données. **Source de l'image:** Wikipédia](img/quartet-anscombe.png)
Ce n'est évidemment pas toujours possible quand les données deviennent beaucoup trop nombreuses. Mais l'idée est d'utiliser les avantages de la vision pour transmettre beaucoup plus d'information que ce qu'il est possible de proprement _comprendre_.
### Une représentation _efficace_
La visualisation se distingue du design, de la publicité ou de l'art par \dotfill \newline .\dotfill \newline .\dotfill
`r if(rmarkdown::metadata$version!='professeur') "\\begin{comment}"`
> ... son intérêt pour l'efficacité de la représentation à communiquer une information ; nous ne poserons donc pas la question de savoir si un graphique est "joli" mais de s'il "fonctionne".
`r if(rmarkdown::metadata$version!='professeur') "\\end{comment}"`
Malheureusement \dotfill \newline .\dotfill \newline .\dotfill
`r if(rmarkdown::metadata$version!='professeur') "\\begin{comment}"`
> ... la notion d'efficacité est très floue, et dépend des tâches envisagées. Et les tâches possibles sont très nombreuses. S'agit-il de marquer l'esprit? (provoquer l'arrête d'un passant ; placer une information en mémoire du lecteur pour le plus longtemps possible) De lire précisément un chiffre? (minimiser l'erreur de lecture) De favoriser l'amusement et la découverte? (garder un utilisateur captif le plus longtemps possible, maximiser son bien-être ressenti) Etc. Parfois, il est même très malaisé de définir un objectif mesurable, comme lorsque les graphiques nous servent à écouvrir des régularités précédemment inconnues, de détecter des tendances, etc.
`r if(rmarkdown::metadata$version!='professeur') "\\end{comment}"`
Dans ce cours, nous nous intéresserons surtout à \dotfill \newline .\dotfill \newline .\dotfill \newline
`r if(rmarkdown::metadata$version!='professeur') "\\begin{comment}"`
> ... la tâche de comparer des grandeurs dans des graphiques finis, c'est-à-dire publiables. D'un côté parce que la comparaison est une tâche fondamentale (elle conditionne, par exemple, la découverte de régularités). De l'autre parce que c'est l'une de plus étudiées.
>
> Cela laisse malheureusement un immense pan du travail du statisticien, les graphiques à des fins d'exploration, qui n'est que très peu étudiée. (Cependant, connaître les conditions d'une d'une comparaison visuellement efficace nous aide déjà énormément dans cette tâche.)
`r if(rmarkdown::metadata$version!='professeur') "\\end{comment}"`
Mais même avec une tâche précise et avec une bonne définition de "l'efficacité" d'une visualisation pour cette tâche, il est extrêmement difficile/fastidieux de "valider" une visualisation. Aussi, les informations expérimentales sur la visualisation sont plutôt rares.
### Une représentation subjective
\dotfill \newline .\dotfill \newline .\dotfill \newline .\dotfill \newline
`r if(rmarkdown::metadata$version!='professeur') "\\begin{comment}"`
> Malgré sa focale sur l'efficacité, il est illusoire de penser que la visualisation est exempte de tout biais, puisque la critique montre que même des disciplines aussi "objectives" que la photographie et la cartographie sont tout autant des propositions que des descriptions (le photographe choisit quoi mettre de dans le cadre, le cartographe une projection, des figurés, etc.).
> Dans ce cours, je vous propose d'assumer constamment votre subjectivité, notamment en choissant des titres clairs et qui véhiculent un message, plutôt que de vous cacher derrière une objectivité en toc.
`r if(rmarkdown::metadata$version!='professeur') "\\end{comment}"`
### `ggplot` et `tidyverse`
Nous utiliserons dans ce cours la bibliothèque `ggplot2`, inspiré de _The Grammar of Graphics_ (Wilkinson, 2005), qui permet de réaliser des graphiques d'une étonnante richesse, tout en gardant un code clair.
Cette bibliothèque fait partie de la série de bibliothèques `tidyverse`, maintenue et développée les programmeurs de RStudio, au premier rang desquels Hadley Wickham. Ces bibliothèques rendent plus cohérentes de nombreuses fonctionsde R-base, qui fonctionnaient jusqu'alors selon chacune leur logique propre. La plupart étant transparentes pour l'utilisateur, je les utilise sans le mentionner explicitement. Mais n'hésitez pas à me poser des questions sur des fonctions qui vous sont inconnues.
La seule nouveauté sur laquelle je vais insister dès maintenant, c'est la notation `%>%` (aka _pipe_), qui permet de remplacer:
- `f(x)` par `x %>% f` et
- `f(x,a)` par `x %>% f(a)`.
Cela paraît un peu ridicule à premier abord (c'est plus long!), mais cela permet de faire de très longues chaînes de fonctions qui, si les fonctions ont été pensées pour, sont très lisibles.
Par exemple `paste0(rev(toupper(letters)), collapse='')` devient:
`letters %>% .......................................................`
`r if(rmarkdown::metadata$version!='professeur') "\\begin{comment}"`
> `letters %>% str_to_upper %>% rev %>% str_c(collapse='')`
>
> 1. C'est plus conforme à l'ordre logique.
> 2. Notez les fonctions `str_...` de la bibliothèque `tidyverse` qui remplacent toutes les fonctions ayant trait aux chaînes de caractères.
`r if(rmarkdown::metadata$version!='professeur') "\\end{comment}"`
### Les données
Nous travaillerons avec des données Eurostat, principalement des données de population au niveau NUTS 2 (le découpage officiel statistique européeen, qui possède 3 niveaux). Le tableau de données `NUTS2_year` possède une ligne par région NUTS 2 et par année d'observation:
```{r, echo=FALSE}
load('data/NUTS2_year.RData')
NUTS2_year
```
## 1. Faire un graphique avec `ggplot2` `r if(rmarkdown::metadata$version=='professeur') "~ 15 min."`
### 1.1 Graphique basique
Commençons par un exemple: l'évolution de la population en Champagne-Ardenne et en Picardie entre 1990 et 2015.
```{r 1-1-graphique-basique, echo=TRUE}
NUTS2_year %>%
filter(nom %in% c('Champagne-Ardenne', 'Picardie')) %>%
ggplot(aes(x=année, y=population)) +
geom_line(aes(group=nom))
```
Le code du plus simple graphique `ggplot2` possède trois parties:
1. `data %>% ggplot(...)`: \dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> J'appelle la fonction `ggplot()` sur les données.
> La fonction `ggplot()` seule ne produit pas de graphiques, mais crée un objet `ggplot`.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
Notez que `data %>% ggplot(...)` est la même chose que `ggplot(data, ...)`, mais cela est plus lisible quand comme ici je transforme mes données à la vollée avec `filter`. Ainsi:
```{r, eval=FALSE, echo=TRUE}
NUTS2_year %>% filter(nom %in% c('Champagne-Ardenne', 'Picardie')) %>% ggplot
```
... est l'équivalent en R-base de:
```{r, eval=FALSE, echo=TRUE}
ggplot(............................................................................)
```
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> ```{r, eval=FALSE, echo=TRUE}
> ggplot(NUTS2_year[NUTS2_year$nom %in% c('Champagne-Ardenne', 'Picardie'), ])
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
2. `aes(...)`: \dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> La fonction `aes()` — comme _æsthetics_ — permet de préciser quelles variables vont être utilisées dans la production du graphique, et quels paramètres (position, forme, couleur, etc.) vont dépendre de quelles variables.
> Ici, les années seront en abscisse (`x=année`), la population en ordonnée (`y=population`).
> `aes()` peut-être spécifiée dans la fonction `ggplot()` mais aussi individuellement pour chaque couche.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
Les paramètres graphiques spécifiés dans `ggplot()` sont valables pour **tout** le graphique.
3. `geom_...(...)`: \dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> Enfin, j'ajoute à l'_objet_ `ggplot` issu de la _fonction_ `ggplot()` une fonction qui, elle, va indiquer quel type de graphique produire. Une telle fonction commence généralement par le préfixe `geom_...`, et je la sépare de l'appel à la fonction `ggplot()` par un `+`.
> Ici, les années seront en abscisse (`x=année`), la population en ordonnée (`y=population`).
> `aes()` peut-être spécifiée dans la fonction `ggplot()` mais aussi individuellement pour chaque couche.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
Chaque fonction `geom_...` produit une nouvelle couche (_layer_) contenant les figures (_geometries_) indiquées par le suffixe de la fonction. Ici, `geom_line` produit des lignes (_lines_). Les fonctions graphiques réutilisent les paramètres fournis dans l'argument `aes()` de la fonction `ggplot()`, ici les coordonnées `x=année` et `y=population`. Mais chaque couche peut avoir en sus ses propres paramètres graphiques additionnels. Ici, tous les points correspondant à une même région NUTS 2 (`group=nom`) seront reliés entre eux par des segments, constituant ainsi une ligne.
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Commentaires à l'oral selon besoin:**
>
> - Comme la fonction `plot`, la fonction `ggplot` s'utilise avec des données au format long, où chaque ligne correspond à une observation. Par exemple, si je télécharge un tableau du chômage avec des pays en ligne, et des années en colonne, il faut reformater les données pour avoir une colonne "pays" et une colonne "année" et enfin une colonne "chômage" avant de pouvoir la représenter.
> - Le verbe `filter` sert à filter les données en sélectionnant les observations. (En cela, il est complémentaire du verbe `select` qui permet, lui, de filtrer les colonnes.)
> - Il ne faut pas oublier les parenthèses dans `geom_line()`, même quand on ne donne pas de paramètres, car il s'agit bien d'une fonction!
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 1.1.1** Représentez sous forme d'un nuage de points la superficie (`superficie`, en abscisse) et la population (`population`en ordonnée) des régions NUTS 2 en 2015. Notez le nom de la fonction `geom_...` que vous avez utilisé.
- *Avec* R Studio*, utilisez l'autocomplétion (touche* `tab`*). Souvenez-vous en effet que toutes les fonctions graphiques commencent par* `geom`.
\dotfill
````{r, eval = FALSE}
NUTS2_year %>%
filter(.......................) %>%
ggplot(aes(x=....................., y=............................)) +
geom_..........................()
```
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Suggestion de code:**
> ```{r, echo=TRUE}
> NUTS2_year %>%
> filter(année == 2015, !is.na(population), !is.na(superficie)) %>%
> ggplot(aes(x=superficie, y=population)) +
> geom_point()
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 1.1.2** Il est possible de superposer plusieurs couches graphiques. Pouvez-vous rajouter des étiquettes à chaque observation? Notez le nom de la fonction que vous avez utilisé.
\dotfill
- *Utilisez la documentation (*`?fonction`*) pour connaître les paramètre graphiques obligatoires.*
- _**Rappel:** Il est possible d'appeler la fonction_ `aes()` *dans chaque couche graphique.*
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Suggestion de code:**
> ```{r, echo=TRUE}
> NUTS2_year %>%
> filter(année == 2015, !is.na(population), !is.na(superficie)) %>%
> ggplot(aes(x=superficie, y=population)) +
> geom_point() +
> geom_text(aes(label=id_anc))
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**En attendant...** Les étiquettes et les points du graphique précédent se chevauchent mutuellement. Comment faire pour décaler — en anglais _to nudge_ — une étiquette par rapport à sa position réelle, afin de ne pas recouvrir les points avec les étiquettes? Est-ce que cela résout le problème totalement? Quelles autres améliorations sont possibles?
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Suggestion de code:**
> ```{r, echo=TRUE}
> NUTS2_year %>%
> filter(année == 2015, !is.na(population), !is.na(superficie)) %>%
> ggplot(aes(x=superficie, y=population)) +
> geom_point() +
> geom_text(
> # Je ne conserve que les données dans les zones les moins denses.
> data = . %>% filter(population>5000000 | superficie>50000),
> aes(label=id_anc),
> # Pour changer la taille du texte, pour des raisons arbitraires
> # et indépendantes des données, je place le paramètre graphique
> # **en dehors** de la fonction aes().
> size=2,
> # nudge_y permet de décaler le texte verticalement ;
> # la valeur est donnée en unités réelles (ici des habitants)
> nudge_y=400000
> )
> ```
>
> **Remarque technique au correcteur:** j'ai expérimenté que la structure `geom_text(data = . %>% dplyr_verb)` ne fonctionne pas tout le temps (alors qu'elle est très intuitives, puiqu'on réutilise les données qui étaient en entrée!) ; il semble que dans la plupart des cas, `. %>% func` est interprété comme une fonction anonyme (l'équivalent de `function(x){func(x)}`). Et quand l'argument `data` d'une fonction `geom_...()` est une fonction, alors ce sont les données spécifiées dans le `data` de `ggplot()` qui sont transformées par cette fonction avant de produire la nouvelle couche graphique.
>
> Mais pas la peine d'en parler aux élèves, sauf si le bug apparaît dans leur code :)
`r if(rmarkdown::metadata$version!='professeur') "-->"`
### 1.2 Options de présentation
Le graphique Picardie—Champagne-Ardenne obtenu précédemment n'est pas satisfaisant:
1. \dotfill
2. \dotfill
3. \dotfill
4. \dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Éléments de correction:** il ne ne possède pas de titre ; les axes ont des titres inadéquats ('population' et 'année' peuvent être sous-entendus, car dans le premier cas, l'information sera dans le titre, et dans le second cas, les valeurs en abscisse sont transparentes) ; les nombres en ordonnée sont difficilement lisibles à cause du nombre de zéros / de l'écriture scientifique ; le graphique utilise un fond gris sur un arrière-plan blanc (sans raison apparente)
`r if(rmarkdown::metadata$version!='professeur') "-->"`
Des fonctions supplémentaires permettent de régler ces problèmes. Revoici le même graphique qu'initialement, mais avec une mise en page améliorée:
```{r, echo=TRUE}
NUTS2_year %>%
filter(nom %in% c('Champagne-Ardenne', 'Picardie')) %>%
ggplot(aes(x=année, y=population, group=nom)) +
geom_line() +
# changer le style de graphique
theme_minimal() +
# supprimer les titres des deux axes
# utiliser un format plus lisible sur l'axe des ordonnées
scale_x_continuous(name = NULL) +
scale_y_continuous(name = NULL, labels = scales:::number) +
# ajouter titre et sous-titre
labs(
title = "La Picardie se peuple pendant que\nla Champagne-Ardenne se dépeuple",
subtitle = "Population de 1990 à 2017"
)
```
**Exercice 1.2.1** Repérez les éléments qui permettent...
- de supprimer le nom des axes: \dotfill
- d'adopter un thème général plus sobre: \dotfill
- de donner un titre, un sous-titre: \dotfill
- de contrôler le format d'affichage sur les axes: \dotfill
**Exercice 1.2.2** À quoi correspond le `\n` dans le code du titre?
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Éléments de correction:** Il s'agit d'un retour à la ligne. `\` est un caractère échappement, permettant de saisir des séquences spéciales (caractères Univode par exemple). Pour obtenir un `\` dans un titre, il faut tapper `\\`. Pour une liste de toutes les séquences reconnues, voir `?Quote`.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 1.2.3** Le graphique Picardie—Champagne-Ardenne reste cependant incomplet. Que lui manque-t-il avant de pouvoir être publié ?
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Éléments de correction:** Il manque la source des données — par exemple avec `labs(caption=...)` — et surtout une façon d'associer les lignes à chacune des deux régions — par exemple avec `geom_text`. (Ceci dit, il n'est pas toujours nécessaire d'identifier une observation en particulier. Ici, par contre, c'est bienvenu!)
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 1.2.4** Reprenez votre graphique population—superficie et habillez-le pour le rendre publiable.
- _N'oubliez pas de donner un titre et sous-titre à votre graphique. Je recommande de donner pour titre une phrase-choc (ex: "La Normandie, destination rêvée des français.") et pour sous-titre un descriptif plus neutre (ex: "Nombre de nuités par région en 2015")._
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Éléments de correction:**
> - Bien insister sur le fait qu'**un graphique doit véhiculer un message**. S'il est difficile de trouver un titre, c'est qu'il n'y a pas de message, et c'est souvent que le graphique est peu pertinent. Les ingénieurs ont tendance à inverser la hiérarchie entre le message / storytelling (qui est le principal aux yeux du lecteur) et le descriptif pur (qui intéressera le lecteur seulement si le message l'intéresse). Je m'efforce dans tous mes graphiques de donner des titres un tant soit peu intéressants pour donner l'exemple.
> - [si la question est posée] Pour les caractères spéciaux dans les titres (ici un ²), il est toujours plus simple d'avoir recours aux caractères Unicode que d'utiliser des formules dans le style LaTeX.
>
> **Suggestion de code**
> ```{r, echo=TRUE, out.width='80%', fig.width=6}
> NUTS2_year %>%
> # pour cette partie du code, voir exercice bonus A
> filter(année == 2015, !is.na(population), !is.na(superficie)) %>%
> ggplot(aes(x=superficie, y=population)) +
> geom_point() +
> geom_text(
> data = . %>% filter(population>5000000 | superficie>50000),
> aes(label=id_anc),
> size=2,
> nudge_y=400000
> ) +
> # utiliser un format plus naturel (les titres des axes peuvent être spécifiés ici...)
> scale_x_continuous(name='Superficie (km²)', labels = scales:::number) +
> scale_y_continuous(labels = scales:::number) +
> # changer le style de graphique
> theme_minimal() +
> # ajouter titre, sous-titre...
> labs(
> y = 'Population', # les titres des axes peuvent être spécifiés ici...
> title = "Istanbul (Turquie) surpeuplée, Oulu (Finlande) isolée",
> subtitle = "Population et superficie en Europe (2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**En attendant...** Sur votre graphique population-superficie, explorez quelques thèmes de graphique. Notez le noms de ceux qui vous plaisent. Parmi eux, notez le nom de ceux qui vous semblent les plus _efficaces_.
1. *Tous les thèmes de graphiques commencent par* `theme_...`. *Vous pouvez donc utiliser l'autocomplétion de* RStudio *!*
2. _Vous pouvez créer un objet_ `ggplot` _avec_ `object <- ggplot(data, aes(...)) + geom_...()` _puis jouer avec les thèmes avec_ `objet + theme_...()`.
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Proposition de correction:** rappeler qu'il ne s'agit en fait pas de savoir si l'un est plus "joli" que l'autre et recentrer le débat sur la notion d'efficacité ; parler du ratio encre-information, qu'il s'agit de minimiser (le moins de trait sur le graphique, le mieux nous nous portons) en rappelant qu'il ne faut pas tomber dans l'excès inverse. D'autres considérations entrent en jeux: le contrast avec les données, la lisibilité...
>
> Le défaut de `ggplot()` n'est pas forcément le graphique le plus efficace qui soit: il privilégie l'effacement des lignes de guidage (en blanc) au profit d'une grande zone grise en fond du graphique. Je préfère personnllement `theme_minimal()`.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
## 2. Représenter des données continues
Des données peuvent être représentées visuellement de très, très nombreuses façons. Nous allons explorer quelques-uns de ces **canaux** de transmission (en anglais _channels_) et tenter de les hiérarchiser. Pour commencer, occupons nous des canaux les plus usuels: ceux basés sur les **longueurs** (longueurs au sens strict, mais aussi la **position** dans le plan).
Nous nous tournerons ensuite vers les *angles* et la *pente*, avant de passer à la **couleur** et à la **superficie**.
### 2.1 Longueurs
Voici la trame d'un graphique qui repésente le changement démographique entre 2005 et 2015, chaque région NUTS 2 étant représentée par une flêche. L'origine de la flèche part de la population en 2005, et la pointe arrive à la population en 2015.
````{r, eval = FALSE}
NUTS2_year %>%
# pré-traitement
filter(!str_detect(id_anc, '^TR')) %>% # <-------------------------------- (1)
filter(......................) %>%
arrange(année) %>% # <---------------------------------------------------- (A)
# graphique (cœur)
ggplot(aes(x=.................., y=......................)) +
geom_line(arrow = arrow(length = unit(0.1, "cm"))) +
# ajouter des étiquettes
geom_text(
data = . %>%
group_by(id_anc) %>%
summarise(population=max(population)), # <---------------------------- (2)
aes(label=id_anc),
size=2, # <------------------------------------------------------------- (3)
nudge_y=200000 # <------------------------------------------------------ (B)
) +
# graphique (mise en page)
scale_x_discrete(name=NULL, breaks=NULL) + # <---------------------------- (C)
scale_y_continuous(name=NULL, labels = scales:::number) +
theme_minimal() +
labs(
title = "France, Espagne et Italie tirent la croisance démographique Européenne.",
subtitle = "Croissance de la population (2005-2015)",
caption = "Source: Eurostat (niveau NUTS 2)"
)
```
```{r echo=FALSE, eval=TRUE, warning=FALSE}
NUTS2_year %>%
# pré-traitement
filter(!str_detect(id_anc, '^TR')) %>%
filter(année %in% c(2005,2015), !is.na(population)) %>%
arrange(année) %>%
# graphique (cœur)
ggplot(aes(x=id_anc, y=population)) +
geom_line(arrow = arrow(length = unit(0.1, "cm"))) +
# ajouter des étiquettes
geom_text(
data = . %>%
group_by(id_anc) %>%
summarise(population=max(population)),
aes(label=id_anc),
size=2,
nudge_y=200000
) +
# graphique (mise en page)
scale_x_discrete(name=NULL, breaks=NULL) +
scale_y_continuous(name=NULL, labels = scales:::number) +
theme_minimal() +
labs(
title = "France, Espagne et Italie tirent la croisance démographique Européenne.",
subtitle = "Croissance de la population (2005-2015)",
caption = "Source: Eurostat (niveau NUTS 2)"
)
```
**Exercice 2.1.1** À quoi correspondent l'élément (1)? En particulier, à quoi correspond le `'^'`?
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Remarque:** Ne **surtout pas** approfondir sur les expressions régulières. Expliquer simplement que `^` correspond au début d'un mot et que `str_detect` renvoie `TRUE` si une chaîne de caractères contient le motif (`pattern`) demandé.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 2.1.2** Au niveau de l'élément (2), la combinaison `group_by() %>% summarize()` permet de faire des opérations par groupe. De quelle opération s'agit-il? En quoi est-ce utile?
.\dotfill \newline
.\dotfill \newline
.\dotfill
**Exercice 2.1.3** À quoi correspondent l'élément (3)? Pourquoi ne pas mettre `size` à l'intérieur de la fonction `aes()`?
.\dotfill \newline
.\dotfill \newline
.\dotfill
**Exercice 2.1.4** Complétez la trame.
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> ```{r echo=TRUE, eval=FALSE}
> NUTS2_year %>%
> # pré-traitement
> filter(!str_detect(id_anc, '^TR')) %>% # suppression des données turques (1)
> filter(année %in% c(2005,2015), !is.na(population)) %>%
> # graphique (cœur)
> ggplot(aes(x=id_anc, y=population)) +
> geom_line(arrow = arrow(length = unit(0.1, "cm"))) +
> # ajouter des étiquettes
> geom_text(
> # Si je ne change pas les données en entrée, chaque étiquette est imprimée
> # pour chaque observations, soit deux fois pour chaque région (2005 et 2015).
> # Je décide de ne retenir pour chaque region NUTS 2 que la plus grande
> # population atteinte, de façon à que ce que l'étiquette soit toujours
> # au-dessus de la flèche. (2)
> data = . %>%
> group_by(id_anc) %>%
> summarise(population=max(population)),
> aes(label=id_anc),
> size=2, # diminuer la taille de la police sans référence aux données (3)
> nudge_y=200000
> ) +
> # graphique (mise en page)
> scale_x_discrete(name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = scales:::number) +
> theme_minimal() +
> labs(
> title = "France, Espagne et Italie tirent la croisance démographique Européenne.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 2.1.5** Que se passe-t-il si j'efface la ligne `arrange(...) %>%` (A)? Si je supprime `nudge_y=...` dans la fonction `geom_text()` (B)? Que se passe-t-il si j'enlève `breaks=NULL` dans la fonction `scale_x_discrete()` (C)?
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> `nudge_y` sert à écarter le texte de la pointe des flèches
> Quand à `breaks`, le paramètre décrit les lignes qui quadrillent le graphique verticalement (pour `scale_x_...`) ou horizontalement (pour `scale_y_...`). Les identifiants NUTS 2 n'étant pas des grandeurs continues, `ggplot2` imprime par défaut autant de ligne que de valeurs, ce qui vu le nombre d'identifiants n'aide en rien la lecture.
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 2.1.6** La croissance démographique est-elle plus grande en île de France (`FR10`) ou à Rome (`ITI4`)?
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill
**En attendant...** Colorez la flêche en fonction de si la croissance et positive ou négative.
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Suggestion de correction:**
> ```{r echo=TRUE, message=FALSE, warning=FALSE}
> NUTS2_year %>%
> filter(!str_detect(id_anc, '^TR')) %>%
> filter(année %in% c(2005, 2015)) %>%
> # ---------------------------------------------------------------------- DÉBUT
> arrange(année) %>%
> group_by(id_anc) %>% mutate(
> max = max(population),
> increase = first(population)<last(population)
> ) %>% ungroup %>%
> # ------------------------------------------------------------------------ FIN
> ggplot(aes(x=id_anc, y=population)) +
> geom_line(
> aes(color=increase), # <---------------------------------------------------X
> arrow = arrow(length = unit(0.1, "cm"))
> ) +
> geom_text(
> data = . %>% group_by(id_anc) %>% slice(1),
> aes(y=max, label=id_anc),
> size=2, # diminuer la taille de la police
> nudge_y=200000 # écarter l'étiquette de l'extrémité de la flêche
> ) +
> scale_x_discrete(name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = scales:::number) +
> guides(color=FALSE) + # <--------------------------- suppression de la légende
> theme_minimal() +
> labs(
> title = "France, Espagne et Italie tirent la croisance démographique Européenne.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
>
> **Remarque:** il existe une autre possibilité avec `geom_segment`, mais qui oblige à restructurer les données d'un format long à un format large:
>
> ```{r, eval=FALSE}
> NUTS2_year %>%
> # garder uniquement les années 2005 et 2015
> filter(année %in% c(2005, 2015)) %>%
> # passer du format long (1 ligne = 1 région x 1 année) au format large (1 ligne = 1 région)
> select(id_anc, année, population) %>%
> spread(année, population) %>%
> # calculer la croissance démographique
> # remarque: spread() créee des variables à partir de valeurs (2005, 2015) qui ne sont pas des variables acceptées par défaut par R. Pour se réferer à elle, il faut alors utiliser les "backticks" (accents graves).
> mutate(croissance = `2015`-`2005`) %>%
> filter(!is.na(croissance)) %>%
> ggplot(aes(x=id_anc, xend=id_anc)) +
> # geom_segment trace des segments avec les paramètres x, xend, y, yend. Il y a donc un segment par observation. Au contraire, geom_line trace une ligne par groupe d'observations (comme spécifié avec aes(group=...)).
> geom_segment(
> aes(color=croissance>0, y=`2005`, yend=`2015`),
> arrow = arrow(length = unit(0.1, "cm"))
> ) + ...
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**En attendant...** Comment est-il possible de réordonner les flèches pour nous aider à répondre à la question précédente?
- *La fonction* `reorder` *aide à réordonner les modalités d'une variable de type* `factor`.
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **À l'oral:** par défaut les textes vont être triés de façon alphabétique, ce qui ici est pertinent (les codes sont alphabétiques, donc toutes les régions sont regroupées les unes avec les autres ; il serait possible d'utiliser la couleur pour le visualiser)
>
> **Correction:** Il est envisageable de trier: par l'origine, par la pointe ou par la longueur de la flêche. Aucune de deux premières versions ne nous aident à comparer Paris et Rome. Avec la dernière, le *rang* est maintenant en abscisse. On peut donc en déduire que Rome croît plus rapidement que Paris. Mais ce n'est pas par comparaison des longueurs que l'on tire cet enseignement!
>
> ```{r, echo=TRUE, out.width='80%', fig.width=8, warning=FALSE}
> NUTS2_year %>%
> filter(!str_detect(id_anc, '^TR')) %>%
> filter(année %in% c(2005, 2015)) %>%
> arrange(année) %>%
> group_by(id_anc) %>% mutate(
> max = max(population),
> increase = first(population)<last(population)
> ) %>% ungroup %>%
> # passer par reorder() pour choisir l'ordre d'apparition des modalités
> mutate(
> # x_min = reorder(id_anc, population, min),
> # x_max = reorder(id_anc, population, function(x) max(x)),
> id_anc = reorder(id_anc, population, function(x) last(x)-first(x))
> ) %>%
> ggplot(aes(x=id_anc, y=population)) +
> geom_line(aes(color=increase), arrow = arrow(length = unit(0.1, "cm"))) +
> geom_text(
> data = . %>% group_by(id_anc) %>% slice(1),
> aes(y=max, label=id_anc),
> size=2,
> nudge_y=200000
> ) +
> scale_x_discrete(name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = scales:::number) +
> guides(color=FALSE) +
> theme_minimal() +
> labs(
> title = "France, Espagne et Italie tirent la croisance démographique Européenne.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
### 2.2 Position
```{r, echo=FALSE}
number_plus <- function(x) paste0(
ifelse(x>0, '+', '') ,
scales:::number(x)
)
NUTS2_year %>%
group_by(id_anc) %>% summarize(
croissance = population[année==2015]-population[année==2005]
) %>%
filter(!is.na(croissance)) %>%
ggplot(aes(x=id_anc, y=croissance)) +
geom_point() +
geom_text(
aes(label = id_anc),
size=2, nudge_y=30000
) +
scale_x_discrete( name=NULL, breaks=NULL) +
scale_y_continuous(name=NULL, labels = number_plus) +
theme_minimal() +
labs(
title = "France, Espagne et Italie tirent la croissance démographique Européenne.",
subtitle = "Croissance de la population (2005-2015)",
caption = "Source: Eurostat (niveau NUTS 2)"
)
```
**Exercice 2.2.1** Complétez la trame suivante pour obtenir le graphique ci-dessus. La croissance démographique entre 2005 et 2015 est en ordonnée, et les régions en abscisse.
- *Inspirez vous librement des exercices précédents!*
````{r, eval = FALSE}
NUTS2_year %>%
...................
...................
...................
...................
...................
...................
...................
...................
................... +
scale_x_discrete( name=NULL, ............) +
scale_y_continuous(name=NULL, ............) +
theme_minimal() +
labs(
title = "France, Espagne et Italie tirent la croissance démographique Européenne.",
subtitle = "Croissance de la population (2005-2015)",
caption = "Source: Eurostat (niveau NUTS 2)"
)
```
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> **Suggestion de correction:**
> ```{r, eval=FALSE}
>
> # une nouvelle fonction d'échelle pour avoir un + devant les signes positifs
> number_plus <- function(x) str_c( # coller ensemble
> ifelse(x>0, '+', '') , # un + si le nombre est positif
> scales:::number(x) # et le format classique des nombres
> )
>
> NUTS2_year %>%
> # calculer de la croissance démographique
> group_by(id_anc) %>% summarize(
> # Il existe de très nombreuses façon de faire ce calcul,
> # mais il faut bien se rappeler que les populations sont sur des
> # **lignes** différentes.
> croissance = population[année=='2015']-population[année=='2005']
> ) %>%
> # Supprimer les valeurs manquantes
> filter(!is.na(croissance)) %>%
> # graphique (cœur)
> ggplot(aes(x=id_anc, y=croissance)) +
> geom_point() +
> geom_text(
> aes(label = id_anc),
> size=2, nudge_y=30000
> ) +
> # graphique (mise en page)
> scale_x_discrete( name=NULL, breaks=NULL) + # supprimer barres verticales
> scale_y_continuous(name=NULL, labels = number_plus) + # formater les ordon.
> theme_minimal() +
> labs(
> title = "France, Espagne et Italie tirent la croissance démographique Européenne.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 2.2.2** La perte démographique est-elle plus grande au Saxe-Anhalt (`DEE0`) ou en Lettonie (`LV00`)?
.\dotfill \newline
.\dotfill \newline
.\dotfill \newline
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> Il n'est pas possible de répondre facilement. En revanche, on arrive clairement à faire la différence entre Paris (`FR10`) et Rome (`ITI4`) désormais! Il y a du progrès.
> ```{r echo=FALSE}
> NUTS2_year %>%
> filter(année %in% c(2005, 2015)) %>%
> # calculer de la croissance démographique
> group_by(id_anc) %>% summarize(
> croissance = population[année=='2015']-population[année=='2005']
> ) %>%
> # supprimer les valeurs manquantes
> filter(!is.na(croissance)) %>%
> # produire le graphique
> ggplot(aes(x=id_anc, y=croissance)) +
> geom_point() +
> geom_text(
> aes(label = id_anc),
> size=2, nudge_y=30000
> ) +
> # simplifier la mise en page
> scale_x_discrete( name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = number_plus) +
> theme_minimal() +
> labs(
> title = "Saxe-Anhalt et Lettonie en régression démographique.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**En attendant...** Pour nous aider à répondre à la question précédente, colorez les points correspondants au Saxe-Anhalt (`DEE0`) ou et à la Lettonie (`LV00`), ainsi que, pour comparaison, les point correspondant à Paris (`FR10`) et Rome (`ITI4`) d'une autre couleur.
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> ```{r, eval=FALSE}
> geom_point(data = . %>% filter(id_anc %in% c("DEE0", "LV00")), color='red') +
> geom_point(data = . %>% filter(id_anc %in% c("FR10", "ITI4")), color='green') +
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**En attendant...** Proposer une réorganisation des points qui facilite la comparaison.
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> ```{r, eval=FALSE}
> # réordonner une variable de type facteur avec `reorder`
> ...
> mutate(id_anc = reorder(id_anc, croissance)) %>%
> ...
> geom_text(
> aes(label = id_anc),
> size=2,
> nudge_y=-5000, nudge_x=0.5, angle=-45, hjust=0 # étiquettres en biais
> ) +
> ...
> ```
> ```{r, echo=FALSE, eval=TRUE}
> NUTS2_year %>%
> filter(année %in% c(2005, 2015)) %>%
> group_by(id_anc) %>% summarize(
> croissance = population[année=='2015']-population[année=='2005']
> ) %>%
> mutate(id_anc = reorder(id_anc, croissance)) %>%
> filter(!is.na(croissance)) %>%
> ggplot(aes(x=id_anc, y=croissance)) +
> geom_point() +
> geom_point(data = . %>% filter(id_anc %in% c("DEE0", "LV00")), color='red') +
> geom_point(data = . %>% filter(id_anc %in% c("FR10", "ITI4")), color='green') +
> geom_text(
> aes(label = id_anc),
> size=2, nudge_y=-5000, nudge_x=0.5, angle=-45, hjust=0
> ) +
> scale_x_discrete( name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = number_plus) +
> theme_minimal() +
> labs(
> title = "Saxe-Anhalt et Lettonie en régression démographique.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
### 2.3 Longueurs + position
**Exercice 2.3.1** Changez une ligne du code de l'exercice 2.2.1 pour maintenant représenter la croissance démographiques à l'aide d'un diagramme en barres.
- _Par soucis de lisibilité, vous pouvez également retirer les régions de croissance démographique proche de zéro._
```{r, eval=FALSE}
NUTS2_year %>%
filter(année %in% c(2005, 2015)) %>%
group_by(id_anc) %>% summarize(
croissance = population[order(année)] %>% {last(.)-first(.)}
) %>%
filter(!is.na(croissance)) %>%
ggplot(aes(x=id_anc, y=croissance)) +
geom_point() +
geom_text(
aes(label = id_anc),
size=2, nudge_y=30000
) +
scale_x_discrete( name=NULL, breaks=NULL) +
scale_y_continuous(name=NULL, labels = number_plus) +
theme_minimal() +
labs(
title = "France, Espagne et Italie tirent la croissance démographique Européenne.",
subtitle = "Croissance de la population (2005-2015)",
caption = "Source: Eurostat (niveau NUTS 2)"
)
```
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> Il fallait utiliser `geom_col`, et non `geom_bar`. (Avec `geom_bar`, `ggplot2` suppose que l'utilisateur souhaite une sorte d'histogramme. `geom_bar` va donc tenter de compter le nombre de fois où `id_anc` apparaît dans les données pour passer ce nombre en ordonnées. Il est possible d'empêcher ce comportement avec l'option `stat='identity'`.)
>
> **Suggestion de code:**
> ```{r, echo=TRUE}
> NUTS2_year %>%
> filter(année %in% c(2005, 2015)) %>%
> group_by(id_anc) %>% summarize(
> croissance = population[order(année)] %>% {last(.)-first(.)}
> ) %>%
> filter(!is.na(croissance), abs(croissance) > 100000) %>% # <-- FILTRE CROIS.=0
> ggplot(aes(x=id_anc, y=croissance)) +
> geom_col() + # <------------------------------------------ DIAGRAMME EN BARRES
> geom_text(
> aes(
> label = id_anc,
> # V----------------------------------------------------- ÉTIQUETTES LISIBLES
> y = ifelse(croissance>0, -10000, 10000),
> hjust = ifelse(croissance>0, 1, 0)
> ),
> size=1.8, angle = 90) +
> # -------------------------------------------------------------------------X
> scale_x_discrete( name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = number_plus) +
> theme_minimal() +
> labs(
> title = "France, Espagne et Italie tirent la croissance démographique Européenne.",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 2.3.2** La croissance démographique est-elle plus grande en Émilie-Romagne (`ITH5`) ou à Stockholm `SE11`?
.\dotfill \newline
.\dotfill \newline
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> La croissance a l'air plus forte en Émilie-Romagne, mais c'est dur à dire à cause de la distance entre les barres.
> ```{r, echo=FALSE}
> NUTS2_year %>%
> filter(année %in% c(2005, 2015)) %>%
> group_by(id_anc) %>% summarize(
> croissance = population[order(année)] %>% {last(.)-first(.)}
> ) %>%
> filter(!is.na(croissance), abs(croissance) > 100000) %>%
> ggplot(aes(x=id_anc, y=croissance)) +
> geom_col() +
> geom_col(data=.%>% filter(id_anc %in% c('SE11','ITH5')), fill='darkblue') +
> geom_text(
> aes(
> label = id_anc,
> y = ifelse(croissance>0, -10000, 10000),
> hjust = ifelse(croissance>0, 1, 0)
> ),
> size=1.8, angle = 90) +
> scale_x_discrete( name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = number_plus) +
> theme_minimal() +
> labs(
> title = "Émilie-Romagne (Italie) et Stockholm (Suède)\ndans la couse démographique Européenne",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**Exercice 2.3.3** Rajouter une ligne au code suivant pour réorganiser les barres par ordre croissant (ou décroissant). Est-il plus facile de répondre?
.\dotfill
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
```{r eval=FALSE}
NUTS2_year %>%
filter(année %in% c(2005, 2015)) %>%
group_by(id_anc) %>% summarize(
croissance = population[order(année)] %>% {last(.)-first(.)}
) %>%
filter(!is.na(croissance), abs(croissance) > 100000) %>%
ggplot(aes(x=id_anc, y=croissance)) +
geom_col() +
geom_col(data=.%>% filter(id_anc %in% c('SE11','ITH5')), fill='darkblue') +
geom_text(
aes(
label = id_anc,
y = ifelse(croissance>0, -10000, 10000),
hjust = ifelse(croissance>0, 1, 0)
),
size=1.8, angle = 90) +
scale_x_discrete( name=NULL, breaks=NULL) +
scale_y_continuous(name=NULL, labels = number_plus) +
theme_minimal() +
labs(
title = "Émilie-Romagne (Italie) et Stockholm (Suède)\ndans la couse démographique Européenne",
subtitle = "Croissance de la population (2005-2015)",
caption = "Source: Eurostat (niveau NUTS 2)"
)
```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
`r if(rmarkdown::metadata$version!='professeur') "<!--"`
> ```{r, echo=TRUE}
> NUTS2_year %>%
> filter(année %in% c(2005, 2015)) %>%
> group_by(id_anc) %>% summarize(
> croissance = population[order(année)] %>% {last(.)-first(.)}
> ) %>%
> mutate(id_anc = reorder(id_anc, croissance)) %>% # <-------------------------X
> filter(!is.na(croissance), abs(croissance) > 100000) %>%
> ggplot(aes(x=id_anc, y=croissance)) +
> geom_col() +
> geom_col(data=.%>% filter(id_anc %in% c('SE11','ITH5')), fill='darkblue') +
> geom_text(
> aes(
> label = id_anc,
> y = ifelse(croissance>0, -10000, 10000),
> hjust = ifelse(croissance>0, 1, 0)
> ),
> size=1.8, angle = 90) +
> scale_x_discrete( name=NULL, breaks=NULL) +
> scale_y_continuous(name=NULL, labels = number_plus) +
> theme_minimal() +
> labs(
> title = "Émilie-Romagne (Italie) et Stockholm (Suède)\ndans la couse démographique > Européenne",
> subtitle = "Croissance de la population (2005-2015)",
> caption = "Source: Eurostat (niveau NUTS 2)"
> )
> ```
`r if(rmarkdown::metadata$version!='professeur') "-->"`
**En attendant...** Faire en sorte que les étiquettes restent lisibles dans la partie haute et dans la partie basse du graphique.
### 2.4 Angles
Le graphique ci-dessous repésente la part des moins de 20 ans dans la population de quelques régions européennes sélectionnées au hasard.
```{r, echo=FALSE}
NUTS2_year %>%
filter(!is.na(population), !is.na(population_0_19)) %>%
filter(id_anc %in% sample(unique(id_anc), size = 10)) %>%
mutate(angle_seed = runif(n(), 0, 2*pi)) %>%
# graphique (cœur)
ggplot(aes(y=id_anc, x=année)) +
geom_spoke(aes(angle=angle_seed), radius=0.5) +
geom_spoke(aes(angle=angle_seed+2*pi*population_0_19/population), radius=0.5) +
# graphique (mise en page)
scale_y_discrete(name=NULL)+
scale_x_continuous(name=NULL, breaks=seq(1990,2020,5), minor_breaks = NULL) +
theme_minimal() +
coord_equal() +
labs(
title = "Les jeunes, fans d'art abstrait?",