我需要将通过切割给定相似度级别的树状图生成的簇叠加到排序结果 (NMDS) 上。我一直在研究 ade4 和 vegan,但没有找到任何明显的解决方案来解决这个问题。
我目前正在使用 Primer-e(参见下面的屏幕截图),但发现图形有点有限。任何方向正确的观点都会受到高度赞赏。
最佳答案
这对于素食主义者来说非常简单,我有一个 blog post这详细解释了其中的一些内容,但没有解释有关集群的部分。
这是一个简单的示例,我假设您可以将其转换为您正在使用的任何包/代码。
加载包和数据集
require(vegan)
data(dune)
计算相异矩阵并对其进行聚类,将树状图切割为 3 组
dij <- vegdist(dune) ## bray curtis dissimilarity
clu <- hclust(dij, method = "average")
grp <- cutree(clu, 3)
看看grp
R> grp
2 13 4 16 6 1 8 5 17 15 10 11 9 18 3 20 14 19 12 7
1 1 1 2 1 1 1 1 3 2 1 1 1 1 1 2 2 3 1 1
请注意,现在使用数据集中每个样本(顶行)的簇成员资格(第二行)。
接下来安装 NMDS
set.seed(2) ## setting a seed to make this reproducible
ord <- metaMDS(dune)
在此示例中,我将根据簇成员资格对点进行着色,因此我需要定义一个颜色向量,每个簇一个颜色
col <- c("red2", "green4", "mediumblue")
我现在可以使用 grp
和 col
通过索引到 col
为我绘制的每个点(样本)生成颜色名称向量> 使用grp
。例如:
R> col[grp]
[1] "red2" "red2" "red2" "green4" "red2"
[6] "red2" "red2" "red2" "mediumblue" "green4"
[11] "red2" "red2" "red2" "red2" "red2"
[16] "green4" "green4" "mediumblue" "red2" "red2"
剩下的就是绘制 NMDS 顺序并添加点和图例。我禁止在 plot()
调用中进行任何绘图,这样我就可以更好地控制在下一行中添加点。第三行只是添加了一个图例。
plot(ord, type = "n", display = "sites")
points(ord, col = col[grp], bg = col[grp], pch = 21)
legend("topright", legend = paste("Cluster", 1:3),
col = col, pt.bg = col, bty = "n", pch = 21)
结果图应如下所示:
<小时/>
更新:要将每个点簇的凸包添加到排序图,您可以使用ordihull()
函数。继续上面的示例,我们添加凸包如下
ordihull(ord, groups = grp, display = "sites")
此时该图将如下所示
<小时/>
注意:vegan的更高级别的plot()
方法是专门设计的,用于快速而肮脏地显示排序和因此不接受颜色向量或绘图字符。相反,我们希望您构建较低级别的绘图流方法,例如我在这里使用的 points()
方法。
关于r - 将聚类结果叠加到排序上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12436902/