2012-07-19 16 views
10

arasındaki toplamlık Bir çubuk grafiğe, bir kasa içinde , bu kovaya düşen gözlemlerin yüzdesiyle açıklama eklemeye çalışıyorum. Bu soru, bu soruyla çok yakından ilişkilidir: Show % instead of counts in charts of categorical variables, ancak fasonun tanıtımı bir kırışıklık ortaya çıkarır. İlgili sorunun cevabı metin geom w/stat_bin kullanmaktır ve sonra etiket böylece olarak inşa edilecek olan: Bu bir un yönlü arsa için çalışıyorDurum a .. sayısı .. üretim faktörü

stat_bin(geom="text", aes(x = bins, 
     y = ..count.., 
     label = paste(round(100*(..count../sum(..count..)),1), "%", sep="") 
     ) 

. Bununla birlikte, fasetlerle, bu toplam (.. sayısı ..), fasetlere bakılmaksızın gözlemlerin tüm koleksiyonu üzerinde toplanıyor. Aşağıdaki çizim meseleyi göstermektedir --- yüzdeler bir panel içinde% 100'lük toplamı olmadığını unutmayın. İşte

enter image description here

Yukarıdaki şekil için aslında kod:

g.invite.distro <- ggplot(data = df.exp) + 
geom_bar(aes(x = invite_bins)) + 
facet_wrap(~cat1, ncol=3) + 
stat_bin(geom="text", aes(x = invite_bins, 
     y = ..count.., 
     label = paste(round(100*(..count../sum(..count..)),1), "%", sep="") 
     ), 
     vjust = -1, size = 3) + 
    theme_bw() + 
scale_y_continuous(limits = c(0, 3000)) 

GÜNCELLEME:

df <- data.frame(x = c('a', 'a', 'b','b'), f = c('c', 'd','d','d')) 
ggplot(data = df) + geom_bar(aes(x = x)) + 
stat_bin(geom = "text", aes(
     x = x, 
     y = ..count.., label = ..count../sum(..count..)), vjust = -1) + 
facet_wrap(~f) 

enter image description here

: İsteğe göre, burada konuyu yeniden üreten küçük bir örnek
+1

İlginç bir soru, bir yanıt alma olasılıklarının daha fazla olurdu. –

+0

Üzgünüm - bunu yapmış olmalıydı. Şimdi bir örnek var. –

+0

Bu problemle de karşı karşıyayım, ggplot bunu hallederse harika olur ... –

cevap

11

Updageom_bar, stat = identity gerektirir.

Bazen ggplot çağrısının dışında özetlerin alınması daha kolaydır. Bize hatayı yeniden veri verdiyse

df <- data.frame(x = c('a', 'a', 'b','b'), f = c('c', 'd','d','d')) 

# Load packages 
library(ggplot2) 
library(plyr) 

# Obtain summary. 'Freq' is the count, 'pct' is the percent within each 'f' 
m = ddply(data.frame(table(df)), .(f), mutate, pct = round(Freq/sum(Freq) * 100, 1)) 

# Plot the data using the summary data frame 
ggplot(data = m, aes(x = x, y = Freq)) + 
    geom_bar(stat = "identity", width = .7) + 
    geom_text(aes(label = paste(m$pct, "%", sep = "")), vjust = -1, size = 3) + 
    facet_wrap(~ f, ncol = 2) + theme_bw() + 
    scale_y_continuous(limits = c(0, 1.2*max(m$Freq))) 

enter image description here