Dendrogramme: couleur en fonction d'une variable

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Trochet Audrey
Messages : 39
Enregistré le : 20 Aoû 2009, 13:42

Dendrogramme: couleur en fonction d'une variable

Messagepar Trochet Audrey » 12 Mar 2012, 12:55

Bonjour à tous,
Le sujet a déjà été posé, mais pas de solutions... je me permets donc de relancer la question:
Voilà, j'ai une base de données sur laquelle je fais un cluster.

Code : Tout sélectionner

db=read.table("base_de_donnees.txt",h=T)
row.names(db)=db$Species_num
dista=dist(db)
arbre1=hclust(dista,method='ward')
plot(arbre1,lwd=1,cex=.5)
rect.hclust(arbre1,8,border="red")


Jusqu'ici tout va bien, mes groupes sont bien délimités. Mais j'aimerai colorier les labels (ici des noms d'espèces) en fonction non pas du groupe dans lequel ils appartiennent (comme dans l'exemple ici: http://addictedtor.free.fr/graphiques/R ... p?graph=79) mais en fonction d'une variable catégorielle de mon jeu de données initial (qui est le groupe taxonomique)...

Quelqu'un a une idée ?? Merci beaucoup d'avance

Trochet Audrey
Messages : 39
Enregistré le : 20 Aoû 2009, 13:42

Messagepar Trochet Audrey » 12 Mar 2012, 13:40

Je suis sur une piste. J'ai 7 catégories dans mes groupes taxonomiques, il me faut donc 7 couleurs. J'ai trouvé quelques morceaux de code sur internet, mais comme je n'y connais pas grand chose, évidemment ça ne marche pas :) :

Code : Tout sélectionner

hc <- hclust(dist(db_2[,-1]), method='ward')
dend <- as.dendrogram(hc)
plot(dend)
reds=as.factor(row.names(db_2[db_2$Taxa]=="Mammals"))
blues=as.factor(row.names(db_2[db_2$Taxa]=="Birds"))
greens=as.factor(row.names(db_2[db_2$Taxa]=="Amphibians"))
pinks=as.factor(row.names(db_2[db_2$Taxa]=="Fishes"))
greys=as.factor(row.names(db_2[db_2$Taxa]=="Merostomata"))
oranges=as.factor(row.names(db_2[db_2$Taxa]=="Insects"))
purples=as.factor(row.names(db_2[db_2$Taxa]=="Reptiles"))
#define a function for coloring and sizing node elements:
colLab <- function(n)
  {
  if(is.leaf(n))
    {
    a <- attributes(n)
    if ( length(which(reds == a$label)) == 1 )
      {
      attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "red", lab.cex=.7,
col="red", pch=16 ))
      }
      else
      if ( length(which(blues == a$label)) == 2 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "blue", lab.cex=.7,
col="blue" , pch=16))
        }
     }
  n
  }
dend_colored <- dendrapply(dend, colLab)
plot(dend_colored)


Ce code me colorie tous mes labels en rouge, pas uniquement ceux de mon groupe taxonomique... HELP ??

Vincent Guillemot
Messages : 451
Enregistré le : 05 Mai 2010, 15:11

Messagepar Vincent Guillemot » 12 Mar 2012, 14:03

Bonjour,
J'ai regardé aussi dans le code source pour voir si on peut faire ce que tu demandes, mais sans succès, je vais quand même regarder ce que tu proposes.
En dépannage, j'ai une solution assez moche, mais qui a l'air de fonctionner :

Code : Tout sélectionner

set.seed(10)
x <- cbind(matrix(rnorm(100),10,10),matrix(rnorm(100,3,0.5),10,10))
# g : un facteur pas particulièrement lié à x
g <- factor(sample(c("baba","au","rhum"),10,r=T))
arbre1 <- hclust(dist(x),method='ward')
plot(arbre1,lwd=1,cex=.5)
text(1:10,2.61,g[arbre1$order],col=as.numeric(g[arbre1$order]),cex=0.9)
rect.hclust(arbre1,2,border="red")

Cela donne en bas de l'arbre les labels colorés correspondants à un facteur quelconque...
Bon courage,
V.

Trochet Audrey
Messages : 39
Enregistré le : 20 Aoû 2009, 13:42

Messagepar Trochet Audrey » 12 Mar 2012, 14:11

Bon, je viens de trouver la solution :)
Je poste le script, il devrait servir vu le nombre de poste sur le sujet !!

Code : Tout sélectionner

row.names(db_2)=db$Species_num
hc <- hclust(dist(db_2[,-1]), method='ward')
dend <- as.dendrogram(hc)
plot(dend)
reds=as.factor(row.names(db_2[db_2$Taxa=="Mammals",]))
blues=as.factor(row.names(db_2[db_2$Taxa=="Birds",]))
greens=as.factor(row.names(db_2[db_2$Taxa=="Amphibians",]))
pinks=as.factor(row.names(db_2[db_2$Taxa=="Fishes",]))
greys=as.factor(row.names(db_2[db_2$Taxa=="Merostomata",]))
oranges=as.factor(row.names(db_2[db_2$Taxa=="Insects",]))
purples=as.factor(row.names(db_2[db_2$Taxa=="Reptiles",]))
#define a function for coloring and sizing node elements:
myCol <- grep("red", colors(), value = TRUE)
colLab <- function(n)
  {
  if(is.leaf(n))
    {
    a <- attributes(n)
    if ( length(which(reds == a$label)) == 1 )
      {
      attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#FF0000FF", lab.cex=.5,
col="#FF0000FF", pch=16 ))
      }
      else
      if ( length(which(blues == a$label)) == 1 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#FFDB00FF", lab.cex=.5,
col="#FFDB00FF" , pch=16))
        }
        else
        if ( length(which(greens == a$label)) == 1 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#49FF00FF", lab.cex=.5,
col="#49FF00FF" , pch=16))
        }
        else
        if ( length(which(pinks == a$label)) == 1 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#00FF92FF", lab.cex=.5,
col="#00FF92FF" , pch=16))
        }
        else
        if ( length(which(greys == a$label)) == 1 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#0092FFFF", lab.cex=.5,
col="#0092FFFF" , pch=16))
        }
        else
        if ( length(which(oranges == a$label)) == 1 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#4900FFFF", lab.cex=.5,
col="#4900FFFF" , pch=16))
        }
        else
        if ( length(which(purples == a$label)) == 1 )
        {
        attr(n, "nodePar") <- c(a$nodePar, list(lab.col = "#FF00DBFF", lab.cex=.5,
col="#FF00DBFF" , pch=16))
      }
    }
  n
  }
dend_colored <- dendrapply(dend, colLab)
plot(dend_colored)

Vincent Guillemot
Messages : 451
Enregistré le : 05 Mai 2010, 15:11

Messagepar Vincent Guillemot » 12 Mar 2012, 16:50

Rebonjour,

Je n'ai pas eu le temps de répondre à temps, mais voici quand même une solution un peu plus générale :

Code : Tout sélectionner

set.seed(10)
# generation de données aléatoires contenant deux classes d'individu
x <- rbind(matrix(rnorm(100),10,10),matrix(rnorm(100,2),10,10))
# facteur à 4 niveaux : les niveaux a et b couvrent la classe 1 et les niveaux c et d
# la classe 2
y <- factor(rep(letters[1:4],e=5))
# calcul de l'arbre
hc <- hclust(dist(x), method='ward')
dend <- as.dendrogram(hc)

# fonction pour colorer une "feuille" de l'arbre
colLab <- function(n,fact) {
  if(is.leaf(n)) {
    a <- attributes(n)
    labcolor <- as.numeric( fact[a$label] ) + 1
    attr(n, "nodePar") <- c(a$nodePar, list(lab.col = labcolor, lab.cex=.7, col=labcolor, pch=16 ))
  }
  n
}

# application à  dend
dend_colored <- dendrapply(dend, colLab, y)

# résultat sous forme graphique
plot(dend_colored)
Après on peut l'affiner en incluant dans les variables d'entrée de colLab une variable codant les couleurs...

Bref, merci Audrey pour cette solution, cela servira à d'autres, je pense !

V.

Trochet Audrey
Messages : 39
Enregistré le : 20 Aoû 2009, 13:42

Messagepar Trochet Audrey » 13 Mar 2012, 09:50

Super Merci beaucoup !
Mon code est un peu brouillon, je pense que le tien est plus simple a comprendre.
Merci encore pour l'aide :)

Trochet Audrey
Messages : 39
Enregistré le : 20 Aoû 2009, 13:42

Messagepar Trochet Audrey » 13 Mar 2012, 09:59

Bon, c'est affreux mais voilà à quoi ça ressemble

Image

Benjamin Leduc
Messages : 158
Enregistré le : 09 Avr 2010, 08:48

Messagepar Benjamin Leduc » 23 Mar 2012, 21:33

extrait d'un script que j'ai fait cette semaine essayes:

Code : Tout sélectionner

 
 dendro<-as.phylo(arbre1,cex=0.5)
 plot(dendro,type="u",tip.color = A ,lab4ut="axial")


avec A la colonne qui corespond a numéro du groupe, que tu aura choisi pour chaque individu...
Je dois être Suicide-R

Guillaume Miquel
Messages : 1
Enregistré le : 07 Fév 2017, 15:42

Re:

Messagepar Guillaume Miquel » 07 Fév 2017, 16:16

Bonjour,

Je suis néophyte en tant qu'utilisateur de R, et j'essaie actuellement de réaliser un dendogramme sur un jeu de données composé des différentes teneurs en polluants d'une rivière en fil des années.
J'ai réussi à obtenir mon dendogramme en utilisant la fonction "hclust", mais souhaiterais maintenant que chaque individu de mon dendogramme soit colorié en fonction de sa position géographique (je la possède dans mes données également).
J'ai regardé les différents posts que vous avez pu rédiger à ce sujet, mais n'arrive pas à exploiter le code que vous avez fourni :

Vincent Guillemot a écrit :

Code : Tout sélectionner

set.seed(10)
# generation de données aléatoires contenant deux classes d'individu
x <- rbind(matrix(rnorm(100),10,10),matrix(rnorm(100,2),10,10))
# facteur à 4 niveaux : les niveaux a et b couvrent la classe 1 et les niveaux c et d
# la classe 2
y <- factor(rep(letters[1:4],e=5))
# calcul de l'arbre
hc <- hclust(dist(x), method='ward')
dend <- as.dendrogram(hc)

# fonction pour colorer une "feuille" de l'arbre
colLab <- function(n,fact) {
  if(is.leaf(n)) {
    a <- attributes(n)
    labcolor <- as.numeric( fact[a$label] ) + 1
    attr(n, "nodePar") <- c(a$nodePar, list(lab.col = labcolor, lab.cex=.7, col=labcolor, pch=16 ))
  }
  n
}

# application à  dend
dend_colored <- dendrapply(dend, colLab, y)

# résultat sous forme graphique
plot(dend_colored)



Serait-il possible de m'en expliciter les grandes lignes ?

Je vous remercie par avance,

Guillaume Miquel


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité