如何使用 nmds 在 ggplot 中获得类似 ordispider 的集群?
how to get ordispider-like clusters in ggplot with nmds?
我刚刚成功地在我的非公制多维比例图上绘制和 ordisurf 模型。
使用了本网站的代码。
https://oliviarata.wordpress.com/2014/07/17/ordinations-in-ggplot2-v2-ordisurf/
但是我的问题是我很难弄清楚如何使用 ggplot 绘制簇图形。我环顾四周,最接近的是:
R - add centroids to scatter plot
答案涉及创建质心并将线从它延伸到点,但这不是用 nmds 对象完成的,所以我仍然感到困惑。
我使用 vegan 运行 我的 nmds 和 gpplot 进行绘图。
我会添加我的数据,但它由两个非常大的社区和环境数据集组成。 nmds 和后续的 ordisurf 函数需要完整数据 运行.
这是一种方法,它应该会在某个时候进入我的 ggvegan 包。
library('vegan')
library('ggplot2')
对于这个例子,我将使用素食主义者附带的荷兰沙丘草甸数据集
data(dune, dune.env)
我将使用 dune.env
中的 Management
变量作为我的集群成员向量。请注意,它被编码为一个因素;你应该确保你使用的任何集群成员向量都是同样编码的。
先举例排序
ord <- metaMDS(dune)
接下来,提取 NMDS 分数
scrs <- scores(ord, display = 'sites')
为了方便计算质心,我将 Management
作为变量添加到 scores
的数据框中
scrs <- cbind(as.data.frame(scrs), Management = dune.env$Management)
现在我们计算组质心,它是每个轴上的平均坐标,groupwise:
cent <- aggregate(cbind(NMDS1, NMDS2) ~ Management, data = scrs, FUN = mean)
要绘制蜘蛛,我们需要 geom_segment()
,这需要坐标来绘制线段 from 和 to。我们的 到 坐标,xend
和 yend
美学将是质心。所以我们需要为组中的每个观察复制组质心。我们通过 merge
:
的左连接来促进这一点
segs <- merge(scrs, setNames(cent, c('Management','oNMDS1','oNMDS2')),
by = 'Management', sort = FALSE)
请注意,我重命名了 cent
中的列,这样就不会与 scrs
中的同名列混淆——我们希望这些质心变量具有不同的名称。
现在我们可以绘图了
ggplot(scrs, aes(x = NMDS1, y = NMDS2, colour = Management)) +
geom_segment(data = segs,
mapping = aes(xend = oNMDS1, yend = oNMDS2)) + # spiders
geom_point(data = cent, size = 5) + # centroids
geom_point() + # sample scores
coord_fixed() # same axis scaling
产生
您可以使用 GitHub 包 ggordiplots (https://github.com/jfq3/ggordiplots) 中的 gg_envfit 函数。在 john-quensen.com 的 GitHub 页面上有包文档和插图的链接。包中的所有函数静默 return 数据框,您可以使用它们来进行自己的绘图修改。包括这样做的小插图。
我刚刚成功地在我的非公制多维比例图上绘制和 ordisurf 模型。 使用了本网站的代码。 https://oliviarata.wordpress.com/2014/07/17/ordinations-in-ggplot2-v2-ordisurf/
但是我的问题是我很难弄清楚如何使用 ggplot 绘制簇图形。我环顾四周,最接近的是: R - add centroids to scatter plot
答案涉及创建质心并将线从它延伸到点,但这不是用 nmds 对象完成的,所以我仍然感到困惑。
我使用 vegan 运行 我的 nmds 和 gpplot 进行绘图。 我会添加我的数据,但它由两个非常大的社区和环境数据集组成。 nmds 和后续的 ordisurf 函数需要完整数据 运行.
这是一种方法,它应该会在某个时候进入我的 ggvegan 包。
library('vegan')
library('ggplot2')
对于这个例子,我将使用素食主义者附带的荷兰沙丘草甸数据集
data(dune, dune.env)
我将使用 dune.env
中的 Management
变量作为我的集群成员向量。请注意,它被编码为一个因素;你应该确保你使用的任何集群成员向量都是同样编码的。
先举例排序
ord <- metaMDS(dune)
接下来,提取 NMDS 分数
scrs <- scores(ord, display = 'sites')
为了方便计算质心,我将 Management
作为变量添加到 scores
scrs <- cbind(as.data.frame(scrs), Management = dune.env$Management)
现在我们计算组质心,它是每个轴上的平均坐标,groupwise:
cent <- aggregate(cbind(NMDS1, NMDS2) ~ Management, data = scrs, FUN = mean)
要绘制蜘蛛,我们需要 geom_segment()
,这需要坐标来绘制线段 from 和 to。我们的 到 坐标,xend
和 yend
美学将是质心。所以我们需要为组中的每个观察复制组质心。我们通过 merge
:
segs <- merge(scrs, setNames(cent, c('Management','oNMDS1','oNMDS2')),
by = 'Management', sort = FALSE)
请注意,我重命名了 cent
中的列,这样就不会与 scrs
中的同名列混淆——我们希望这些质心变量具有不同的名称。
现在我们可以绘图了
ggplot(scrs, aes(x = NMDS1, y = NMDS2, colour = Management)) +
geom_segment(data = segs,
mapping = aes(xend = oNMDS1, yend = oNMDS2)) + # spiders
geom_point(data = cent, size = 5) + # centroids
geom_point() + # sample scores
coord_fixed() # same axis scaling
产生
您可以使用 GitHub 包 ggordiplots (https://github.com/jfq3/ggordiplots) 中的 gg_envfit 函数。在 john-quensen.com 的 GitHub 页面上有包文档和插图的链接。包中的所有函数静默 return 数据框,您可以使用它们来进行自己的绘图修改。包括这样做的小插图。