2014-12-15 12 views
7

'daki ek bir faktör değişkeni ile renklendirilmesi Aşağıda, aşağıdaki kodu kullanarak R'de hiyerarşik kümeleme analizi yürüttükten sonra bir dendrogram ürettim. Şimdi etiketleri bir vektör olarak kaydedilen başka bir faktör değişkenine göre renklendirmeye çalışıyorum. Bunu gerçekleştirmeye geldiğim en yakın nokta, sparcl paketindeki ColourDendrogram işlevini kullanarak dalları renk kodlaması yapmaktır. Mümkünse etiketleri renklendirmeyi tercih ederim. Benzer sorulara aşağıdaki bağlantılarda Color branches of dendrogram using an existing column & Colouring branches in a dendrogram in R yanıtlarını buldum, ancak amacım için örnek kodun nasıl dönüştürüleceğini bilemedim. Aşağıda bazı örnek veriler ve kod bulunmaktadır.Bir dendrogramın etiketlerinin R

> dput(df) 
structure(list(labs = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", 
"a8", "b1", "b2", "b3", "b4", "b5", "b6", "b7"), var = c(1L, 
1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L), td = c(13.1, 
14.5, 16.7, 12.9, 14.9, 15.6, 13.4, 15.3, 12.8, 14.5, 14.7, 13.1, 
14.9, 15.6, 14.6), fd = c(2L, 3L, 3L, 1L, 2L, 3L, 2L, 3L, 2L, 
4L, 2L, 1L, 4L, 3L, 3L)), .Names = c("labs", "var", "td", "fd" 
), class = "data.frame", row.names = c(NA, -15L)) 

df.nw = df[,3:4] 
labs = df$labs 

d = dist(as.matrix(df.nw))       # find distance matrix 
hc = hclust(d, method="complete")     # apply hierarchical clustering 
plot(hc, hang=-0.01, cex=0.6, labels=labs, xlab="") # plot the dendrogram 

hcd = as.dendrogram(hc)        # convert hclust to dendrogram 
plot(hcd, cex=0.6)         # plot using dendrogram object 

Var = df$var          # factor variable for colours 
varCol = gsub("1","red",Var)      # convert numbers to colours 
varCol = gsub("2","blue",varCol) 

# colour-code dendrogram branches by a factor 
library(sparcl) 
ColorDendrogram(hc, y=varCol, branchlength=0.9, labels=labs, 
       xlab="", ylab="", sub="") 

Bunun nasıl yapılacağı konusunda herhangi bir öneri çok takdir edilecektir.

cevap

3

# ... your code 
colLab <- function(n) { 
    if(is.leaf(n)) { 
    a <- attributes(n) 
    attr(n, "label") <- labs[a$label] 
    attr(n, "nodePar") <- c(a$nodePar, lab.col = varCol[a$label]) 
    } 
    n 
} 
plot(dendrapply(hcd, colLab)) 

(via)

+0

@ luke: cevabınız için teşekkürler. Bu, doğru renkler verir, ancak kullanıcıya özgü etiketlere (yukarıdaki 'laboratuvarlarla belirtilenler) izin vermez. Http://stackoverflow.com/questions/14118033/horizontal-dendrogram-in-r-with-labels/14118735#14118735 adresinde bulunan kodu takip ederek aşağıdakileri ekledim: attr (n, "label") < - Laboratuarlar ama daha sonra okunaksız etiketlerle bir dendrogram ile sona erdi (R, bir grup farklı etiketin üzerine üst üste yazmış gibi görünüyordu). – jjulip

+0

Ayrıca hfust çalıştırmadan önce df satır adlarını değiştirmeyi denedim ve bu çalışmadı. Kullanıcıya özel etiketlere nasıl sahip olabileceğimiz hakkında bir fikrin var mı? yardım ettiğin için teşekkür ederim. – jjulip

+0

@jjulip 'attr (n," label ") <- labs' yerine attr (n," label ") <- labs [a $ label]' i kullanmayı deneyin. – lukeA

2

etiketlerinizi boyama için, dendextend paketinden labels_colors işlevi kullanmak için en kolay olurdu deneyin. Örneğin: paket üzerinde daha ayrıntılı bilgi için

# install.packages("dendextend") 
library(dendextend) 

small_iris <- iris[c(1, 51, 101, 2, 52, 102), ] 
dend <- as.dendrogram(hclust(dist(small_iris[,-5]))) 
# Like: 
# dend <- small_iris[,-5] %>% dist %>% hclust %>% as.dendrogram 

# By default, the dend has no colors to the labels 
labels_colors(dend) 
par(mfrow = c(1,2)) 
plot(dend, main = "Original dend") 

# let's add some color: 
colors_to_use <- as.numeric(small_iris[,5]) 
colors_to_use 
# But sort them based on their order in dend: 
colors_to_use <- colors_to_use[order.dendrogram(dend)] 
colors_to_use 
# Now we can use them 
labels_colors(dend) <- colors_to_use 
# Now each state has a color 
labels_colors(dend) 
plot(dend, main = "A color for every Species") 

, bir göz at its vignette sahip olabilir.

enter image description here

+0

@ Tal: Sadece bunu gördüm. Cevap için teşekkürler! Gerçekten faydalı. – jjulip

+0

Teşekkürler @jjulip. Alkış, T –

+0

Merhaba @jjulip - Daha detaylı bir yanıt ekledim. Umarım bunu bir çözüm olarak işaretlemeyi düşünebilirsiniz. Teşekkürler. –

İlgili konular