DCA:使用自动绘图或 ggplot2 标记点
Posted
技术标签:
【中文标题】DCA:使用自动绘图或 ggplot2 标记点【英文标题】:DCA : Labelling points with autoplot or ggplot2 【发布时间】:2021-05-15 18:37:12 【问题描述】:我发现在 autoplot 或 ggplot 中为具有 DCA 的站点添加标签非常困难。 我还想根据它们的组来区分 autoplot/ggplot 上的点。 这是我使用的数据和代码,它运行良好,直到 autoplot/ggplot 命令:
library(vegan)
data(dune)
d <- vegdist(dune)
csin <- hclust(d, method = "single")
cl <- cutree(csin, 3)
dune.dca <- decorana(dune)
autoplot(dune.dca)
这是获得的自动绘图:
我正在使用简单的编码,我尝试了这些代码,但它们并没有引导我到任何地方:
autoplot(dune.dca, label.size = 3, data = dune, colour = cl)
ggplot(dune.dca(x=DCA1, y=DCA2,colour=cl))
ggplot(dune.dca, display = ‘site’, pch = 16, col = cl)
ggrepel::geom_text_repel(aes(dune.dca))
如果有人有一个简单的建议,那就太好了。
【问题讨论】:
欢迎来到 SO。通过将包添加到代码中,确保您的示例可重现。Dune
不是基础 R 的一部分。您应该考虑查看 ggplot::geom_label
的帮助文件以及使用 ?ggplot::geom_label
的示例。您绝对应该阅读关于 ggplot2 的guide,以熟悉语法。现在这就是你的问题所在。
嗨。谢谢您的建议。是的,我已经阅读了本指南,并且没有任何关于在 DCA 上贴标签的内容。我花了两天时间尝试贴标签,但没有成功。我使用 R 多年,从未发布任何内容。在寻求帮助之前我想了 100 次,但这次没有任何效果。我不明白为什么为 DCA 任命添加标签如此复杂。我使用 PCA 轻松管理,但显然由于结果的结构,它与 DCA 的工作方式不同。
从您的帖子看来,您似乎缺少autoplot(...) + geom_label(nudge.y = 0.25)
或类似的东西,用您的代码替换...
。
【参考方案1】:
通过添加的信息(包),我能够深入挖掘。
问题是(简而言之)autoplot.decorana
将数据添加到特定层(geom_point
或geom_text
)。这不会继承到其他层,因此添加其他层会导致空白页。
基本上注意到下面2个代码字符串之一会导致错误,并注意data
参数的位置:
# Error:
ggplot() +
geom_point(data = mtcars, mapping = aes_string(x = 'hp', y = 'mpg')) +
geom_label(aes(x = hp, y = mpg, label = cyl))
# Work:
ggplot(data = mtcars) +
geom_point(mapping = aes_string(x = 'hp', y = 'mpg')) +
geom_label(aes(x = hp, y = mpg, label = cyl))
ggvegan:::autoplot.decorana
放置数据,如示例中返回错误。
我看到了解决这个问题的两种方法:
-
使用
ggplot_build
或layer_data
提取图层数据并创建整体或单层映射。
提取生成数据的代码,并手动创建我们的绘图(不使用autoplot
)。
老实说,我认为第二个更简单,因为我们可能必须提取更多信息以使我们的数据变得合理。通过查看ggvegan:::autoplot.decorana
的源代码(只需省略括号将其打印到控制台),我们可以提取下面的代码,它生成的数据与图中使用的数据相同
ggvegan_data <- function(object, axes = c(1, 2), layers = c("species", "sites"), ...)
obj <- fortify(object, axes = axes, ...)
obj <- obj[obj$Score %in% layers, , drop = FALSE]
want <- obj$Score %in% c("species", "sites")
obj[want, , drop = FALSE]
有了这个,我们就可以生成我们想要的任何图,使用适当的映射而不是层单独的映射
dune.plot.data <- ggvegan_data(dune.dca)
p <- ggplot(data = dune.dca, aes(x = DCA1, DCA2, colour = Score)) +
geom_point() +
geom_text(aes(label = Label), nudge_y = 0.3)
p
这给了我们我希望是你想要的输出
【讨论】:
谢谢。这很棒。是的,这就是我想要得到的。我只是想展示没有物种的网站。我会试试你提议的。它希望 ggplot 更易于使用。非常感谢。 它的设计很简单。但是有些事情可能是不直观的。这绝对是其中一种情况,我猜作者不知道是这种情况。 :-) 查看package repo 这是作者意识到的一个问题。从源头上看,这种选择的主要原因似乎是,几个地块有额外的层(例如cca
的箭头)。可以尝试打开一个问题,看看他们是否不会将数据添加到主层。以上是关于DCA:使用自动绘图或 ggplot2 标记点的主要内容,如果未能解决你的问题,请参考以下文章