25

ExperimentCohort要因によって識別される学生の 3 つのコホートがあります。学生ごとにLetterGrade、要因もあります。LetterGradefor eachのヒストグラムのような棒グラフをプロットしたいと思いますExperimentCohort。使用する

ggplot(df, alpha = 0.2, 
       aes(x = LetterGrade, group = ExperimentCohort, fill = ExperimentCohort))                                                                                                                                                       
  + geom_bar(position = "dodge")

とても親しくなりましたが、この 3ExperimentCohorts校の生徒数は同じではありません。これらをより均等なフィールドで比較するには、y 軸を各文字グレードのコホート内の割合にしたいと思います。これまでのところ、この比率を計算してプロットする前に別のデータフレームに入れる以外は、これを行う方法を見つけることができませんでした。

SO および他の場所での同様の質問に対するすべての解決策には が含まれますaes(y = ..count../sum(..count..))が、 sum(..count..) は各コホート内ではなくデータフレーム全体で実行されます。誰か提案がありますか?サンプル データフレームを作成するコードは次のとおりです。

df <- data.frame(ID = 1:60, 
        LetterGrade = sample(c("A", "B", "C", "D", "E", "F"), 60, replace = T),
        ExperimentCohort = sample(c("One", "Two", "Three"), 60, replace = T))

ありがとう。

4

3 に答える 3

24

間違った解決策

とを使用stat_bin()y=..density..て、各グループのパーセンテージを取得できます。

ggplot(df, alpha = 0.2,
      aes(x = LetterGrade, group = ExperimentCohort, fill = ExperimentCohort))+
      stat_bin(aes(y=..density..), position='dodge')

更新 - 正しい解決策

@rpierceが指摘したようy=..density..に、パーセンテージではなく各グループの密度値を計算します(それらは同じではありません)。

パーセンテージで正しい解を得る方法の 1 つは、プロットする前にパーセンテージを計算することです。このためddply()に library の関数を使用しましplyrた。関数を使用して計算された各ExperimentCohort比率で、 として保存します。と戻ってきました。prop.table()table()propnames()table()LetterGrade

df.new<-ddply(df,.(ExperimentCohort),summarise,
              prop=prop.table(table(LetterGrade)),
              LetterGrade=names(table(LetterGrade)))

 head(df.new)
  ExperimentCohort       prop LetterGrade
1              One 0.21739130           A
2              One 0.08695652           B
3              One 0.13043478           C
4              One 0.13043478           D
5              One 0.30434783           E
6              One 0.13043478           F

この新しいデータ フレームをプロットに使用します。比率はすでに計算されているため、それらを値として指定し、内にy追加します。stat="identity"geom_bar

ggplot(df.new,aes(LetterGrade,prop,fill=ExperimentCohort))+
  geom_bar(stat="identity",position='dodge')

ここに画像の説明を入力

于 2013-06-28T15:33:18.713 に答える
9

weight各グループの合計が 1 になる列を作成して、これを行うこともできます。

ggplot(df %>%
         group_by(ExperimentCohort) %>%
         mutate(weight = 1 / n()),
       aes(x = LetterGrade, fill = ExperimentCohort)) +
  geom_histogram(aes(weight = weight), stat = 'count', position = 'dodge')
于 2018-03-29T20:29:43.350 に答える
1

最近これを試みたところ、ddply: の呼び出しでエラーが発生しましたColumn prop must be length 1 (a summary value), not 6。ddply でしばらく時間を費やしましたが、解決策をうまく機能させることができなかったので、別の方法を提案します (これはまだ を使用していることに注意してくださいplyr)。

df.new <- df2 %>% 
    group_by(ExperimentCohort,LetterGrade) %>% 
    summarise (n = n()) %>%
    mutate(freq = n / sum(n))

次に、@didzis-elferts が述べたようにプロットできます。

ggplot(df.new,aes(LetterGrade,freq,fill=ExperimentCohort))+
    geom_bar(stat="identity",position='dodge')
于 2017-08-23T14:15:14.127 に答える