2012-06-04 14 views
6

各ファセットの合計が100%であることを除いて、このようなプロットが必要です。今のグループMは、0.20 + 0.80 = 1.00ではなく、0.05 + 0.25 = 0.30である。ggplot:2つのグループの相対頻度

df <- rbind(
    data.frame(gender=c(rep('M',5)), outcome=c(rep('1',4),'0')), 
    data.frame(gender=c(rep('F',10)), outcome=c(rep('1',7),rep('0',3))) 
) 

df 

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 

(Y = ..densityを使用..悪い結果を与える)

+0

正しい方法です。 ..density ..メソッドは他の多くの回答で提供されています。 http://stackoverflow.com/questions/10064080/plot-relative-frequencies-with-dodged-bar-plots-in-ggplot2、http:// stackoverflow。 com/questions/17368223/ggplot2-multi-group-histogram-with-in-group-proportion-頻度よりもむしろhttp://stackoverflow.com/questions/3695497/ggplot-showing-instead-of-counts-カテゴリ内のチャート内の変数は、変化する度合いが不正確な値を生成します。 – russellpierce

答えて

9

Iは、通常、単にggplot2外の値を事前計算し、stat = "identity"を使用することによってこれを行う。

df1 <- melt(ddply(df,.(gender),function(x){prop.table(table(x$outcome))}),id.vars = 1) 

ggplot(df1, aes(x = variable,y = value)) + 
    facet_wrap(~gender, nrow=2, ncol=1) + 
    geom_bar(stat = "identity") 
+0

これは正しいです。私は、比較的一般的な種類のグラフのように思われるものについて、より簡単な答えを期待しています。 :) – Andrew

+0

@andrew - 私はこれをやっています* alot *。独自の 'geom'を作るのは比較的簡単です。これはggplot2用の組み込みツールに非常に役立つでしょう。 – Chase

+0

@Chase私は間違っているかもしれませんが、ファセットが行われる前に、美学が変数にマッピングされているので、新しい幾何学以上のものが必要になると思います。だから私はこれが幾何学の上流の設計特徴の方法かもしれないと思う。 – joran

16

ここに別の方法があります

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = ..count../sapply(PANEL, FUN=function(x) sum(count[PANEL == x])))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 
+1

どのような楽しいハック! – joran

+0

私はこれがどのように短いのが好きですが、ファセットから位置=ドッジに切り替えるときに、高さはすべてのグループ(グループ内ではなく)に対して100%になります – Andrew

+0

私はもっとアップアップできることを願っています。 – Eduardo