【问题标题】:horizontal dendrogram in R with labelsR中带有标签的水平树状图
【发布时间】:2012-12-16 13:59:36
【问题描述】:

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

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

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

如果我使用没有as.dendrogram()plot(hc.poi,labels=c(...)),我可以传递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"

【问题讨论】:

  • 我想知道您的代码示例中的hc.poi 是什么?

标签: r dendrogram hclust


【解决方案1】:

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

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())

【讨论】:

  • 谢谢,但我仍然不明白如何将用户指定的标签分配给水平树状图?你给出的例子有内置标签,但我真的想传递我自己的标签......
  • 请参阅上面的更新。很抱歉,我自己的数据示例很难在线发布,所以我只是制作了一个标签向量,我想在水平树状图上显示它。再次感谢!
  • @alittleboy 更新了我的解决方案。此解决方案仅在标签是唯一的情况下才有效。
  • 要更改标签,hc$labels &lt;- labs 就足够了。无需复制整个数据框。
  • 我认为当 OP 说“您给出的示例具有内置标签”时,他的意思是存储在 hc 中的 hclust 对象已经有其树的叶子的“标签”(如在hclust 文档中描述)。此外,如果您使用stringdistmatrix 而不是distthen remember the argument useNames 会用字符串本身标记每个字符串。
【解决方案2】:

使用dendrapply,您可以随意定制您的dendro。

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)

【讨论】:

  • 是的,我很欣赏你的出色回答,我已经支持你的帖子。抱歉,我只能选择一个最终答案...
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2015-12-15
  • 2021-10-04
  • 1970-01-01
  • 2015-09-05
  • 2020-11-27
  • 1970-01-01
相关资源
最近更新 更多