2017-05-28 3 views
2

Je suis en train de construire un dendrogramme et j'utilise 'dendextend' pour modifier son apparence. J'ai pu faire tout ce que je voulais (marquer les feuilles et mettre en évidence les branches de mes clusters choisis), sauf dessiner des rectangles autour de clusters prédéfinis. Mes données (provenant de ce fichier: Barra_IBS_example.matrix) ont été regroupées avec 'pvclust', donc 'pvrect' dessine les rects dans la bonne position, mais il coupe les étiquettes (voir l'image ci-dessous), donc je veux pour le reproduire avec 'rect.dendrogram', cependant, je ne peux pas comprendre comment dire à la fonction d'utiliser les données de clustering de 'pvclust'.Dessin de rectangles autour d'étiquettes spécifiées dans un dendrogramme avec 'dendextend'

dendrogram with pvrect

Ce code J'utilise:

idnames <- dimnames(ibs_mat)[[1]] 
ibs.pv <- pvclust(ibs_mat, nboot=1000) 
ibs.clust <- pvpick(ibs.pv, alpha=0.95) 
names(ibs.clust$clusters) <- paste0("Cluster", 1:length(ibs.clust$clusters)) 
# Choose a colour palette 
pal <- brewer.pal(length(ibs.clust$clusters), "Paired") 
# Transform the list to a dataframe 
ibs_meta <- bind_rows(lapply(names(ibs.clust$clusters), 
     function(l) data.frame(Cluster=l, Sample = ibs.clust$clusters[[l]]))) 
# Add the rest of the non-clustered samples (and assign them as Cluster0), add colour to each cluster 
ibs_table <- ibs_meta %>% 
    rbind(., data.frame(Cluster = "Cluster0", 
         Sample = idnames[!idnames %in% .$Sample])) %>% 
    mutate(Cluster_int=as.numeric(sub("Cluster", "", Cluster))) %>% 
    mutate(Cluster_col=ifelse(Cluster_int==0, "#000000", 
       pal[Cluster_int])) %>% 
    .[match(ibs.pv$hclust$labels[ibs.pv$hclust$order], .$Sample),] 
hcd <- as.dendrogram(ibs.pv) %>% 
    #pvclust_show_signif(ibs.pv, show_type = "lwd", signif_value = c(2, 1),alpha=0.25) %>% 
    set("leaves_pch", ifelse(ibs_table$Cluster_int>0,19,18)) %>% # node point type 
    set("leaves_cex", 1) %>% # node point size 
    set("leaves_col", ibs_table$Cluster_col) %>% #node point color 
    branches_attr_by_labels(ibs_meta$Sample, TF_values = c(2, Inf), attr = c("lwd")) %>% # change branch width 
    # rect.dendrogram(k=12, cluster = ibs_table$Cluster_int, border = 8, lty = 5, lwd = 1.5, 
    #     lower_rect = 0) %>% # add rectangles around clusters 
    plot(main="Barramundi samples IBS based clustering") 
pvrect(ibs.pv, alpha=0.95, lwd=1.5) 

Un grand merci, Ido

+0

S'il vous plaît fournir des données reproductibles minimum que nous pouvons exécuter votre code sur, par exemple coller la sortie de 'dput (ibs_mat)' ou un sous-ensemble – Djork

+0

@ R.S. Un exemple de fichier créé par 'dput (ibs_mat)' a été ajouté dans la question. – IsoBar

+1

D'où vient la fonction 'idnames', veuillez effacer votre espace de travail et relancer votre code pour vous assurer que tout est inclus dans le code ci-dessus, inclure toutes les bibliothèques qui doivent être installées. – Djork

Répondre

2

ok, cela a pris plus de travail que je l'avais espéré, mais je me suis une solution pour toi.

J'ai créé une nouvelle fonction appelée pvrect2 et je viens de la pousser vers la dernière version de dendextend sur github. Voici un exemple autonome démontrant la solution:

devtools::install_github('talgalili/dendextend') 

library(pvclust) 
library(dendextend) 
data(lung) # 916 genes for 73 subjects 
set.seed(13134) 
result <- pvclust(lung[, 1:20], method.dist="cor", method.hclust="average", nboot=10) 

par(mar = c(9,2.5,2,0)) 
dend <- as.dendrogram(result) 
dend %>%  
    pvclust_show_signif(result, signif_value = c(3,.5)) %>% 
    pvclust_show_signif(result, signif_value = c("black", "grey"), show_type = "col") %>% 
    plot(main = "Cluster dendrogram with AU/BP values (%)") 
# pvrect(result, alpha=0.95) 
pvrect2(result, alpha=0.95) 
text(result, alpha=0.95) 

[1]: https://i.stack.imgur.com/G UvdV.png

+1

C'est super, merci beaucoup de fournir une solution stable et pas seulement une solution de rechange ponctuelle !! Très apprécié. – IsoBar

+0

Mon plaisir :) Je pense qu'il devrait être généralisé pour utiliser rect.dendrogram, mais j'y reviendrais à un autre moment ... –

+0

@TalGalili Est-il possible de maintenir les valeurs AU/BP annotées au-dessus des branches de pvclust? – Djork