【发布时间】:2021-12-01 02:20:33
【问题描述】:
我正在尝试在 ggplot 中构建网络图。两件事:1)我需要将节点放在特定的(x,y)值。这不是问题。 2) 网络图是定向的,但我需要能够显示从节点 B 到节点 A 与从节点 A 到节点 B 之间的差异。
这是我遇到麻烦的后一点。基本上我需要抵消节点之间平行运行的两条线。最终线条的权重会被映射到某个东西,但大致看起来像这样:
但是这段代码都是手工生成的(贴在下面供参考)。我试图在 ggplot 中完成偏移,其中我已经有节点位置的(x,y)对,以及(x,y)之间连接的边缘列表。
offsetDf <- data.frame('x' = c(10, 40), 'y' = c(10, 30), 'startX' = c(13, 36.5), 'startY' = c(11, 29), 'endX' = c(37.5, 12), 'endY' = c(27, 13) )
ggplot(offsetDf, aes(x = x, y = y)) +
geom_point(size = 13) +
xlim(0,50) + ylim(0,50) +
geom_segment(aes(x = startX, y = startY, xend = endX, yend = endY),
arrow = arrow(length = unit(.3, 'cm')))
我查看了 GGally 和 geomnet,但看起来它们都没有处理这个问题的任何东西。我发现有人构建了一个小 geom 来做到这一点——它有用于偏移和缩短段末端的输入(所以它们不会一直到节点)。它在这个 SO 页面上(一直滚动到底部):geom_segment_plus on SO
但它不再有效。当我尝试使用它时,我得到一个错误读数:
eval(expr, envir, enclos) 中的错误:找不到函数“eval”
做了一点谷歌搜索,似乎与 ggplot 的最后一次大修有关(而且我作为编码人员还不够熟练,无法深入了解并弄清楚如何修复它)。将有数百个情节,每个情节有 10-20 个节点,因此不会真的发生手动试验和错误。任何帮助表示赞赏。
【问题讨论】:
-
geomnetpackage 将网络可视化几何图形添加到 ggplot。我没有使用它,但它可能是您正在寻找的:这里是presentation with some examples。 -
在原来的帖子中,我注意到我看过“geomnet”和“GGally”。我浏览了两者的文档。我没有找到任何可以处理此问题的方法,但需要注意的是我可能遗漏了一些东西。
-
因此,这不是最好的解决方案,但是,将数学作为“geom_segment_plus”转换的核心,我可以构建一个函数来将一些列添加到 data.frame 并使用这些变量得到我想要的'm after(至少在两点的试运行中)。我查看了 Hadley 关于扩展 ggplot2 和修改 geom 的简短教程,但现在我无法做到。如果有人可以让引用的 geom 工作,会留下这个。会使工作流程更轻松/更好,但至少现在我可以继续进行,无论多么笨拙。
-
如果您想出适合您的解决方案(即使笨拙),请将其作为答案发布。