2013-10-17 17 views
5

İki değişkene bölünmüş 12 değişkenli bir grafiğim var. Yüzleri kullanamıyorum, ancak renk ve şekil kullanarak, görselleştirmeyi anlaşılması kolay hale getirdim. Ancak, örtüşen (kısmen veya tamamen) bazı noktalar vardır. Bunlarla uğraşmak için jitter kullanıyorum, ancak ekli grafikten de görebileceğiniz gibi, bu sadece tümüyle çakışan noktalara değil, etrafta taşınan tüm noktalara götürür. enter image description hereJitter in ggplot2 ile koşullu kullanımı geom_point

Koşullu olarak jitter veya dodge kullanmanın bir yolu var mı? Daha da iyisi, kısmen çakışan noktaları yan yana koymanın bir yolu var mı? Gördüğünüz gibi, x eksenim ayrı kategorilerdir ve sol/sağa hafif bir kayma önemli değildir. binaxis='y' ile dotplot kullanmayı denedim, ancak bu tamamen x eksenini bozuyor.

Düzenleme: This graph aradığım tam olarak ne yapmak başarmıştır.

Daha düzenleme: Bu görselleştirme arkasında kod ekleme.

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

Eğer ... diğerleri ile oynamak – agstudy

+0

Eklenen kod sağlamak için (veri + kodu), artırılabilir bir örnek sağlamalıdır. Umarım bu yardımcı olur :-) –

+1

Kod için teşekkürler. Not; Çizginiz biyomed örnek kadar temiz görünmeyecektir, çünkü Y değerleriniz her yerde olur, ancak yine de aşağıdaki sırayla x değerlerini sıralayabilirsiniz. – beroe

cevap

3

Ben önerebiliriz başkalarının merak ediyorum, ama yan-yana efekt elde etmek için, numaralar gibi önemli x ekseni kategoriler (10, 20, .. 50) kod olabilir artı/eksi bir Renk için kullandığınız kategorilere göre (0..10)/2 gibi küçük bir miktar. Böylece x eksenini 9.6, 9.8, 10.0, 10.2 ... ve sonra 20.0, 20.2, 20.4 olarak alabilirsiniz. Bu, bu kesirli ayarların rasgele olarak atanması yerine organize bir çizim oluşturabilir. İşte

veri-seti için bu fikri hızlı bir uygulamasıdır. Bu alt kategori variable altıda biri ana x değişken disciplines uzaklıklar ve kullandığı her bir kategori içindeki değerler eşit boyunca ve aynı aralıklı meydana, x değeri titreme ...

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) 

Not olmadan sipariş. (Bu kod şekilde gösterilen tüm eğri uydurma, vb içermez).

enter image description here

Varyasyon: Eğer y değerlerini "kuantize" eğer, daha da net yan arsa yan Onların o kadar fazla etkisini görebilirsiniz.

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

Sonra etkisini görmek için aes() açıklamada value yerine valmod kullanın. kategorisini almak için

elle scale_x_discrete seti, geri etiketler. Bu sürüm, daha geniş bir aralık için farklı ScaleFactor ve nicelenmiş y ekseni kullanır:

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

Titremede 'height = 0' kullanıyorum. Tüm noktaların dikey konumları doğrudan verilerden alınmıştır. Yanında başka bir veri noktası olmadığında bile yatay konumun nasıl değiştiğini sevmiyorum. –

+0

Bu harika görünüyor! Fakat ...Orijinal kategori adlarını sayısal değerler yerine x ekseninde geri almanın bir yolu var mı? –

+0

Evet, "okuyucu için bir alıştırma" idi ama onu ekledim ... Bu "üniforma titreşimini" ggplot2 tabanına eklediğimi görmek istiyorum. Belki de Ruşus'un bir kısmı da başka bir yaklaşıma sahip olacaktı. – beroe

İlgili konular