2013-07-15 18 views
5

Ggplot2'de dolgu estetiği kullanarak iki grubun nispi oranlarını nasıl çizebilirim? Bu konuyla ilgili diğer bazı cevaplar (ex1, ex2 ve ex3) yanlış gibi çünküGgplot2'de dolgu estetiği kullanarak iki grubun nispi oranlarını nasıl çizebilirim?

Burada bu soruyu soruyorum ama Çapraz Onaylı işlevsel yasaklı R belirli sorular olması (CV meta) görünüyor. ..density.. kavramsal olarak ilişkilidir ancak oranlardan farklıdır (ex4 ve ex5). Yani doğru cevap yoğunluğu içermiyor gibi görünmüyor.

Örnek:

set.seed(1200) 
test <- data.frame(
    test1 = factor(sample(letters[1:2], 100, replace = TRUE,prob=c(.25,.75)),ordered=TRUE,levels=letters[1:2]), 
    test2 = factor(sample(letters[3:8], 100, replace = TRUE),ordered=TRUE,levels=letters[3:8]) 
) 
ggplot(test, aes(test2)) + geom_bar(aes(y = ..density.., group=test1, fill=test1) ,position="dodge") 
#For example, the plotted data shows level a x c as being slightly in excess of .15, but a manual calculation shows a value of .138 
counts <- with(test,table(test1,test2)) 
counts/matrix(rowSums(counts),nrow=2,ncol=6) 

ggplot2 (ggplot2 dışında bu hesaplama) kullanmayan bir çözeltiye correct tatil olan veya bir panel yerine kullanılmasını gerektirir bir çıkış elde etmek için görünmektedir cevap bir dolgu estetiği.

Düzenleme: Stat_bin'e kazmak, sonuçta çağrılan işlevin bin olduğunu gösterir, ancak bin yalnızca x aes içindeki değerleri geçirir. Stat_bin (veya başka bir stat_ yaparak) yeniden yazmadan, yukarıdaki başvurulan cevapta uygulanmış olan kesmek,veno'lu grupların yokluğunda, aşağıdakiler için aşağıdaki kod ile genelleştirilebilir: y = ..count../sapply(fill, FUN=function(x) sum(count[fill == x])). Bu sadece PANEL (dolgu ile mevcut olan gizli sütun) ile doldurulur). Muhtemelen diğer gizli değişkenler aynı tedaviyi alabilir.

+0

nasıl diyelim bir arsa gruba bölünmüş ve daha sonra paneller halinde cepheli, sahip olduğu bu durumlarda genelleştirildiğini? – RoyalTS

+0

@RoyalTS: Aynı sorunun geçerli olduğuna inanıyorum çünkü sorun ggplot2'de uygun bir stat_ fonksiyonunun olmaması (veya en azından olmaması). Ben ggplot2 ile bir drop-in olarak çalışan bir taslak çözüm yazdım ... ama ne kadar katı olduğundan emin değilim, bu yüzden onu göndermedim. – russellpierce

cevap

5

Bu aweful kesmek, ama ne istediğinizi yapmak gibi görünüyor ...

ggplot(test, aes(test2)) + geom_bar(aes(y = ..count../rep(c(sum(..count..[1:6]), sum(..count..[7:12])), each=6), 
            group=test1, fill=test1) ,position="dodge") + 
             scale_y_continuous(name="proportion") 
+4

+1, bir haykırmak hack olsa bile. Buraya gelmek için ..count .. temel veri yapısını nasıl belirlediniz? Bunun genel bir çözüm gibi görünen bir şeyle gelmenin anahtarı olduğunu bilmek. – russellpierce

İlgili konular