4

(注意 - 这与在 gg​​plot 中使用多个尺寸比例相同,但我问的是不同的问题)

我正在尝试构建一个显示从一个类到另一个类的转换的图。我想要代表每个班级的圆圈,以及从一个班级到另一个班级的箭头代表过渡。

我正在使用 geom_segment 和 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)

示例图

4

2 回答 2

4

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

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)

这至少会在圆圈问题之前解决你的箭头,并且当有倒数箭头时,它会用曲线调整它们,如下所示2<->5

在此处输入图像描述

(当然可以修改箭头大小、线宽、颜色等)

于 2013-02-02T22:02:49.947 回答
3

我整理了 geom_segment 的一个简单扩展,它允许指定

  • 在行首和行尾缩短
  • 抵消共享反向源和目标的线的数量

它在 pastebin 上:geom_segment_plus

我使用了以下代码:

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)

这绝对不是完美的,但它确实有效——你可以看到一个双箭头指向左下角。

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

在此处输入图像描述

于 2013-02-04T17:57:58.597 回答