gpt4 book ai didi

r - ggplot 中的偏移 geom_segment

转载 作者:行者123 更新时间:2023-12-04 10:41:23 24 4
gpt4 key购买 nike

我正在尝试在 ggplot 中构建网络图。两件事:1)我需要将节点放在特定的(x,y)值上。这不是问题。 2)网络图是定向的,但我需要能够显示从节点 B 到节点 A 与从节点 A 到节点 B 的差异。

这是我遇到麻烦的后一点。基本上我需要抵消节点之间平行运行的两条线。最终线条的权重将被映射到某些东西,但大致如下所示:

enter image description here

不过这段代码都是手工生成的(贴在下面供引用)。我正在尝试在 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,但看起来它们都没有处理这个问题。我发现有人构建了一个小几何来做到这一点 - 它具有偏移和缩短段末端的输入(因此它们不会一直到节点)。它在此 SO 页面上(一直滚动到底部): geom_segment_plus on SO

但它不再起作用了。当我尝试使用它时,出现错误读数:

Error in eval(expr, envir, enclos) : could not find function "eval"



哪个,做一点谷歌搜索,似乎与 ggplot 的最后一次大修有关(而且我作为编码人员不够熟练,无法深入了解并弄清楚如何解决它)。将有数百个图,每个图有 10-20 个节点,因此手动试错不会真正发生。任何帮助表示赞赏。

最佳答案

假设这是两个节点。

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 <- 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))

我得到了这个(现在没有箭头但非常接近......我可以修改偏移量和结束值)。

enter image description here

super 笨重(我会稍微清理一下以匹配工作流程)但现在它解决了问题。

关于r - ggplot 中的偏移 geom_segment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35904363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com