Cours CMI / M1 Données - séance 3
Résumé de la séance 3
L'affichage et la visualisation de données issues de mapping se font plus facilement avec des outils adaptés, comme par exemple le logiciel R avec ses nombreux packages et fonctions.
1. Le logiciel R
Il est possible, non pas de présenter le logiciel R mais de donner un aperçu de ce qu'il est en quelques minutes. Pour preuve, notre courte page R15 .
En ce qui concerne les possibilités graphiques de R, une fois notre page réalisation de graphiques élémentaires en R parcourue, issue de notre cours introduction non élémentaire à R, feuilleter le site R graph gallery devrait être suffisant.
On retiendra notamment les fonctions de tracé élémentaires nommées plot, barplot, hist, et les compléments indispensables nommés title, legend, points, abline.
2. Affichages et calculs sur vecteurs et matrices en R
On pourra se contenter de lire la page introduction à R séance 1 pour avoir une idée des structures de données et des possibilités de calcul et de formatage en R.
3. Visualisation de matrices issues de mapping en R
Notre cours numéro 5 à l'école doctorale, session Biostatistiques avancées contient sans doute ce qu'il faut comme information sur ces visualisations alors que la partie 4 de notre cours BioInformatique pour le Master BTV contient, en plus des visualisations des calculs adaptés aux puces à ADN.
4. Questions/réponses pour tester vos connaissances
Question 4.1
On se sert ici du rapport BGI fourni par Madame LANDES. Voici le code R pour générer les données de la page 4 :
reads <- c( 112820 , 174694, 2424006, 47928168 )Calculer les pourcentages correspondants et afficher ces pourcentages avec divers graphiques en R.
Reproduire aussi la figure 22 page 19 dont les données sont ci-dessous :
up <- c( 389 , 637 , 1136 ) down <- c( 999 , 281 , 205 )Question 4.2
Quelle fonction de R permet de tracer un graphique comme la figure 5 page 8 ?
Question 4.3
Quelle(s) fonction(s) de R permettent de tracer des graphiques comme pour les figures 12 et 13 page 14 ?
Question 4.4
Est-il facile selon vous de produire en R des sorties factorielles comme la figure 14 page 15 ? Et pour les boxplots de la figure 15 page 15 ?
Question 4.5
On voudrait réaliser un script Bash nommé boxplot.sh qui produit, pour un fichier texte donné, le boxplot de la colonne 2 en fonction des modalités de la colonne 3, la colonne 1 étant un identificateur. Voici des exemples d'appel (via un alias) et les graphiques à produire. Les fichiers de données sont accessibles par wget.
$gh> boxplot lea.dar $gh> boxplot elfgh.txt
Solutions : afficher les solutions
Réponse à la question 4.1
On utilise les fonctions barplot et pie.
############################################################ # # # PAGE 4 # # # ############################################################ # lecture des données (vecteur reads) source("http://forge.info.univ-angers.fr/~gh/Cmi/dataPage4.r") # soit : reads <- c( 112820 , 174694, 2424006, 47928168 ) # pourcentages pcts <- 100*reads/sum(reads) # pourcentages arrondis (mais en a-t-on vraiment besoin pour les graphiques ?) pcts <- round( pcts, 2) # mise en forme dans un data.frame noms <- c("N","Adapter","Low qual","Clean reads") rdf <- data.frame(noms,reads,pcts=paste(pcts,"%")) # affichage print(rdf) # tracés names(pcts) <- noms couleurs <- c("orange","yellow","green","lightblue") barplot( pcts , main="Raw data filter composition chart (1)") barplot( pcts , main="Raw data filter composition chart (2)",col=couleurs) pie( pcts , main="Raw data filter composition chart (3)",col=couleurs) legend( "topright",legend=noms, fill=couleurs )
############################################################ # # # PAGE 19 # # # ############################################################ # lecture des données (vecteurs up et down) source("dataPage19.r") # up <- c( 389 , 637 , 1136 ) ; down <- c( 999 , 281 , 205 ) # création de la matrice des comptages ud <- as.matrix(rbind(up,down)) colnames(ud) <- c("CT-VS-DK","CT-VS-DU","DK-VS-DU") # tracé des barres g <- barplot ( ud , col=c("red","blue"), beside=TRUE, main="Summary of DEGs",legend=c("Up","Down"), ylim=c(0,1400) ) # fin de barplot # ajout des valeurs decaley <- 100 for (icol in (1:ncol(ud))) { ydeb <- 3*icol - 2 yfin <- ydeb + 1 text(0.5+ydeb:yfin,ud[,icol]+decaley,ud[,icol]) } # fin pour icol
Réponse à la question 4.2
Il s'agit de la fonction barplot appliquée à une matrice de comptages, comme le montre la simulation ci-dessous.
############################################################ # # # PAGE 8 # # # ############################################################ # simulation de 9 colonnes avec 6 valeurs nbopt <- 3 nbcol <- 9 nbval <- 6 nblig <- 1000 # création du data frame #dataCmi <- (matrix(NA,nrow=nblig,ncol=nbcol)) dataCmi <- data.frame(matrix(NA,nrow=nblig,ncol=nbcol)) nomscol <- c( paste("CT_",1:nbopt,sep=""), paste("DK_",1:nbopt,sep=""), paste("DU_",1:nbopt,sep="")) names(dataCmi) <- nomscol nomsG <- c("A-G","C-T","A-C","A-T","C-G","G-T") # remplissage pseudo-aléatoire des valeurs set.seed(1234) for (icol in (1:nbcol)) { dataCmi[,icol] <- rbinom(n=nblig,size=nbval-1,prob=0.6) dataCmi[,icol] <- factor(dataCmi[,icol],labels=nomsG) } # fin pour icol print(head(dataCmi)) # regroupement des comptages en pourcentages matCnt <- matrix(NA,nrow=nbval,ncol=nbcol) for (icol in (1:nbcol)) { matCnt[ , icol ] <- table( dataCmi[, icol] ) } # fin pour icol row.names(matCnt) <- nomsG colnames(matCnt) <- nomscol matCnt <- matCnt / 10 print(matCnt) coulG <- c("#660066","#0033FF","#006633","#CC0033","#33CCFF","#CCFF99") barplot( matCnt, beside=FALSE, col=coulG, main="SNP Variation Types", ylab="Percentages (%)", legend.text=nomsG ) # fin de barplot
Réponse à la question 4.3
Les graphiques de la page 13 correspondent à des représentations de calcul de corrélation et de classification ascendante automatique. Le lien sthda32 présente ce genre de représentations graphiques.
Réponse à la question 4.4
Il est assez facile de réaliser des ACP avec leurs sorties graphiques parce que R dispose en standard de fonctions comme prcomp et princomp. De plus des packages (français) comme ade4 et FactorMineR sont spécialement dédiés à ce type d'analyses, tout comme le package ggfortify qui est une extension de ggplot2pour les ACP.
Réponse à la question 4.5
Une première version du script, soit boxplot1.sh peut se contenter d'effacer l'ancienne image, de recopier le fichier passé comme paramètre en data.txt et d'exécuter un script standard nommé boxplot1.r avant de visualiser après l'exécution du script, ici avec l'utilitaire eog, l'image générée.
# boxplot1.sh : on recopie le fichier des données en data.txt, on exécute boxplot1.r et on visualise rm -rf boxplot1.png cp $1 data.txt Rscript boxplot1.r eog boxplot1.png echo vous pouvez utiliser boxplot1.png# boxplot1.r nomf <- "data.txt" data <- read.table(nomf,head=TRUE,row.names=1,encoding="latin1") nom1 <- names(data)[1] nom2 <- names(data)[2] png("boxplot1.png",width=1600,height=1200) boxplot(data[,1] ~ data[,2],main=paste("Fichier",nomf),col="yellow",xlab=nom1,ylab=nom2) dev.off()On peut reprocher à ce script de ne pas avoir d'aide, de ne pas tester si le fichier existe et de passer par un visualisateur externe d'images (eog).
Une deuxième version du script, soit boxplot2.sh peut se contenter d'appler le script boxplot2.r et laisser le script tout gérer.
# boxplot2.sh : on exécute boxplot2.r avec passage du nom de fichier Rscript boxplot2.r $1 # alias via : alias "boxplot=sh boxplot2.sh $*"## (gH) -_- boxplot2.r ; TimeStamp (unix) : 20 Février 2020 vers 15:15 # voir https://informatique-mia.inra.fr/r4ciam/node/128 # et https://swcarpentry.github.io/r-novice-inflammation/05-cmdline/ # pour la gestion des paramètres # 1. récupération des paramètres éventuels args <- commandArgs(TRUE) # 2. s'il n'y a pas de paramètre, on rappelle la syntaxe et on quitte le script if (length(args)==0) { cat("\n") cat("Erreur niveau 1 : il manque le nom du fichier.\n\n") cat("Syntaxe : Rscript boxplot2.R FICHIER_DE_DONNEES\n") ; cat("Exemple : Rscript boxplot2.R lea.dar\n\n") ; q(save="no",status=-1,runLast=FALSE) } # fin si # 3. si le fichier dont le nom est passé en paramètre n'est pas présent, on le dit et on quitte le script fichier <- args[1] if (!file.exists(fichier)) { cat("Erreur niveau 2 : fichier",fichier,"nom vu. \n") q(save="no",status=-2,runLast=FALSE) } # fin si # 4. on lit les données et on récupère le nom des colonnes à tracer data <- read.table(fichier,head=TRUE,row.names=1,encoding="latin1") nom1 <- names(data)[1] nom2 <- names(data)[2] # 5. on force le script à utiliser la fenêtre graphique X11() # pour Linux ; pour Windows : windows() ; pour Mac : quartz() # 6. on trace boxplot(data[,1] ~ data[,2],main=paste("Fichier",fichier),col="yellow",xlab=nom1,ylab=nom2) cat("Cliquer sur le graphique pour finir de visualiser") tmp <- locator(1) # 7. on produit un fichier .png correspondant au graphique png("boxplot2.png",width=1600,height=1200) boxplot(data[,1] ~ data[,2],main=paste("Fichier",fichier),col="yellow",xlab=nom1,ylab=nom2) dev.off() # autre solution pour visualiser : browseURL("boxplot2.png") # 8. on affiche un message de fin cat("\nVous pouvez utiliser boxplot2.png\n")Il serait posible d'améliorer ce script, par exemple en produisant un nom de graphique lié à celui des données, comme lea.dar.png pour lea.dar, elfgh.txt.png pour elfgh.txt. On pourrait aussi tester si la colonne 2 est bien numérique... Nous vous laissons le soin d'écrire cela...
Cliquer ici pour revenir à la page de départ des cours CMI / M1.
Retour à la page principale de (gH)