我正在尝试在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个节点,因此手工试验和错误实际上不会发生。任何帮助表示赞赏。
答案 0 :(得分:5)
假设这些是两个节点。
tempNodes <- data.frame ('x' = c(10, 40), 'y' = c(10, 30) )
这些是有向线的端点(每个方向一个)。
data <- data.frame('x' = c(10,40), 'y' = c(10,30), 'xend' = c(40,10), 'yend' = c(30,10))
然后我结束从'geom_segment_plus'代码中借来的数学并得到它。
segementsDf <- function(data, shorten.start, shorten.end, offset){
data$dx = data$xend - data$x
data$dy = data$yend - data$y
data$dist = sqrt( data$dx^2 + data$dy^2 )
data$px = data$dx/data$dist
data$py = data$dy/data$dist
data$x = data$x + data$px * shorten.start
data$y = data$y + data$py * shorten.start
data$xend = data$xend - data$px * shorten.end
data$yend = data$yend - data$py * shorten.end
data$x = data$x - data$py * offset
data$xend = data$xend - data$py * offset
data$y = data$y + data$px * offset
data$yend = data$yend + data$px * offset
return(data)
}
所以,如果我将它分配给'temp',就像这样:
temp <- segementsDf(data, 2.5, 2.5, 2)
然后我可以在ggplot中运行它:
ggplot(tempNodes, aes(x = x, y = y)) + geom_point(size = 12) + xlim(0,50) +
ylim(0,50) + geom_segment(data = temp, aes(x = x, xend = xend, y = y, yend = yend))
我得到了这个(现在没有箭头,但非常接近......我可以修改偏移量和结束值)。
超级笨重(我会稍微清理它以匹配工作流程)但是现在它解决了这个问题。