【问题标题】:Customizing a vegan pca plot with ggplot2使用 ggplot2 自定义纯素 pca 图
【发布时间】:2018-02-27 12:46:30
【问题描述】:

我正在尝试在 ggplot2 中制作一些纯素 rda 结果的自定义图。我实质上是在修改Plotting RDA (vegan) in ggplot 中的方向,因此我使用形状和颜色标签来传达有关样本点的一些信息。

我用 vegan 设置了 pca 分析,如下所示

library(vegan)
library(dplyr)
library(tibble)
library(ggplot2)
cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73",  "#0072B2", "#D55E00", "#CC79A7", "#F0E442")
data(dune)
data(dune.env)
dune.pca <- rda(dune)
uscores <- data.frame(dune.pca$CA$u)
uscores1 <- inner_join(rownames_to_column(dune.env), rownames_to_column(data.frame(uscores)), type = "right", by = "rowname")
vscores <- data.frame(dune.pca$CA$v)

我可以制作一个简单的双标图

 biplot(dune.pca)

现在,假设我想了解更多关于这些不同样本的管理条件。我将对它们进行颜色和形状编码,并使用 ggplot 进行绘图。

p1 <- ggplot(uscores1, aes(x = PC1, y = PC2, col = Management,
                         shape = Management)) + 
geom_point() +
scale_color_manual(values=cbPalette) +
scale_fill_manual(values=cbPalette) +
scale_shape_manual(values = c(21:25)) +
theme_bw() +
theme(strip.text.y = element_text(angle = 0))
p1

接下来,我真的很想添加一些双标图箭头,向我们展示与物种丰度相对应的轴。我可以使用 ggplot 来绘制这些箭头,如下所示:

p2 <- ggplot() +  geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red') +
geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")),
            alpha = 0.75, color = 'darkred')
p2

我真正想做的是将这些箭头和点放在同一个情节上。目前这是我正在尝试使用的代码:

p3 <- p1 + geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red') +
geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")),
            alpha = 0.75, color = 'darkred')
p3

令我烦恼的是,这只会产生一个空白图(空窗口,没有错误消息)。显然我遗漏了一些东西或不正确地缩放了一些东西。关于如何最好地叠加最后两个图有什么建议吗?

【问题讨论】:

    标签: r ggplot2 pca vegan


    【解决方案1】:

    您还应该查看 GitHub (https://github.com/jfq3/ggordiplots) 上的 ggordiplots。它包括函数 gg_env__fit 将环境向量拟合到排序图。包中的所有函数都会静默返回数据框,您可以根据需要修改绘图。该软件包包括一个关于修改地块的小插曲。您可以通过访问 john-quensen.com 并查看 GitHub 页面来阅读这些小插曲,而无需安装包。

    【讨论】:

      【解决方案2】:

      检查来自githubggvegan 包。它仍然是 0.0 版本,目前还没有积极开发,但如果你说

      library(ggvegan)
      autoplot(dune.pca) # your result object
      

      你会得到这个图表,你可以用通常的 ggplot2 方式来定制它,具有不同的美感。

      【讨论】:

      • 感谢 Oksanen 博士。 GGvegan 听起来确实很有希望。我对这种方法的担忧是,据我所知,修改站点点的颜色和形状并非易事。例如,在上面的示例中,站点都是红色方块,但我希望形状取决于管理类型。我可以使用 fortify() 函数导出数据,然后将其输入 ggplot,但随后我遇到了与上述相同的问题。如果我在这里遗漏了什么,请有人纠正我。如果可以的话,我宁愿用 ggvegan 来做这件事,因为它可以为我节省几行代码。
      • autoplot() 方法旨在(我认为是 autoplot 概念的原始设计)给你一个情节。在内部,他们使用 ggvegan 提供的 fortify() 方法来准备一个整洁的数据结构,适合使用 ggplot2 进行绘图,您可以在其中完全控制。查看包中的自动绘图方法之一的代码,了解如何执行此操作。
      【解决方案3】:

      试试:

      library(cowplot) #not needed I just had it attached while answering the question hence the theme.
      library(ggplot2)
      
      ggplot(uscores1) + 
            geom_point(aes(x = PC1, y = PC2, col = Management,
                           shape = Management)) +
            scale_color_manual(values=cbPalette) +
            scale_fill_manual(values=cbPalette) +
            scale_shape_manual(values = c(21:25)) +
            geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red') +
            geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")),
                         alpha = 0.75, color = 'darkred')+
            theme_bw() +
            theme(strip.text.y = element_text(angle = 0))
      

      p1 绘图将colshape 变量Management 传递到geom_text/geom_segment,因为它们没有在那里定义,但data = vscores 中没有Management 列。至少基于错误我是这么认为的:

      `Error in eval(expr, envir, enclos) : object 'Management' not found`
      

      【讨论】:

      • 你的观察让我意识到这个问题与我之前的问题stackoverflow.com/questions/46159950/…非常相似。
      • 这里是我的代码的一个更简单的重写,让它工作:p3 &lt;- p1 + geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red', inherit.aes = F)+ geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")), alpha = 0.75, color = 'darkred', inherit.aes = F)
      • 必须添加+ coord_fixed(ratio = 1):排序图必须使用相等的纵横比。
      • 除了使用coord_fixed(ratio = 1),还有另一个警告:您的示例使用未缩放的原始分数,但在绘图中您要考虑特征值和具有高特征值的拉伸轴,并收缩那些具有低特征值的。您可以手动完成所有这些操作,但您必须这样做。我们的绘图和评分函数会自动执行此操作,ggvegan 包也是如此。一般情况下,您绝不直接以dune.pca$CA$v 访问分数,但您应该使用scores 函数,该函数还可以根据需要缩放分数。
      • 感谢您指出这一点。现在,我计算分数的代码为:allscores &lt;- scores(dune.pca); uscores &lt;- data.frame(allscores$sites); uscores$ptvis &lt;- rownames(uscores); uscores1 &lt;- inner_join(rownames_to_column(dune.env), rownames_to_column(data.frame(uscores)), type = "right", by = "rowname"); vscores &lt;- data.frame(allscores$species);,我在末尾添加了coord_fixed(ratio = 1) 行。
      猜你喜欢
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2022-12-10
      • 2019-04-15
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多