Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在ggplot2中在点之间很好地排列箭头_R_Ggplot2_Data Visualization - Fatal编程技术网

R 在ggplot2中在点之间很好地排列箭头

R 在ggplot2中在点之间很好地排列箭头,r,ggplot2,data-visualization,R,Ggplot2,Data Visualization,(注意-这是与相同的工作,但我提出了不同的问题) 我试图构建一个显示从一个类到另一个类的转换的图。我想用圆圈表示每个类,用箭头表示从一个类到另一个类的转换 我使用geom_段和arrow()来绘制箭头。有没有办法: 使箭头在到达圆圈之前停止 调整位置,以便在两个方向上都有箭头时,箭头“闪避”而不是重叠 我无法让position=“dodge”在这里做任何有用的事情 例如: library(ggplot2) points <- data.frame( x=runif(10), y=run

(注意-这是与相同的工作,但我提出了不同的问题)

我试图构建一个显示从一个类到另一个类的转换的图。我想用圆圈表示每个类,用箭头表示从一个类到另一个类的转换

我使用geom_段和arrow()来绘制箭头。有没有办法:

  • 使箭头在到达圆圈之前停止
  • 调整位置,以便在两个方向上都有箭头时,箭头“闪避”而不是重叠
我无法让position=“dodge”在这里做任何有用的事情

例如:

library(ggplot2)
points <- data.frame( x=runif(10), y=runif(10),class=1:10, size=runif(10,min=1000,max=100000) )
trans <- data.frame( from=rep(1:10,times=10), to=rep(1:10,each=10), amount=runif(100)^3 )
trans <- merge( trans, points, by.x="from", by.y="class" )
trans <- merge( trans, points, by.x="to", by.y="class", suffixes=c(".to",".from") )
ggplot( points, aes( x=x, y=y ) ) + geom_point(aes(size=size),color="red",shape=1) + 
    scale_size_continuous(range=c(4,20)) +
    geom_segment( data=trans[trans$amount>0.6,], aes( x=x.from, y=y.from, xend=x.to, yend=y.to ),lineend="round",arrow=arrow(),alpha=0.5, size=0.3)
库(ggplot2)

点我想既然没有人给出解决方案,我会提供一个针对此类问题的包的例子:

vecs  <- data.frame(vecs =1:6,size=sample(1:100,6))
edges <- data.frame(from=sample(1:6,9,replace=TRUE), to=sample(1:6,9,replace=TRUE))

library(igraph)

g      <- graph.data.frame(edges, vertices = vecs, directed = TRUE)
coords <- cbind(sample(1:20,6), sample(1:20,6))


plot(g, vertex.size=V(g)$size,vertex.color="white",layout=coords,axes=TRUE)

vecs我把geom_段的一个简单扩展放在一起,它允许指定

  • 在线路的起点和终点缩短
  • 对共享反向源和目标的行的偏移量
在这里的pastebin上:

我使用了如下代码:

ggplot( points, aes( x=x, y=y ) ) + geom_point(aes(size=size),color="red",shape=1) +
    scale_size_continuous(range=c(4,20)) + 
    geom_segment_plus( data=trans[trans$amount>0.3,], 
        aes( x=x.from, y=y.from, xend=x.to, yend=y.to ),
        lineend="round",arrow=arrow(length=unit(0.15, "inches")),
        alpha=0.5, size=1.3, 
        offset=0.01, shorten.start=0.03, shorten.end=0.03)
这绝对不是完美的,但它可以工作-你可以看到一个双箭头指向左下角的点

偏移量、shorten.start和shorten.end是添加的aes元素。它们可以设置为数据点,但我还没有弄清楚如何正确地缩放它们


有趣的问题。在ggplot中,如果不首先转换底层数据,这是不可能的,但我建议在其他地方使用。在R中制作这样的曲线箭头。虽然这仍然是一个复杂的绘图,但我可能建议在初始阶段分面绘制小倍数,因此每个面仅显示流出。2和5之间的曲线似乎是由于两个点之间指向同一方向的多条边造成的。出于某种原因,如果两条边的方向相反,autocurve.edges()似乎不会增加曲率(在这里你甚至可以看到2->5是直的)。有没有建议使用相同方向的重叠边缘强制弯曲?为“geom_segment_plus”的原始海报添加注释。这完美地解决了我遇到的一个问题,但这段代码似乎不能与ggplot 2.0的更改一起工作。有机会解决吗?我尝试使用您的代码,并得到:
eval中的错误({:找不到函数“eval”
我也从中找到了其他版本,但随后我得到:
geom_segment_plus中的错误(箭头=箭头(长度=单位(0.2,“cm”)),lineend=“round”,:尝试应用非函数