- Le blog participatif de bioinformatique francophone depuis 2012 -

Cours de R pour débutant pressé, deuxième épisode

Voi­ci donc la suite de mon pre­mier cours de R pour débu­tants pres­sés où nous avions vu les bases. Je vous invite à le lire si vous ne l’avez pas déjà fait.

Aujourd’hui le but est de s’approcher de la bio­lo­gie et de trai­ter d’un cas concret. Nous avons des don­nées de dif­fé­rents élé­ments fonc­tion­nels du génome de D. mela­no­gas­ter et leurs pro­por­tions de conser­va­tion et de contrainte évo­lu­tive. Nous sou­hai­tons repré­sen­ter la pro­por­tion dans laquelle chaque élé­ment est contraint ou pas. Pour cela, nous allons faire un gra­phique en barre ou bar­plot, avec barres d'erreurs. Ce que nous allons voir aujourd'hui peut très bien s'appliquer à d'autres types de don­nées : repré­sen­ter la quan­ti­té de gènes suite à une qPCR ou encore le nombre de fois qu'une sou­ris a choi­si le bon che­min dans le laby­rinthe sui­vant chaque condi­tion choi­sie. L'important n'est donc pas ici le fond, mais bien la forme.

À la fin de ce tuto­riel, vous devriez être capables de faire quelque chose comme ça :

R et les éditeurs de texte

Nous allons tout d'abord ouvrir R et un docu­ment (édi­teur de texte inté­gré à R), qui va vous ser­vir à sau­ve­gar­der le code de votre gra­phique, la console R n'étant pas for­cé­ment la plus pra­tique.

La console R :

Pour ouvrir un docu­ment, cli­quez sur "Fichier/​Nouveau Docu­ment" ou ctrl+N sur Win­dows et GNU/​Linux, cmd+N sur mac. Une bonne habi­tude à prendre est d'écrire son code dans un édi­teur de texte, nous per­met­tant de l'éditer, de le sau­ve­gar­der, d'y reve­nir, sans à chaque fois avoir à remon­ter toutes les lignes. Je vous deman­de­rai donc de suivre ce conseil. Sur­tout que si vous ne le faites pas, vous serez embê­tés plus bas sur cette page !

Je vou­drais que vous notiez avant de com­men­cer que j'utiliserai la nota­tion amé­ri­caine du sépa­ra­teur des déci­males, donc le point et non la vir­gule.

Chargement du tableau de données

Nous allons com­men­cer par créer une variable qui va conte­nir les don­nées. Pour cela, nous allons char­ger dans R un tableau que je vous ai pré­pa­ré : Table.txt

Nous voyons ici plu­sieurs choses :

  • com­ment lire un tableau ("read.table") ;
  • com­ment sau­ver ces don­nées dans une variable ("results =") ;
  • com­ment dire à "read.table" que le tableau qu'on lui donne a ce qu'on appelle un hea­der (un entête), c'est-à-dire que les colonnes ont un nom (la pre­mière ligne du fichier est com­po­sée des noms des colonnes).

[important]Quand on uti­lise la fonc­tion "read.table", R s'attend à ce que le fichier qu'on lui donne ait les colonnes sépa­rées par un espace ; il est pos­sible de lui spé­ci­fier un autre sépa­ra­teur avec l'argument "sep".[/important]

Enfin, "attach" sert à atta­cher les don­nées conte­nues dans "results", dans le but de pou­voir appe­ler direc­te­ment les colonnes de Table.txt, sim­ple­ment en les nom­mant.

[notice]Essayez par exemple de taper "Conser­ved", il vous répon­dra les valeurs conte­nues dans la colonne "Conserved"[/notice]

1er barplot : La partie haute

Main­te­nant que nos valeurs sont bien accro­chées, des­si­nons ! "bar­plot" est une fonc­tion qui per­met de faire… rou­le­ment de tam­bours… un bar­plot ! Soit en bon fran­çais, un gra­phique en barres. C'est exac­te­ment ce qui nous inté­resse ici. Com­men­çons donc par la ligne sui­vante :

Ici, nous allons donc repré­sen­ter les don­nées de la colonne "Conser­ved" :

  • en défi­nis­sant les limites sur l'axe y (ylim) entre ‑1 et 1 ("c(-1,1)") ;
  • en défi­nis­sant un titre prin­ci­pal ("main") ;
  • en colo­rant les barres ("col") en jaune ;
  • le tout sans des­si­ner d'axes (axes = F) ;

Nous repré­sen­tons ain­si la par­tie haute de notre pre­mier graphe :

2ème barplot : La partie basse

Pour faire la par­tie basse, c'est aus­si simple, il suf­fit de taper ceci :

Si vous avez bien sui­vi, vous devez avoir :

  • la par­tie du bas ("-Uncon­ser­ved") ;
  • dans les mêmes limites ;
  • avec une cou­leur plus sombre ("yellow4") ;
  • tou­jours sans les axes

[notice]Vous devez vous deman­der ce que c'est que ce "add=T". Eh bien, c'est un para­mètre très utile que l'on peut trou­ver dans beau­coup de fonc­tions, qui per­met très sim­ple­ment d'ajouter ("add") un nou­veau gra­phique à un pre­mier, sans l'effacer ! C'est l'équivalent de la fonc­tion points ou lines pour la fonc­tion plot (je vous invite à taper "?lines", "?points" ou "?plot" si vous vous posez des ques­tions). Cet "add" pré­sente l'avantage de ne pas avoir à apprendre ou rete­nir le nom d'une autre fonc­tion pour faire la même chose ![/​notice]

Bon, trêve de bavar­dages, la suite !

Les axes

La fonc­tion axis per­met de des­si­ner un axe, que l'on n'avait pas des­si­né avec bar­plot. Pour­quoi faire ceci ? Essayez les lignes pré­cé­dentes en met­tant "axes = T", vous ver­rez que bar­plot vous des­sine un axe y dont les valeurs vont de ‑1 à 1. L'intérêt étant ici non pas d'avoir un axe de ‑1 à 1, mais de 1 à 0, et de 0 à 1, car on repré­sente 2 élé­ments qui sont inverses, en valeur abso­lue.

Le 2 est l'axe que l'on veut des­si­ner, en rete­nant le code sui­vant : 1 = bas, 2 = gauche, 3 = haut et 4 = droite.

[notice]Je vous invite à vous amu­ser un peu avec ces axes.[/notice]

"Label" est la liste de noms que l'on veut don­ner aux points affi­chés sur l'axe (une liste se défi­nit en met­tant des élé­ments sépa­rés par une vir­gule dans "c()"), et "at" est la liste des posi­tions res­pec­tives de ces points.

Fai­sons de même pour l'axe des x, que l'on veut voir por­ter le nom des "Fea­tures" de Table.txt, mais de façon plus lisible :

  • pour cela, on n'utilise pas direc­te­ment Fea­tures, mais on redonne une liste (vous vous sou­ve­nez de "c()") ;
  • on aurait aus­si très bien pu défi­nir d'abord le nom des Fea­tures et l'utiliser ;
  • ensuite, on indique les posi­tions de ces noms (tapez "0.7+1.2*(0:14)" dans R pour com­prendre). Vous pou­vez trou­ver les posi­tions empi­ri­que­ment en tâton­nant, mais sachez qu'en toute logique, il y a un espace avant les barres (ici le 0.7), puis que les barres sont éga­le­ment espa­cées (de 1.2), et qu'il y a 15 barres (on compte de 0 à 14 car la pre­mière est en posi­tion 0.7).
  • enfin, "pos" déter­mine la posi­tion ver­ti­cale de l'axe, que l'on veut ici en des­sous du gra­phique du bas, donc pla­cé à un peu plus de ‑1, par exemple ‑1.1.

Les barres d'erreurs

Pla­çons main­te­nant les barres d'erreur, qui servent en géné­ral à repré­sen­ter l'écart type, qui est en termes simples une indi­ca­tion de la dis­per­sion des résul­tats. Vous pou­vez cepen­dant repré­sen­ter ce que vous vou­lez, Variance ou autres. La fonc­tion qui nous inté­resse est "err­bar", elle est conte­nue dans le package "Hmisc", qu'il vous fau­dra ins­tal­ler ("install.packages()") et appe­ler ("require()" ou "libra­ry()") :

Nous don­nons donc à err­bar :

  • en pre­mier la posi­tion sur l'axe x où nous vou­lons nos barres d'erreurs ;
  • ensuite les posi­tions, qui sont les mêmes que celle des noms sur l'axe x ;
  • puis la posi­tion du milieu de la barre ("Mean"), la posi­tion haute de la barre d'erreur ("yplus"), la posi­tion basse ("ymi­nus") ;
  • enfin on l'ajoute au gra­phique pré­cé­dent ("add=T") ;
  • et on uti­lise "pch" qui est le sym­bole uti­li­sé pour le milieu de la barre (nous n'en vou­lons pas, donc on le met égal à un ensemble vide).

[error]Vous devez avoir un erreur qui appa­raît quand vous tapez le code de la pre­mière barre d'erreur :

Pour com­prendre cette erreur, c'est très simple. Tapez dans votre console R :

Il vous ren­voie :

UseMethod("Mean")

<envi­ron­ment : namespace:Hmisc>

Et pas la suite de moyennes atten­du. Ceci est dû au fait que "Mean" est, en plus d'être notre liste de moyennes, une fonc­tion interne à R et déjà uti­li­sée. Donc R, quand on appelle "Mean", va ten­ter d'utiliser la fonc­tion. Or on ne peut pas repré­sen­ter gra­phi­que­ment une fonc­tion sans lui don­ner de don­nées : on crée donc une erreur. Cette erreur nous per­met de voir com­ment pré­ci­ser que ce que l'on veut repré­sen­ter appar­tient à un ensemble plus grand. Par exemple ici, notre ensemble est "results" duquel on veut repré­sen­ter "Mean". Il fau­dra donc mettre dans notre com­mande non pas "Mean" mais "results$Mean", qui est en quelques sortes le che­min interne de notre liste.[/error]

[notice]Je vous invite à jouer avec "pch" en lui don­nant des valeurs numé­riques, mais aus­si des sym­boles ou des lettres ; pch = "+" est très utilisé.[/notice]

Les derniers détails

Ajou­tons main­te­nant une ligne droite pour déli­mi­ter l'espace des deux gra­phiques, avec la fonc­tion "abline" (qui signi­fie ligne entre le point A et le point B). Nous vou­lons qu'elle soit hori­zon­tale, au point 0 de l'axe des y et qu'elle ait une épais­seur ("lwd = line width", épais­seur de ligne) de 2. Enfin, ajou­tons un peu de texte, avec la fonc­tion "mtext" :

On veut donc ajou­ter 3 mots, "Frac­tion", "Conser­ved" et "Uncon­ser­ved", du côté gauche (2) du gra­phique :

  • "adj" sert à pla­cer le texte paral­lè­le­ment à l'axe auquel le texte se rap­porte, donc ici en hau­teur
  • "padj" place per­pen­di­cu­lai­re­ment à l'axe (d'où le p)

[important]Cette fois, cepen­dant, on se place par rap­port à l'extérieur du gra­phique et non plus par rap­port aux valeurs de l'axe, car "mtext" place dans la marge (d'où le m). Alors là, vous allez me dire "Ouais mais moi ça sort de par­tout et ce n'est pas joli !"… et vous aurez rai­son. En effet, en écri­vant des choses dans la marge, d'autant plus avec des valeurs inverses, sans avoir au préa­lable défi­ni ces marges est dan­ge­reux, et vous fera bien sou­vent vous plan­ter. [/​important]

Nous défi­ni­rons les marges ain­si :

Ici, "oma" veut dire "outer mar­gin", "mar" veut dire "mar­gin", et les valeurs sont don­nées tou­jours dans le même sens "bas, gauche, haut, droite". Main­te­nant, reta­pez votre code com­plet, ce qui devrait être facile si vous avez, au fur et à mesure de l'article, copié votre code dans votre édi­teur de texte :

C'est‑y pas beau tout ça ? Com­ment ? Vous vou­lez mettre ça dans un fichier .png ? Vous êtes bien exi­geants… bon, eh bien c'est très simple, il suf­fit de taper ceci avant le graphe (per­son­nel­le­ment, je le fais tout en haut) :

[important]Pour les valeurs de hau­teur ("height") et lar­geur ("width"), par défaut elles sont don­nées en pixels que je trouve être une bonne uni­té pour se rendre compte de la qua­li­té et de la lisi­bi­li­té d'un gra­phique. Mais vous pou­vez bien sur choi­sir d'autres uni­tés. Enfin, la taille des points du texte est à faire varier en fonc­tion des gouts, en véri­fiant bien à chaque chan­ge­ment la posi­tion des divers élé­ments texte, et en sachant qu'elle est cal­cu­lée en fonc­tion de la réso­lu­tion de l'image ("?png" pour plus d'informations).[/important]

Alors, ça fonc­tionne ? Non ? Le fichier est vide ? Ah oui, il faut le fer­mer, sinon R est tou­jours entrain d'écrire dedans. Pour cela, on tape :

R doit alors vous indi­quer qu'il est reve­nu dans le cadre de des­sin pré­cé­dent (quartz, x11 ou autres).

Enfin, vu qu'on a atta­ché "results" au début et qu'on veut prendre de bonnes habi­tudes, il faut déta­cher "results" :

Si vous arri­vez au même résul­tat, bra­vo ! Il ne vous reste plus qu'à vous atta­quer à la der­nière tâche ! Sinon, n'hésitez pas à poser des ques­tions, je me ferai un plai­sir d'y répondre !

À vous de jouer !

Votre défi, si vous l'acceptez, sera alors de faire comme sur la figure en haut de l'article, mettre 2 gra­phiques dans la même image, du texte en plus, et la tour­ner dans le bon sens. Pour cela 2 indices :

  • "mfrow" est un para­mètre très utile de "par " ;
  • par­fois, il vaut mieux se faci­li­ter la vie et faire des choses simples avec un outil simple. Une rota­tion par exemple.

Le pre­mier qui réus­sit aura gagné tout mon res­pect !

Allez, à la pro­chaine pour des choses encore plus folles !


Je tiens à remer­cier tous mes relec­teurs, Haut­bit, nal­lias, Guillaume Col­let, Mali­cia, Yoann M. et nahoy !

Vous avez aimé ? Dites-le nous !

Moyenne : 0 /​ 5. Nb de votes : 0

Pas encore de vote pour cet article.

Partagez cet article :




Commentaires

6 réponses à “Cours de R pour débutant pressé, deuxième épisode”

  1. Vous êtes vrai­ment supers!!!! je suis sur qu'avec vous je serai un bio­in­for­ma­ti­cien avant d'avoir eu la licence ! Je par­le­rai de vous sur mon blog!!!!!!!!!!

    Mer­ci!!!!!!!!!!!

  2. Mer­ci à toi Nas­ser, ça me fait plai­sir de faire plai­sir ! Et mer­ci de par­ler de nous sur ton blog !

  3. Tous le plai­sir est pour moi !

  4. Super article 🙂

    Si vous aviez pu être à la place de mon prof il y a 8 ans, j'aimerai p‑e R au lieu de détes­ter ce lan­gage XD

  5. plus de tuto­rial depuis ?
    je suis bio­lo­giste et j'essai dans mes temps mort de me for­mé a R d'autre conseil ?
    site ?

    1. Bon­jour raf,

      mer­ci pour ton com­men­taire. Si tout va pour le mieux, le troi­sième épi­sode devrait arri­ver avant la fin de l'année. L'auteur habi­tuel a eu un très gros plan­ning ces der­niers mois 🙂
      Quant aux dif­fé­rents sites éven­tuels où tu pour­rais trou­ver des infor­ma­tions, je lui laisse le soin de te répondre mieux que moi je ne le ferai puisque je ne mani­pule pas ce "lan­gage" 🙂

Laisser un commentaire