首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >in图中的偏移geom_segment

in图中的偏移geom_segment
EN

Stack Overflow用户
提问于 2016-03-09 22:56:37
回答 1查看 1.4K关注 0票数 5

我正试图在ggplot中建立一个网络小区。两件事: 1)我需要将节点放在特定的(x,y)值上。这不是问题。2)网络情节是有指导的,但我需要能够显示从节点B到节点A的区别,而不是从节点A到节点B的差异。

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

但是这些代码都是手工生成的(粘贴在下面以供参考)。我正试图在ggg图中完成偏移量,在这里,我已经有了节点位置的(x,y)对,以及(x,y)之间的连接的边缘列表。

代码语言:javascript
复制
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和风水网,但它们都不像有任何东西能处理这个问题。我找到了一个构建了一些geom来实现这个功能的人--它有用于偏移和缩短段末端的输入(这样它们就不会一直指向节点)。它在这里的这个页面上(一直滚动到底部):再加上这样

但它不再起作用了。当我尝试使用它时,我得到一个错误读数:

eval中的错误(expr,envir,expr):找不到"eval“函数

做一些谷歌搜索,这似乎与最近一次对ggplot的重大改革有关(而且,作为一个程序员,我还没有足够的能力深入到引擎盖下,找出具体的修复方法)。有数以百计的地块,每个节点有10-20个节点,所以手工尝试和错误是不可能的。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2016-03-10 18:48:18

假设这是两个节点。

代码语言:javascript
复制
tempNodes <- data.frame ('x' = c(10, 40), 'y' = c(10, 30) )

这些是有向线的端点(每个方向一个)。

代码语言:javascript
复制
data <- data.frame('x' = c(10,40), 'y' = c(10,30), 'xend' = c(40,10), 'yend' = c(30,10))

然后,我总结了从'geom_segment_plus‘代码借用的数学,并得到了这个。

代码语言:javascript
复制
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)
  }

所以如果我把它分配给像这样的“临时”:

代码语言:javascript
复制
temp <- segementsDf(data, 2.5, 2.5, 2)

然后我就可以在ggplot中运行它了:

代码语言:javascript
复制
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))

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

超级笨重(我会清理它一点来匹配工作流),但现在它解决了这个问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35904363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档