首页 > 解决方案 > 从二分 R 包更改 visweb() 邻接矩阵图中标签的位置

问题描述

我正在使用 R 中的二分包进行生态网络分析,专门研究植物-传粉媒介的共生关系。

我使用 visweb() 函数使用二分包指南中提供的标准代码创建邻接矩阵。我想更改较低级别的物种标签的位置,因为它当前向左倾斜,但是我在包装指南中看不到任何告诉您如何操作的内容它目前看起来像这样

有人可以帮忙吗?

标签: rbipartite

解决方案


不幸的是,R 包中的函数visweb()没有bipartite任何参数来允许微调标签的位置。

我建议两种解决方案,都有些复杂:

1 - 将情节转换为gTree对象(grid包装意识形态)

您可以将生成的图转换viswebgTree对象。AgTree充当许多网格图形对象/组件(“grobs”)的容器列表。

我在这里使用包Safariland附带的数据bipartite作为解决问题的示例:

library(bipartite)
library(gridGraphics)

data(Safariland) # load data
# Creates a gTree object from the "usual" plot generated by `visweb`
my_gTree <- grid.grabExpr(grid.echo(function() visweb(Safariland)))

查看新创建的 gTree 对象的结构。“grobs”可以像通常的列表一样被索引,所以我们可以对它们进行编辑。在这里,我尝试识别引用两个轴标签的“grobs”并编辑它们的位置:

View(my_gTree)
# shift the left axis labels to the right
my_gTree[["children"]][["graphics-plot-1-left-axis-labels-1"]][["x"]] <- unit(0.2, units = "in")
# shift the bottom axis labels upwards
my_gTree[["children"]][["graphics-plot-1-bottom-axis-labels-1"]][["y"]] <- unit(1.5, units = "in")

这是通常的情节,用 获得visweb(Safariland)。注意标签和网格之间的额外空间(左侧和底部): 在此处输入图像描述

这是grid具有上述编辑的版本:

grid.newpage(); grid.draw(my_gTree)

在此处输入图像描述

更重要的是,如果你愿意,你可以用ggplot2::ggsave()函数保存它:

library(ggplot2)
ggsave(filename = "visweb-grid-version.png", plot = my_gTree)

2 - 适应/编辑visweb您的需求

例如,如果您检查函数的代码View(visweb)并搜索关键字labsize,您将了解该函数有两次对该函数的调用axis;也就是说,作者决定调用该axis函数来显示标签(物种名称)。你会看到他们使用了类似的东西:

 axis(2, (1:n.prey) - 0.5, labels = ynl, tick = FALSE, 
      mgp = c(0, 0, 0), las = 2, cex.axis = 0.4 * labsize * clratio)

这里控制标签位置的是mpg参数。您可以在帮助页面中找到有关它的更多信息?par并进行搜索。mpg如果您设置mpg为类似的东西c(0, -2, 0)可能会解决您的问题(需要尝试一些值,直到正确为止)。这个想法是第三个元素的负值会将左轴的标签向右移动。因此,将代码编辑为如下所示:

 axis(2, (1:n.prey) - 0.5, labels = ynl, tick = FALSE, 
      mgp = c(0, -2, 0), las = 2, cex.axis = 0.4 * labsize * clratio)

然后visweb在本地保存这个编辑过的函数,visweb.r当你需要它的时候在你的主脚本中使用source(visweb.r).

作为旁注 - 这也是开源的美丽和力量的一个例子 - 使用他人的工作并使其适应您的需求。更重要的是,您还可以尝试bipartite在其 GitHub 存储库上为该软件包做出贡献(或公开问题),以便社区受益。


推荐阅读