library(learnr)
library(parsons)
library(dplyr)
library(ggformula)
library(rio)

file.copy(from = system.file(package = "funcampR","data","chapitre6/data_soldiers.csv"),
          to = "data_soldiers.csv")

# Import and transform data within Rmd
donnees_secretes <- import("data_soldiers.csv")

donnees_secretes <- donnees_secretes %>%
  select('royaume','nb_guerriers','nb_habitants','nb_chevaux','nb_canicule','dist_royaume','situation')

donnees_secretes_df <- as.data.frame(donnees_secretes)
# relative path to import and transform data from "local random repo" of learnr exercise
donnees_secretes <- import("../../../data_soldiers.csv")

donnees_secretes <- donnees_secretes %>%
  select('royaume','nb_guerriers','nb_habitants','nb_chevaux','nb_canicule','dist_royaume','situation')

donnees_secretes_df <- as.data.frame(donnees_secretes)

Les forces armées des royaumes voisins

Le mage Essespéus a en sa possession le répertoire des forces armées des royaumes voisins. Ce répertoire, contenu dans le fichier donnees_secretes, comprend les informations suivantes :

En voici un aperçu :

head(donnees_secretes,5)
#head(donnees_secretes_df,5)
donnees_secretes_df %>% select(royaume,nb_guerriers,nb_habitants,nb_chevaux) %>% head(5)
donnees_secretes_df %>% select(royaume,nb_canicule,dist_royaume,situation) %>% head(5)

Essespéus propose à icaRius de rapporter une fausse information auprès du prétendu chef des armées de Statis, pour le tromper et diriger les forces obscures le plus loin possible - afin de gagner un peu de temps. Pour établir cette fausse information, vous allez construire une représentation graphique s'appuyant sur les données secrètes.

Reprenons notre apprentissage des sortilèges ggformula

Lors du précédent chapitre, vous avez découvert plusieurs sortilèges de la famille ggformula. Parmi ces derniers, gf_point est un sortilège permettant de représenter des nuages de points. Souvenez-vous : il faut introduire des ingrédients dans la recette du sortilège : en l'occurrence, l'ordonnée y des points en fonction de leur abcisse x. Cela se traduit en langage des Runes par : gf_point(y~x).

A partir de ces rappels, quel est le code pour faire un nuage de points à partir de la table donnees_secretes en représentant le nombre d'habitants du royaume (variable nb_habitants) en ordonnées et le nombre de guerriers (variable nb_guerriers) en abcisse ?

# Créez le graphique


# Fin de l'exercice
# Créez le graphique
donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers)
# Fin de l'exercice

Bravo, vous maîtrisez parfaitement les fondamentaux pour tracer un nuage de points ! Mais, entre nous, le résultat n'est pas très esthétique pour l'instant. Et si nous apprenions, avec le langage runique, à produire des graphiques chatoyants ?

Assez de la grisaille ? Passez à la couleur

Comment faire pour différencier sur le même graphique les royaumes selon leur situation géographique ? Une façon de procéder consiste à utiliser l'ingrédient color pour changer la couleur (qui est fixe par défaut) en fonction de la variable situation (au nord ou au sud). En reprenant la grammaire de ggformula, il faut aussi utiliser l'operateur ~. L'ingrédient color sera donc "en fonction" (~) de la variable situation.

Et voilà :

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, color = ~situation )

Des points qui changent de taille, dites-vous ?

Pour faire varier la taille des ronds d'un nuage de points en fonction de la valeur d'une variable dénommée nombre, il faut utiliser l'ingrédient size et lui donner la valeur ~ nombre : size = ~nombre. Dans l'exemple qui suit, représentons sur un nuage de points le nombre d'habitants des royaumes selon le nombre de guerriers et faisons varier la taille des ronds proportionnellement au nombre de chevaux de chaque royaume. L'ensemble des informations se trouve dans le fichier donnees_secretes.

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, 
           title = "Les royaumes, selon le nombre d'habitants, de guerriers et de chevaux", 
           size = ~ nb_chevaux)

Des points qui ne sont plus des points ?

Au risque de rendre le graphique plus difficile à lire, la forme des points peut également être modifiée en attribuant une valeur à l'ingrédient shape (forme, en anglais). Par exemple, en lui affectant une valeur numérique fixe, qui va être "interprêtée" dans le langage des runes comme une forme :

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, 
           title = "Les royaumes, selon le nombre d'habitants, de guerriers et de chevaux", 
           size = ~ nb_chevaux,
           shape = 5)

La forme peut aussi varier selon les modalités d'une variable. Pour cela, le sortilège doit comprendre comme ingrédient la relation shape = ~ variable. Dans notre cas, la forme dépendra de la position des royaumes (au nord, au sud) par rapport à Statis.

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, 
           title = "Les royaumes, selon le nombre d'habitants, de guerriers et de chevaux, ainsi que leur situation", 
           size = ~ nb_chevaux,
           shape = ~situation)

Zut, le titre du graphique, devenu trop long, est tronqué ! Une astuce dans le langage des runes : glisser l'expression \n dans une chaîne de caractère permet d'indiquer un retour à la ligne. Nous allons donc indiquer un retour à la ligne dans le texte indiqué pour l'ingrédient title :

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, 
           title = "Les royaumes, selon le nombre d'habitants, de guerriers et de chevaux, \n ainsi que leur situation", 
           size = ~ nb_chevaux,
           shape = ~situation)

Des points qui ont des petits noms

Il est également possible de faire figurer des noms associés à chaque point représenté. Dans notre exemple, nous allons attribuer à chaque point le nom du royaume correspondant. Pour cela, il faut combiner le sortilège gf_point avec un autre sortilège : gf_text. Pour combiner les sortilèges, le pipe %>% sera de nouveau utilisé, avec une rédaction du type suivant :

# combinaison de sortilèges ggformula avec le %>%
les_donnees %>%
    gf_point(des_ingredients) %>%
    gf_text(des_ingredrients)

Le sortilège gf_text a lui aussi besoin d'ingrédients. Nous nous limiterons pour lors au label qui permet d'indiquer le nom de la variable à faire figurer (ici la variable royaume), puis color et size pour la couleur et la taille de la police. Nous ajouterons toutefois un peu de glutamate avec l'ingrédient check_overlap qui permet de s'assurer que les textes affichés ne se superposent pas, si sa valeur est définie à "TRUE". Attention à ne pas oublier le symbole ~ dans l'utilisation de l'ingrédient label.

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, 
           title = "Les royaumes, selon le nombre d'habitants, de guerriers et de chevaux", 
           size = ~ nb_chevaux,
           shape = 5) %>%
  gf_text(label = ~ royaume, 
          color='black', 
          size=2.5,
          check_overlap=TRUE)

Un graphique sur mesure

Mince : l'un des libellés, celui correspondant au royaume avec le plus de soldats, le plus à droite sur le graphique, se trouve tronqué. Plusieurs méthodes permettent de résoudre ce problème : ici, nous allons apprendre à modifier l'échelle de l'axe des abscisses, pour qu'il couvre des valeurs plus élevées et permette de mieux afficher ce royaume.

Dans la famille ggformula, le sortilège gf_refine() propose d'adapter le graphique - le fignoler, pour ainsi dire. Il peut notamment comprendre des ingrédients relatifs aux axes des abscisses et des ordonnées. Ici, nous cherchons à modifier l'échelle de l'axe des abscisses, en anglais scale_x. Comme la variable représentée est une variable numérique et continue, nous utiliserons l'ingrédient scale_x_continuous, en lui précisant les valeurs minimales (ici, 0) et maximales (ici, 60 000) que nous souhaitons retenir pour le graphique. La rédaction de cet ingrédient pourra vous sembler encore mystèrieuse - elle s'éclaircira dans la suite de votre apprentissage, et prend la forme suivante : scale_x_continuous(limits = c(0, 60000)).

Comme vu précédemment, pour combiner des sortilèges, n'oublions pas d'utiliser le pipe %>% !

donnees_secretes %>%
  gf_point(nb_habitants ~ nb_guerriers, 
           title = "Les royaumes, selon le nombre d'habitants, de guerriers et de chevaux", 
           size = ~ nb_chevaux,
           shape = 5) %>%
  gf_text(label = ~ royaume, 
          color='black', 
          size=2.5,
          check_overlap=TRUE) %>%
  gf_refine(scale_x_continuous(limits = c(0, 60000)))

Vous voici armé(e) de toute la puissance des sortilèges ggformula !

À vous de jouer

Pour contrer les velléités du vil Parlyus, Icarius doit identifier un royaume le plus difficile à conquérir, selon trois critères :

Pour identifier ce royaume, icaRius va s'appuyer sur un graphique permettant de représenter en abcisse la distance de chaque royaume au territoire de Statis, en ordonnée le nombre de jours de canicule dans ces royaumes. Dans ce graphique, la taille des points variera selon le nombre de guerriers. L'ensemble des informations nécessaires se trouve dans le fichier donnees_secretes fourni par Essespéus.

À partir de ce fichier et des exemples présentés précédemment, aidez Icarius à identifier le royaume le plus difficile à conquérir, royaume qu'il présentera à Parlyus sous forme de "fake news" comme étant, au contraire, le plus simple à envahir !

Quelques indices :

# Créez un graphique en utilisant gf_point et gf_text 
# (voire gf_refine pour améliorer la lisibilité)





# Fin de l'exercice
# Créez un graphique en utilisant gf_point et gf_text 
# (voire gf_refine pour améliorer la lisibilité)

donnees_secretes %>% 
  gf_point(nb_canicule ~ dist_royaume,
           size = ~ nb_guerriers,
           shape = 5) %>% 
  gf_text(label = ~ royaume,
          size = 2.5,
          check_overlap = TRUE) %>%
  gf_refine(scale_x_continuous(limits = c(0, 50)))

# Fin de l'exercice
question("Alors, quel royaume faut-il attaquer? Il ne reste plus qu'à cocher la bonne réponse...pour poursuivre l'aventure!",
type="single",
allow_retry = TRUE,
incorrect="Retente ta chance",
answer("Le pays du soleil éternel   "),
answer("La terre d’Or"),
answer("Le territoire des Hauts",correct=TRUE),
answer("La bonne réponse n'est pas dans les propositions"),
correct="Félicitations, vous avez trouvé le bon royaume. Rentrez le code 59 dans le jeu icaRius pour continuer l'aventure!"
)

Fin du chapitre 6 >> reprenez la partie d'Icarius

Version 0.9.3



InseeFrLab/funcamp-r-grimoire documentation built on Oct. 30, 2023, 3:25 p.m.