2016-05-04 42 views
5

ここではいくつかの記事に基づいていくつかの提案を試みていますが、ggplot2のドキュメントを読んでいますが、解決策はまだありません。ここでgeom_pointとgeom_lineをggplot2のggplot2と組み合わせて2つのグループ化要因を組み合わせる

は、私が働いているのと同様の溶融したデータフレームを作成するためのコードの抜粋です:

a <- c(1,2,3,4,5,6,1,2,3,4,5,6) 
b <- c("loss", "draw", "win", "draw", "loss", "win", "loss", "draw", "win", "draw", "loss", "win") 
c <- c(2,3,5,4,4,5,4,4,3,5,2,4) 
d <- c(rep("x", 6), rep("y", 6)) 
temp <- data.frame(a,b,c,d) 
私が欲しいもの

はx軸にBとのドットプロットを作成することで、上のC y軸は、x軸上の点をdでグループ化し、その間の線はaでグループ化します。私たちはそうのようなグラフ上の点を入れて起動した場合、それが正常に出てくる:

ggplot(temp, aes(x=b, y=c, fill=d, colour=d))+ 
    geom_point(position=position_jitterdodge()) 

This is the dot plot I get, which is how I want it to look.ポイントがD因子に応じて色分けされ、しかもそれらはそのXので片側にjitterdodgedしています左はy、右はyです。

ここで、因子aにしたがって、点を線で結びつけたいだけです。それがどのように見えるべきかのThis is a mocked-up version I made in MS Paint。 geom_lineを追加してgeom_lineグループをaに設定すると、...

ggplot(temp, aes(x=b, y=c, fill=d, colour=d))+ 
    geom_point(position=position_jitterdodge())+ 
    geom_line(aes(group=a),position=position_jitterdodge()) 

...右から出ないです。それが作成する線は、正しい点を接続するのに適切な長さですが、それらはほとんど触らずにグラフ上に無作為に並んでいるように見えます。別のスクリーンショットを追加しますが、特権はまだありません。私はそうのような全体的な審美的であることが美的グループを変更した場合

また、:彼らは間違った位置にいるように

ggplot(temp, aes(x=b, y=c, fill=d, colour=d, aes(group=a)))+ 
    geom_point(position=position_jitterdodge())+ 
    geom_line(position=position_jitterdodge()) 

は...その後、ポイントが入れ替えされています。そして、いずれの場合でも、線はまだポイントと完全に合流しません。

position_jitterdodge()の部分にwidthとjitter.widthの値を指定しようとしましたが、線と点はまだ正しく結合されません。私はまた、ggplot2のドキュメント、いくつかの以前のstackoverflowの質問を読んで、position_jitter、position_dodge、geom_jitterなどのほとんどの組み合わせを試してみましたが、これまでの運はありません。

ご協力いただければ幸いです。

答えて

1

一つの可能​​な解決策は、 - てmanualyジッタ値を指定:

library(ggplot2) 

a <- c(1,2,3,4,5,6,1,2,3,4,5,6) 
# b <- c("loss", "draw", "win", "draw", "loss", "win", "loss", "draw", "win", "draw", "loss", "win") 
b <- c(2, 1, 3, 1, 2, 3, 2, 1, 3, 1, 2, 3) 
c <- c(2, 3, 5, 4, 4, 5, 4, 4, 3, 5, 2, 4) 
d <- c(rep("x", 6), rep("y", 6)) 
temp <- data.frame(a,b,c,d) 

set.seed(2016) 
jitterVal <- runif(12, max = 0.25) 
jitterVal <- jitterVal * ifelse(temp$d == "x", -1, +1) 

ggplot(temp, aes(x = b + jitterVal, y = c, fill = d, colour = d)) + 
    geom_point() + 
    geom_line(aes(group = a)) + 
    scale_x_continuous(breaks = c(1, 2, 3), labels = c("draw", "loss", "win")) + 
    xlab(NULL) + 
    expand_limits(x = c(0.5, 3.5)) 
+0

を設定します。毎回これを行うのは理想的ではありませんが、ポイントとラインをあちこちに持つよりもはるかに優れています。 – GFL

+1

これを関数に単純ラップすることができます。単純な 'jitterVal

1

をあなたがdbの間の相互作用を使用することができます。

p <- ggplot(temp, aes(x=interaction(d, b), y=c, fill=d, colour=d))+ theme_classic()+ 
    geom_point() 
p + geom_line(aes(group=a),colour=1) 

正しいx軸と。おかげで、これは完璧に動作数値にXを変換し、新しいラベル

p <- ggplot(temp, aes(x=as.numeric(interaction(d,b)), y=c, fill=d, colour=d))+ theme_classic()+ 
    geom_point() 
p <- p + geom_line(aes(group=a),colour=1) 
p + scale_x_continuous(breaks = c(1.5,3.5,5.5), labels = levels(temp$b)) 

enter image description here

+0

こんにちはジンボウ、これは素晴らしい答えです、ありがとうございました! 'p + scale_x_continuous(breaks = c(1.5、0));最後の行でd1 $ bをtemp $ bに変更して、x軸上のラベルを取得するコードを修正しました。 3.5,5.5)、labels = levels(temp $ b)) ' – GFL

+1

@GFLはそれを修正しました。ありがとう。 – Jimbou

関連する問題