Dendrogtwig de hoja de color y etiqueta

Intento crear un dendrogtwig, mis muestras tienen 5 códigos de grupo (actúan como nombre de muestra / especie / etc. pero es repetitivo).

Por lo tanto, tengo dos problemas que me ayudarán mucho:

  • ¿Cómo puedo mostrar los códigos de grupo en la etiqueta de la hoja (en lugar del número de muestra)?

  • Deseo asignar un color a cada grupo de códigos y coloreé la etiqueta de la hoja de acuerdo con eso (¿podría suceder que no estén en el mismo clado y con eso puedo encontrar más información)?

¿Es posible hacerlo con mi script para hacerlo? (Simio o 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) 

Un dataframe aleatorio para reemplazar mi read.table:

 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) 

Aquí hay una solución para esta pregunta usando un nuevo paquete llamado ” dendextend “, construido exactamente para este tipo de cosas.

Puede ver muchos ejemplos en las presentaciones y viñetas del paquete, en la sección “uso” en la siguiente URL: https://github.com/talgalili/dendextend

Aquí está la solución para esta pregunta: (observe la importancia de cómo reordenar los colores para que se ajusten primero a los datos, y luego para que se ajusten al nuevo orden del dendogtwig)

 #################### ## 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

Puede convertir su objeto hclust en un dendrogram y usar ?denrapply para modificar las propiedades (atributos como color, etiqueta, …) de cada nodo, por ejemplo:

 ## 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 AD 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

EDITAR: agregue código para su ejemplo mínimo :

  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