2013-10-17 33 views
5

12変数を2つのグループに分けたグラフがあります。私はファセットを使用することはできませんが、色と形を使用して、私は視覚化を容易に理解することができました。ただし、一部または全部が重複する点があります。私はこれらを処理するためにジッタを使用していますが、添付のグラフからわかるように、オーバーラップしているポイントだけでなく、すべてのポイントが移動しています。 enter image description heregeom_pointを使ったggplot2でのジッタの条件付き使用

条件付きでジッタやドッジを使用する方法はありますか?さらに、部分的に重複する点を並べて配置する方法はありますか?ご覧のように、私のx軸は離散的なカテゴリーで、左右へのわずかなシフトは関係ありません。私はbinaxis='y'とドットプロットを使ってみましたが、それは完全にx軸を台無しにします。

編集:This graphは、私が探しているものとまったく同じように管理しています。

さらに編集:この視覚化の背後にあるコードを追加する。

disciplines <- c("Comp. Sc.\n(17.2%)", "Physics\n(19.6%)", "Maths\n(29.4%)", "Pol.Sc.\n(40.4%)", "Psychology\n(69.8%)") 

# To stop ggplot from imposing alphabetical ordering on x-axis 
disciplines <- factor(disciplines, levels=disciplines, ordered=T) 

# involved aspects 
intensive <- c(0.660, 0.438, 0.515, 0.028, 0.443) 
comparative <- c(0.361, 0.928, 0.270, 0.285, 0.311) 
wh_adverbs <- c(0.431, 0.454, 0.069, 0.330, 0.577) 
past_tense <- c(0.334, 0.229, 0.668, 0.566, 0.838) 
present_tense <- c(0.680, 0.408, 0.432, 0.009, 0.996) 
conjunctions <- c(0.928, 0.207, 0.162, -0.299, -0.045) 
personal  <- c(0.498, 0.521, 0.332, 0.01, 0.01) 
interrogative <- c(0.266, 0.202, 0.236, 0.02, 0.02) 
sbj_objective <- c(0.913, 0.755, 0.863, 0.803, 0.913) 
possessive <- c(0.896, 0.802, 0.960, 0.611, 0.994) 
thrd_person <- c(-0.244, -0.265, -0.310, -0.008, -0.384) 
nouns  <- c(-0.602, -0.519, -0.388, -0.244, -0.196) 

df1 <- data.frame(disciplines, 
       "Intensive Adverbs"=intensive, 
       "Comparative Adverbs"=comparative, 
       "Wh-adverbs (WRB)"=wh_adverbs, 
       "Verb: Past Tense"=past_tense, 
       "Verb: Present Tense"=present_tense, 
       "Conjunctions"=conjunctions, 
       "Personal Pronouns"=personal, 
       "Interrogative Pronouns"=interrogative, 
       "Subjective/Objective Pronouns"=sbj_objective, 
       "Possessive Pronouns"=possessive, 
       "3rd-person verbs"=thrd_person, 
       "Nouns"=nouns, 
       check.names=F) 

df1.m <- melt(df1) 
grp <- ifelse(df1.m$variable %in% c('3rd-person verbs','Nouns'), 'Informational Features', 'Involved Features') 
g <- ggplot(df1.m, aes(group=grp, disciplines, value, shape=grp, colour=variable)) 
g <- g + geom_hline(yintercept=0, size=9, color="white") 
g <- g + geom_smooth(method=loess, span=0.75, level=0.95, alpha=I(0.16), linetype="dashed") 
g <- g + geom_point(size=4, alpha=I(0.7), position=position_jitter(width=0.1, height=0)) 
g <- g + scale_shape_manual(values=c(17,19)) 
+0

あなたは...他の人がそれで遊ぶようにする – agstudy

+0

追加コードを再現性の例(データ+コード)を提供する必要があります。うまくいけば、これは役に立ちます:-) –

+1

コードをありがとう。 P.S.あなたのY値はすべての場所にあるので、あなたのプロットは生物学的な例ほどきれいには見えませんが、x値は、下にの順に並んでいます。 – beroe

答えて

3

私が提案するかもしれないものを他の人好奇心旺盛ですが、サイド・バイ・サイド効果を得るために、あなたは、数字などの主要なx軸カテゴリ(10、20、... 50)をコーディングすることができ、プラス/マイナス色に使用しているカテゴリに基づいて(0..10)/ 2のような少量です。だから、X軸を9.6,9.8,10.0,10.2、そして20.0,20.2,20.4とすることができます。これにより、分数調整をランダムに割り当てるのではなく、組織化されたプロットが作成される可能性があります。

ここでは、データセットに対するそのアイデアを簡単に実装します。これは、各カテゴリ内の値が均等に同じ横切っとに離間発生することを注意

M = df1.m 
ScaleFactor = 6 
xadj = as.numeric(M$variable)/ScaleFactor 
xadj = xadj - mean(xadj) # shift it to center around zero 
x10 = as.numeric(M$disciplines) * 10 
M$x = x10 + xadj 
g = ggplot(M, aes(group=grp, x, value, shape=grp, colour=variable)) 
g + geom_point(size=4,alpha=I(0.7)) + scale_x_discrete(breaks=x10,labels=disciplines) 

...サブカテゴリvariableの1/6メインx変数disciplinesを相殺し、x値ジッタなしていることを利用し注文。 (このコードには、図に示されているすべてのカーブフィッティングなどは含まれていません)。

enter image description here

バリエーション:あなたのyの値を「量子化」場合は、さらに明確に並んでプロット側ので、それらの多くの効果を見ることができます。

M$valmod = M$value - M$value %% 0.2 + .1 

そして、効果を確認するためにaes()文でvalueの代わりにvalmodを使用しています。

カテゴリラベルを戻すには、手動でscale_x_discreteと設定します。このバージョンでは、より広範な間隔と量子化されたy軸に対して異なるScaleFactorを使用しています。

M=df1.m 
ScaleFactor = 3 
# Note this could just be xadj instead of adding to data frame 
M$xadj = as.numeric(M$variable)/ScaleFactor 
M$xadj = M$xadj - mean(M$xadj) # shift it to center around zero 
M$x10 = as.numeric(M$disciplines) * 10 
M$x = M$x10 + M$xadj 

Qfact = 0.2 # resolution to quantize y values 
M$valmod = M$value - M$value %% Qfact + Qfact/2 # clump y to given resolution 

g = ggplot(M, aes(group=grp, x, valmod, shape=grp, colour=variable)) + 
    scale_x_discrete(limits = M$x10, breaks=unique(M$x10),labels=levels(M$disciplines)) 
g + geom_point(size=3,alpha=I(0.7)) 

quantized

+0

ジッタで 'height = 0'を使用しています。すべての点の垂直位置はデータから直接得られます。私はちょうどその近くに他のデータポイントがない場合でも水平位置がどのようにシフトされるのか好きではありません。 –

+0

これは素晴らしいですね!しかし...数値の代わりに元のカテゴリ名をx軸に戻す方法はありますか? –

+0

これは「読者のための練習」でしたが、私はそれを追加しました。この「均一なジッタ」がベースggplot2に追加されたことを確認したいと思います。多分、Rの達人の中には別のアプローチもあるだろう。 – beroe

関連する問題