горизонтальная дендрограмма в R с метками

Я пытаюсь нарисовать дендрограмму из вывода функции hclust. Я надеюсь, что дендрограмма расположена горизонтально, а не по умолчанию, которую можно получить (например)

require(graphics)
hc <- hclust(dist(USArrests), "ave")
plot(hc)

Я попытался использовать as.dendrogram() функцию, такую ​​как plot(as.dendrogram(hc.poi),horiz=TRUE), но результат без значимых меток:

введите описание изображения здесь

Если я использую plot(hc.poi,labels=c(...)) без as.dendrogram(), я могу передать аргумент labels=, но теперь дендрограмма будет вертикальной, а не горизонтальной. Есть ли способ одновременно расположить дендрограмму по горизонтали и присвоить указанные пользователем метки? Спасибо!

Обновление: в качестве примера из набора данных USArrests предположим, что я хочу использовать сокращения первых двух букв названий штатов в качестве меток, чтобы каким-то образом передать labs в функцию построения графика:

labs = substr(rownames(USArrests),1,2)

который дает

 [1] "Al" "Al" "Ar" "Ar" "Ca" "Co" "Co" "De" "Fl" "Ge" "Ha"
[12] "Id" "Il" "In" "Io" "Ka" "Ke" "Lo" "Ma" "Ma" "Ma" "Mi"
[23] "Mi" "Mi" "Mi" "Mo" "Ne" "Ne" "Ne" "Ne" "Ne" "Ne" "No"
[34] "No" "Oh" "Ok" "Or" "Pe" "Rh" "So" "So" "Te" "Te" "Ut"
[45] "Ve" "Vi" "Wa" "We" "Wi" "Wy"

person alittleboy    schedule 02.01.2013    source источник
comment
Интересно, что такое hc.poi в ваших примерах кода?   -  person The Red Pea    schedule 07.08.2016


Ответы (2)


Чтобы отобразить определенные метки в горизонтальной дендрограмме, одним из решений является присвоение имен строк фрейма данных новым меткам (все метки должны быть уникальными).

require(graphics)
labs = paste("sta_",1:50,sep="") #new labels
USArrests2<-USArrests #new data frame (just to keep original unchanged)
rownames(USArrests2)<-labs #set new row names
hc <- hclust(dist(USArrests2), "ave")
par(mar=c(3,1,1,5)) 
plot(as.dendrogram(hc),horiz=T)

введите описание изображения здесь

РЕДАКТИРОВАТЬ - решение с использованием ggplot2

labs = paste("sta_",1:50,sep="") #new labels
rownames(USArrests)<-labs #set new row names
hc <- hclust(dist(USArrests), "ave")

library(ggplot2)
library(ggdendro)

#convert cluster object to use with ggplot
dendr <- dendro_data(hc, type="rectangle") 

#your own labels (now rownames) are supplied in geom_text() and label=label
ggplot() + 
  geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
  geom_text(data=label(dendr), aes(x=x, y=y, label=label, hjust=0), size=3) +
  coord_flip() + scale_y_reverse(expand=c(0.2, 0)) + 
  theme(axis.line.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.text.y=element_blank(),
        axis.title.y=element_blank(),
        panel.background=element_rect(fill="white"),
        panel.grid=element_blank())

введите описание изображения здесь

person Didzis Elferts    schedule 02.01.2013
comment
спасибо, но я все еще не понимаю, как мы можем присвоить заданные пользователем метки горизонтальной дендрограмме? В приведенном вами примере есть встроенные метки, но я действительно хочу передать свои собственные ... - person alittleboy; 02.01.2013
comment
См. Обновление выше. Мне очень жаль, что мой собственный пример данных сложно опубликовать в Интернете, поэтому я просто составил вектор метки, который хочу показать на горизонтальной дендрограмме. Спасибо еще раз! - person alittleboy; 02.01.2013
comment
@alittleboy обновил мое решение. Это решение работает, только если метки уникальны. - person Didzis Elferts; 02.01.2013
comment
Чтобы изменить ярлыки, достаточно hc$labels <- labs. Нет необходимости копировать весь фрейм данных. - person h2kyeong; 08.10.2013
comment
Я думаю, когда OP говорит, что в приведенном вами примере есть встроенные метки, он означает, что объект hclust, хранящийся в hc, уже имеет метки для листьев своего дерева (как описано в документация по hclust). Кроме того, если вы используете stringdistmatrix вместо dist, запомните аргумент _4 _, который маркирует каждую строку самой строкой. - person The Red Pea; 07.08.2016
comment
@DidzisElferts, это потрясающе !!! Вы должны написать свое решение ggplot как небольшой пакет (или попросить включить его, скажем, в ggfortify). - person JelenaČuklina; 10.05.2018

Используя dendrapply, вы можете настроить свое дендро по своему усмотрению.

введите описание изображения здесь

colLab <- function(n) {
  if(is.leaf(n)) {
    a <- attributes(n)
    attr(n, "label") <- substr(a$label,1,2)             #  change the node label 
    attr(n, "nodePar") <- c(a$nodePar, lab.col = 'red') #   change the node color
  }
  n
}

require(graphics)
hc <- hclust(dist(USArrests), "ave")
clusDendro <- as.dendrogram(hc)
clusDendro <- dendrapply(clusDendro, colLab)
op <- par(mar = par("mar") + c(0,0,0,2))
plot(clusDendro,horiz=T)
person agstudy    schedule 02.01.2013
comment
да, я ценю ваш отличный ответ и проголосовал за ваш пост. Извините, я должен выбрать только один окончательный ответ ... - person alittleboy; 02.01.2013