在 R 中预先知道所有合并的情况下绘制树状图

问题描述 投票:0回答:1

我正在寻找使用 R 绘制一个看起来像层次聚类树(树状图)的图,除了在我的例子中,我已经知道哪些集群与哪些集群合并。

示例: 假设我们有对象

'a'
'b'
'c'
'd'
'e'
。它们以 5 个集群 1、2、3、4 和 5 开始。现在我希望 1 和 2 合并到一个新集群(集群 6),然后合并集群 3 和 5(集群 7),然后将集群 6 与集群合并4(第 8 组) 到此为止。然后这棵树将由列表指定
[ (1,2), (3,5), (6,4) ]
.

希望描述足够清楚。这里基本上有两个子问题需要解决:

  • 从完全监督的过程中创建聚类对象;
  • 在到达顶部之前切断树状图;

如果后者对于一个问题来说太多了,你可以在答案中省略它。

r tree hierarchical-clustering dendrogram graph-visualization
1个回答
3
投票

这里尝试手动构建类“hclust”的对象。

首先-检查这个对象应该有什么属性:

fit <- hclust(dist(USArrests))
names(fit)
[1] "merge"   "height"  "order"   "labels"   "method"   "call"   "dist.method"

第二 - 检查所有这些信息中必须存在的信息:

help(hclust)
# read the section called "Values"

第三——创建对象并添加合并信息:

obj <- list()
obj$merge <- rbind(c(-1, -2), c(-3, -5), c(-4, 1), c(2, 3))

注意:根据

hclust()
合并的帮助页面,应该是一个两列矩阵,指定在每个步骤中合并哪些对象。似乎它必须包括将所有组合并为一棵最终树的所有步骤,因此您可能无法中途停止(因为那将是 3 棵独立的树)。负值表示叶子(即 c(-1, -2) 表示在第一步观察值 1 和 2 被合并)。正值是指在前面的步骤中获得的集群(即 c(-4, 1) 表示在这一步观察 4 与在步骤 1 中获得的集群合并)。

第四-添加高度:

obj$height <- 1:4

注意:这包含每个合并的合并高度。

第五 - 提供观察顺序:

obj$order  <- c(1,2,4,3,5)

注意:这是观察结果在 x 轴上的显示顺序。必需的,以便分支不重叠。您可以提供重叠的订单,但最终的树状图图片看起来不会很漂亮。

第六-添加标签:

obj$labels <- 1:5

注意:这些是最终树中叶子的名称。

第七-用类祝福我们的对象:

class(obj) <- "hclust"

注意:

plot()
功能需要选择合适的方法。

第八-绘制结果:

plot(obj, hang=-1)
rect(1, 2.5, 99, 99, col="white", border="white")

注意:hang 参数使所有叶子都在相同的 y 轴水平上,并且 rect 绘制一个白色矩形,视觉上隐藏了上面的树,它模仿了您不完全连接所有对象的要求。

可能有更简单/更好的方法,但我不知道。

© www.soinside.com 2019 - 2024. All rights reserved.