web-dev-qa-db-fra.com

Étiqueter et colorer le dendrogramme des feuilles

J'essaye de créer un dendrogramme, où mes échantillons ont 5 codes de groupe (agissent comme nom d'échantillon/espèce/etc. mais son répétitif).

Par conséquent, j'ai deux problèmes pour lesquels une aide sera utile:

  • Comment puis-je afficher les codes de groupe dans l'étiquette feuille (au lieu du numéro d'échantillon)?

  • Je souhaite attribuer une couleur à chaque groupe de codes et colorer l'étiquette de feuille en fonction de celui-ci (il peut arriver qu'ils ne soient pas dans le même clade et que je puisse trouver plus d'informations)?

Est-il possible de le faire avec mon script pour le faire (ape ou ggdendro):

sample<-read.table("C:/.../DOutput.txt", header=F, sep="")
groupCodes <- sample[,1]
sample2<-sample[,2:100] 
d <- dist(sample2, method = "euclidean")  
fit <- hclust(d, method="ward")
plot(as.phylo(fit), type="fan") 
ggdendrogram(fit, theme_dendro=FALSE)  

Une trame de données aléatoire pour remplacer ma table de lecture:

sample = data.frame(matrix(floor(abs(rnorm(20000)*100)),ncol=200))
groupCodes <- c(rep("A",25), rep("B",25), rep("C",25), rep("D",25)) # fixed error
sample2 <- data.frame(cbind(groupCodes), sample) 
16
lroca

Voici une solution à cette question en utilisant un nouveau package appelé " dendextend ", construit exactement pour ce genre de chose.

Vous pouvez voir de nombreux exemples dans les présentations et les vignettes du package, dans la section "utilisation" de l'URL suivante: https://github.com/talgalili/dendextend

Voici la solution à cette question: (remarquez l'importance de réorganiser les couleurs pour d'abord ajuster les données, puis pour ajuster le nouvel ordre du dendrogramme)

####################
## Getting the data:

sample = data.frame(matrix(floor(abs(rnorm(20000)*100)),ncol=200))
groupCodes <- c(rep("Cont",25), rep("Tre1",25), rep("Tre2",25), rep("Tre3",25))
rownames(sample) <- make.unique(groupCodes)

colorCodes <- c(Cont="red", Tre1="green", Tre2="blue", Tre3="yellow")

distSamples <- dist(sample)
hc <- hclust(distSamples)
dend <- as.dendrogram(hc)

####################
## installing dendextend for the first time:

install.packages('dendextend')

####################
## Solving the question:

# loading the package
library(dendextend)
# Assigning the labels of dendrogram object with new colors:
labels_colors(dend) <- colorCodes[groupCodes][order.dendrogram(dend)]
# Plotting the new dendrogram
plot(dend)


####################
## A sub tree - so we can see better what we got:
par(cex = 1)
plot(dend[[1]], horiz = TRUE)

enter image description here

17
Tal Galili

Vous pouvez convertir votre objet hclust en dendrogram et utiliser ?dendrapply pour modifier les propriétés (attributs comme la couleur, l'étiquette, ...) de chaque nœud, par exemple:

## stupid toy example
samples <- matrix(c(1, 1, 1,
                    2, 2, 2,
                    5, 5, 5,
                    6, 6, 6), byrow=TRUE, nrow=4)

## set sample IDs to A-D
rownames(samples) <- LETTERS[1:4]

## perform clustering
distSamples <- dist(samples)
hc <- hclust(distSamples)

## function to set label color
labelCol <- function(x) {
  if (is.leaf(x)) {
    ## fetch label
    label <- attr(x, "label") 
    ## set label color to red for A and B, to blue otherwise
    attr(x, "nodePar") <- list(lab.col=ifelse(label %in% c("A", "B"), "red", "blue"))
  }
  return(x)
}

## apply labelCol on all nodes of the dendrogram
d <- dendrapply(as.dendrogram(hc), labelCol)

plot(d)

enter image description here

EDIT: Ajoutez du code pour votre minimal exemple:

    sample = data.frame(matrix(floor(abs(rnorm(20000)*100)),ncol=200))
groupCodes <- c(rep("A",25), rep("B",25), rep("C",25), rep("D",25))

## make unique rownames (equal rownames are not allowed)
rownames(sample) <- make.unique(groupCodes)

colorCodes <- c(A="red", B="green", C="blue", D="yellow")


## perform clustering
distSamples <- dist(sample)
hc <- hclust(distSamples)

## function to set label color
labelCol <- function(x) {
  if (is.leaf(x)) {
    ## fetch label
    label <- attr(x, "label")
    code <- substr(label, 1, 1)
    ## use the following line to reset the label to one letter code
    # attr(x, "label") <- code
    attr(x, "nodePar") <- list(lab.col=colorCodes[code])
  }
  return(x)
}

## apply labelCol on all nodes of the dendrogram
d <- dendrapply(as.dendrogram(hc), labelCol)

plot(d)

enter image description here

9
sgibb