r - 从二分 R 包更改 visweb() 邻接矩阵图中标签的位置
问题描述
我正在使用 R 中的二分包进行生态网络分析,专门研究植物-传粉媒介的共生关系。
我使用 visweb() 函数使用二分包指南中提供的标准代码创建邻接矩阵。我想更改较低级别的物种标签的位置,因为它当前向左倾斜,但是我在包装指南中看不到任何告诉您如何操作的内容它目前看起来像这样。
有人可以帮忙吗?
解决方案
不幸的是,R 包中的函数visweb()
没有bipartite
任何参数来允许微调标签的位置。
我建议两种解决方案,都有些复杂:
1 - 将情节转换为gTree
对象(grid
包装意识形态)
您可以将生成的图转换visweb
为gTree
对象。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 存储库上为该软件包做出贡献(或公开问题),以便社区受益。
推荐阅读
- java - 使用 Gson 库的 Json 到 Java 对象
- javascript - VueJS v-data-table 父子通信
- html - video.js 主题有错误
- mathjax - 我怎样才能中断变量名?
- python - 如何预测 Keras 中每个序列的多个值?LSTM 层
- iframe - 第三方重定向在 iframe 内的 Samesite Lax 预期行为
- c - 立即复制宏中的文本
- javascript - 两个手风琴,但仅使用 Javascript 为第一个箭头设置动画
- c++ - 为什么下面这段代码返回的是指针指向的值而不是指针的地址?
- c++ - 从 GUI 文件资源管理器执行程序,并且不生成终端