4

(注-これは、ggplotで複数のサイズのスケールを使用するのと同じ作業ですが、別の質問をしています)

あるクラスから別のクラスへの遷移を示すプロットを作成しようとしています。各クラスを表す円と、あるクラスから別のクラスへの遷移を表す矢印が必要です。

矢印を描画するために、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、shorten.start、shorten.endは、追加されたaes要素です。それらはデータポイントに設定できますが、適切にスケーリングする方法がわかりません。

ここに画像の説明を入力してください

于 2013-02-04T17:57:58.597 に答える