R中的水平树状图与标签

时间:2013-01-02 06:55:22

标签: r dendrogram hclust

我正在尝试从hclust函数输出中绘制树形图。我希望树形图是水平排列而不是默认值,可以通过(例如)

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

我尝试使用像as.dendrogram()这样的plot(as.dendrogram(hc.poi),horiz=TRUE)函数,但结果是没有有意义的标签:

enter image description here

如果我使用没有plot(hc.poi,labels=c(...))的{​​{1}},我可以传递as.dendrogram()参数,但现在树形图是垂直的而不是水平的。有没有办法水平同时排列树形图并分配用户指定的标签?谢谢!

更新:作为USArrests数据集的示例,假设我想使用州名的前两个字母的缩写作为标签,以便我想以某种方式将labels=传递给绘图功能:

labs

给出了

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

2 个答案:

答案 0 :(得分:25)

要在水平树形图中显示已定义的标签,一种解决方案是将数据框的行名称设置为新标签(所有标签应该是唯一的)。

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)

enter image description here

编辑 - 使用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())

enter image description here

答案 1 :(得分:25)

使用dendrapply,您可以根据需要自定义dendro。

enter image description here

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)