Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

98-techniques_avancees.Rmd 6.7KB

5 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. ---
  2. title: "ggplot2 avancé"
  3. author: "Antoine Neuraz"
  4. date: "6/5/2019"
  5. output: html_document
  6. ---
  7. # `ggplot2` : techniques avancées
  8. ```{r, include=FALSE}
  9. knitr::opts_chunk$set(echo = TRUE,
  10. fig.pos = "center")
  11. library(tidyverse)
  12. library(ggplot2)
  13. library(see)
  14. library(patchwork)
  15. source('R/util_functions.R')
  16. ```
  17. ## Créer son propre thème `ggplot2`
  18. Les thèmes de `ggplot2` permettent de contrôler l'apparence des plots. Il est possible de modifier un thème standard en utilisant la fonction `theme()`. Mais nous allons voir ici comment créer un thème personalisé.
  19. Il est bien entendu possible de créer un thème de toutes pièces. Pour cela, il faut définir un à un tous les éléments possibles du thème mais c'est très long et rébarbatif. Dans `ggplot2`, le seul thème défini de cette façon est le thème de base `theme_grey()` (voir le [repo officiel](https://github.com/tidyverse/ggplot2/blob/master/R/theme-defaults.r)).
  20. Les autres thèmes héritent les attribut de ce premier thème et modifient uniquement éléments nécéssaires. Par exemple, `theme_bw()` est construit à partir de `theme_grey()` et `theme_minimal()` se base sur `theme_bw()`. C'est beaucoup plus pratique de définir les thèmes de cette façon.
  21. ### un thème est une fonction
  22. Un thème est une fonction R classique qui prend comme arguments 4 variables :
  23. - base_size : taille de base du texte (défaut = 11)
  24. - base_family : famille de polices de base (défaut = "")
  25. - base_line_size : taille de base des éléments `line` (défaut = base_size / 22 )
  26. - base_rect_size : taille de base des éléments `rect` (défault = base_size / 22 )
  27. ```{r, eval = FALSE}
  28. my_theme <- function(base_size = 11,
  29. base_family = "",
  30. base_line_size = base_size / 22,
  31. base_rect_size = base_size / 22) {}
  32. ```
  33. ### modifier un thème de base avec `%+replace%`
  34. Ensuite, nous allons choisir un thème de base duquel notre thème personalisé va hériter les éléments par défaut. En effet, tous les éléments que nous ne spécifieront pas seront basés sur le thème de base. Par exemple, nous pouvons choisir `theme_minimal()`.
  35. Pour modifier les éléments du thème de base, il faut utiliser l'opérateur `%+replace%` suivi de la fonction `theme()`. C'est dans cette dernière que nous pourrons spécifier les différents éléments à modifier par rapport au thème de base.
  36. ```{r, eval = FALSE}
  37. my_theme <- function(base_size = 11,
  38. base_family = "",
  39. base_line_size = base_size / 22,
  40. base_rect_size = base_size / 22) {
  41. theme_minimal(base_size = base_size,
  42. base_family = base_family,
  43. base_line_size = base_line_size,
  44. base_rect_size = base_rect_size) %+replace%
  45. theme(
  46. # éléments à modifier
  47. )
  48. }
  49. ```
  50. ### définir de nouveaux attributs
  51. Nous pouvons a présent inserer dans la fonction thème les éléments à modifier. Notez qu'il ne faut pas utiliser de tailles absolues mais définir des tailles relatives avec la fonction `rel()`.
  52. #### `my_theme()` {-}
  53. Voici un exemple de thème personnalisé (très fortement inspiré du thème `theme_modern()` du package `see`) basé sur `theme_minimal()` :
  54. ```{r, eval = TRUE}
  55. my_theme <- function(base_size = 11,
  56. base_family = "",
  57. base_line_size = base_size / 22,
  58. base_rect_size = base_size / 22) {
  59. half_line <- base_size/2
  60. theme_minimal(base_size = base_size,
  61. base_family = base_family,
  62. base_line_size = base_line_size,
  63. base_rect_size = base_rect_size) %+replace%
  64. theme(
  65. ## Panel grid ##
  66. panel.border = element_blank(),
  67. panel.grid.major = element_blank(),
  68. panel.grid.minor = element_blank(),
  69. ## Title ##
  70. plot.title = element_text(size = rel(1.3),
  71. face = "plain", margin = margin(0, 0, 20, 0)),
  72. ## Axis ##
  73. axis.line = element_line(colour = "black", size = rel(0.5)),
  74. axis.title.y = element_text(margin = margin(t = 0, r = rel(20), b = 0, l = 0),
  75. angle = 90),
  76. axis.title.x = element_text(margin = margin(t = rel(20), r = 0, b = 0, l = 0)),
  77. axis.title = element_text(size = rel(1.2),
  78. face = "plain"),
  79. axis.text = element_text(size = rel(.8)),
  80. axis.ticks = element_blank(),
  81. ## Legend ##
  82. legend.key = element_blank(),
  83. legend.position = "bottom",
  84. legend.text = element_text(size = rel(1.1)),
  85. legend.title = element_text(size = rel(1.1)),
  86. legend.spacing.x = unit(2, "pt"),
  87. ## Background ##
  88. strip.background = element_blank(),
  89. plot.tag = element_text(size = rel(1.3), face = "bold"),
  90. strip.text = element_text(face = "bold")
  91. )
  92. }
  93. ```
  94. #### `my_theme_dark()` {-}
  95. Et un thème sombre basé sur `my_theme()` et très fortement inspiré de `theme_blackboard()` du package `see` :
  96. ```{r}
  97. my_theme_dark <-function(base_size = 11,
  98. base_family = "",
  99. base_line_size = base_size / 22,
  100. base_rect_size = base_size / 22) {
  101. dark_color = "#0d0d0d"
  102. light_color = "#E0E0E0"
  103. my_theme(base_size = base_size,
  104. base_family = base_family,
  105. base_line_size = base_line_size,
  106. base_rect_size = base_rect_size) %+replace%
  107. theme(
  108. ## Backgrounds ##
  109. plot.background = element_rect(fill = dark_color),
  110. panel.background = element_rect(fill = dark_color, color=dark_color),
  111. legend.background = element_rect(fill = dark_color, color=dark_color),
  112. ## Lines ##
  113. axis.line = element_line(color = light_color),
  114. ## Text ##
  115. text = element_text(family = base_family, face = "plain",
  116. color = light_color, size = base_size,
  117. hjust = 0.5, vjust = 0.5, angle = 0,
  118. lineheight =0.9, margin = margin(),
  119. debug = FALSE),
  120. axis.text = element_text(color = light_color)
  121. )
  122. }
  123. ```
  124. ### Exemple
  125. Créons un plot d'exemple à partir d'un jeu de données synthétique
  126. ```{r, echo=TRUE}
  127. p <- generate_uniform_dataset(
  128. dataset_size = 100,
  129. min_x = 0, max_x = 1,
  130. outliers = 2, seed = 506
  131. ) %>%
  132. ggplot(data = ., aes( x = x, y = y, color = group)) +
  133. geom_point(size = 3) +
  134. scale_color_material_d() +
  135. labs(title= "theme_minimal()",
  136. x="legende axe x",
  137. y="legende axe y")
  138. ```
  139. ```{r, echo=TRUE}
  140. p
  141. ```
  142. ```{r, echo=TRUE}
  143. p + theme_minimal()
  144. ```
  145. ```{r, echo=TRUE}
  146. p + my_theme()
  147. ```
  148. ```{r,echo=TRUE}
  149. p + my_theme_dark()
  150. ```