2012-02-27 7 views
7

私は私はそれがプロパティを以下ているように、次のようなグラフを作成するプロット相互作用は、(データ点の数が非常に多いが)

# property data 
name <- c("A", "B", "C", "D") 
diameter <- c(4.3, 8.3,1.2, 3.3) 
X <- c(1, 2, 3, 4) 
Y <- c(1, 3, 3, 4) 
colr <- c(10, 20, 34, 12) 
propdata <- data.frame (name, diameter, X, Y, colr) 


# interaction data 
name1 <- c("A", "A", "A", "B", "B") 
name2 <- c("B", "C", "D", "C", "D") 
score <- c(1.1, 2.2, 5.4, 3.1, 2.0) 
relation <- data.frame (name1, name2, score) 

次のデータ・タイプを持っているグラフ。

1) diameter of circles is governed by propdata$diameter 
(2) Position in xy field is governed by cordinates of propdata$X and propdata$y 
(3) Fill color of the circle is controlled by propdata$colr 
(4) Interaction is governed by relation data.frame, name1 
    and name2 elements will be connected and weight of the line is govenmened 
    by relation$score. 

enter image description here

それは既存のRベースまたは任意の一般的なグラフィックソフトウェアを使用して、このようなグラフを作る以上の特別なソフトウェアを必要とすることは可能です

EDITS:。

これはバブルプロットを使用する限りです:

p <- ggplot(propdata, aes(X,Y,size = diameter, label=name)) 
p <- p + geom_point(colour= "red")+geom_text(size=3) # colour = colr does not work 
p 

enter image description here

+0

答えははいです。何を試しましたか? – Andrie

+0

私はggplot2を使ってみました。使用したgeom_point()は、バブルのサイズをフレームにするだけで、接続方法はわかりません。 – jon

+0

@Andrieは私の編集内容を見ています。 。 – jon

答えて

5

は私がqgraphですぐに調理ものです:

library("qgraph") 

plot(1,type='n',xlim=c(min(propdata$X)-0.5, 
    max(propdata$Y)+0.5),ylim=c(min(propdata$Y)-0.5,max(propdata$Y)+0.5), 
    xlab="",ylab="") 

col <- rgb(0,1-propdata$colr/max(propdata$colr),0) 

qgraph(relation,plot=FALSE,rescale=FALSE,layout=as.matrix(propdata[c("X","Y")]), 
     edge.color="darkred",color=col,propdata$colr,directed=FALSE,esize=10, 
     vsize=propdata$diameter+2,lcolor="white",curve=c(0,0,-0.2,0,0)) 

enter image description here

+0

お返事ありがとうございました....それはかなりいいです!!私はqgraphのWebページhttps://sites.google.com/site/qgraphproject/examplesを見ました...これはかなりいいです... – jon

+0

+1とてもいいです。学ぶ新しいことのリストはその日までに増えています。 – Andrie

+0

ありがとう!ノードの位置が重要でない場合は、代わりに強制埋め込みアルゴリズムを使用します。また、エッジのためのデフォルトの色がうまく動作しますが、緑色です:) –

3

ので、問題は相互作用を表す折れ線グラフを作成しています。

これを行うには、適切な形式でデータをフォーマットする必要があります。あなたは、セグメントをプロットしたい、そしてこのために、あなたのデータフレーム内の単一の行の各セグメントの座標を必要とする:

interaction <- merge(propdata, relation, by.x="name", by.y="name1") 
interaction <- cbind(interaction, 
       merge(propdata, relation, by.x="name", by.y="name2")[, c("X", "Y")]) 
names(interaction)[8:9] <- c("Xend", "Yend") 
interaction 

    name diameter X Y colr name2 score Xend Yend 
1 A  4.3 1 1 10  B 1.1 2 3 
2 A  4.3 1 1 10  C 2.2 3 3 
3 A  4.3 1 1 10  D 5.4 3 3 
4 B  8.3 2 3 20  C 3.1 4 4 
5 B  8.3 2 3 20  D 2.0 4 4 

今は別の問題に遭遇します。 ggplot2には、単一のサイズの縮尺しかありません。ポイントとラインの両方に大きさの引数があるので、実際には2つのことを表していますが、これは回避策なしでは実行できません。

したがって、回避策はgeom_polygonを使用して手動で円を描くことです。

円とのデータフレームを構築:

最後に
circle <- function(x, y, d, color, scale=1){ 
    d <- d * scale 
    angle <- seq(-pi, pi, length = 50) 
    data.frame(
    x = x + d/2*sin(angle), 
    y = y + d/2*cos(angle), 
    color=color) 
} 

circles <- ddply(propdata, .(name), 
       function(x)with(x, circle(X, Y, diameter, colr, scale=0.2))) 

、プロットを作成します。ここでは

ggplot() + 
    geom_polygon(data=circles, aes(group=name, x=x, y=y, fill=color)) + 
    geom_text(data=propdata, aes(x=X, y=Y, label=name), hjust=0, vjust=0) + 
    geom_segment(data=interaction, aes(x=X, y=Y, xend=Xend, yend=Yend, size=score)) + 
    scale_size("Inter", to=c(0, 5)) + 
    coord_equal() 

enter image description here

+0

助けてくれた@BrianDiggsに功績を持つ。 – Andrie

+0

かなりいいです...私はラベルを円の中心からちょっと遠くに置いておきたいと思っています...答えに感謝します... – jon

+0

また、時には大胆になって有益ですが、かなり..答えに感謝しています... – jon

関連する問題