2016-06-14 40 views
5

y軸にパーセント表示のラベルを貼り付ける方法を探していますが、y軸は元のカウントを表示します(ggplotを使用)。ここでは、ラベルのないプロットのMWEは次のとおりです。R:ggplot積み重ね棒グラフ、y軸上のカウントがラベルとしての割合

library(ggplot2) 
df <- as.data.frame(matrix(nrow = 7, ncol= 3, 
         data = c("ID1", "ID2", "ID3", "ID4", "ID5", "ID6", "ID7", 
           "north", "north", "north", "north", "south", "south", "south", 
           "A", "B", "B", "C", "A", "A", "C"), 
         byrow = FALSE)) 

colnames(df) <- c("ID", "region", "species") 

p <- ggplot(df, aes(x = region, fill = species)) 
p + geom_bar() 

私は、はるかに大きなテーブルを持っており、Rは非常にうまく領域ごとに異なる種を数えます。ここでは、領域間の種の割合を比較するための元のカウント値(好ましくはy軸)とパーセンテージ(ラベル)を両方表示したいと思います。

私はgeom_text()を使用して多くのことを試してみたが、私は、彼らは、異なる種のほんの数です(他の質問(e.g. this one)との主な違いは、

  • は、私がyの値のために別の列を持っていないということだと思います地域ごとにラベルを必要とします(別々の集団を表すと考えられるため)100%までの合計が必要です。プロット全体のすべてのラベルではありません。

ご迷惑をおかけして申し訳ありません。

+5

標準以外の何かをしているときは、通常、自分で数値を計算する必要があります。 ggplotの中でこれを行うことは可能かもしれませんが、それは簡単ではありません。データ操作のために構築された関数を使用し、ggplot内でデータ操作を行う方がよい。 – Gregor

答えて

6

@Gregorが述べたように、データを別々に要約し、データサマリをggplotに送ります。以下のコードでは、我々はその場で要約を作成するためにdplyrを使用します。

library(dplyr) 

ggplot(df %>% count(region, species) %>% # Group by region and species, then count number in each group 
     mutate(pct=n/sum(n),    # Calculate percent within each region 
       ypos = cumsum(n) - 0.5*n), # Calculate label positions 
     aes(region, n, fill=species)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=paste0(sprintf("%1.1f", pct*100),"%"), y=ypos)) 

enter image description here

更新:dplyr 0.5以降で、あなたは、もはや中央にy値を提供する必要がありません各バー内のテキスト代わりにposition_stack(vjust=0.5)を使用できます。

ggplot(df %>% count(region, species) %>% # Group by region and species, then count number in each group 
     mutate(pct=n/sum(n)),    # Calculate percent within each region 
     aes(region, n, fill=species)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=paste0(sprintf("%1.1f", pct*100),"%")), 
      position=position_stack(vjust=0.5)) 
+1

ありがとう、これは私が探していたものです! – Johanna

+0

上記のコードでは、表示されているバープロットは作成されません。 'df%>%group_by(region)%>%count(region、species)%>%mutate(pct = n/sum(n)' –

+0

'group_by'コマンドにgroup_byコマンドを使用する必要があります。 'count(x、y)'は 'group_by(x、y)%>%tally'と等価です。 – eipi10

1

私はJohannaに同意します。試してみることができます:

d <- aggregate(.~region+species, df, length) 
d$percent <- paste(round(ID/sum(ID)*100),'%',sep='') 
ggplot(d, aes(region, ID, fill=species)) + geom_bar(stat='identity') + 
    geom_text(position='stack', aes(label=paste(round(ID/sum(ID)*100),'%',sep='')), vjust=5) 
+0

あなたのおかげでありがとうが、あなたの解決策ではスタックあたりのパーセンテージは100%にならない。 BTW:私はそれがd $パーセント< - ペースト(ラウンド(d $ ID /合計(d $ ID)* 100)、 '%'、sep = '') 'でなければならないと思います。 – Johanna

関連する問題