2016-07-18 21 views
1

私は以下のboxplotを持っており、カウントをテキストにしたいと考えています。stat_summaryを変更してボックスプロットの分布数を表示する

group = c(rep(c(1,2,1),100) ) 
group2 = rep(c("A","B","B"),100) 
r = rnorm(300,50,63) 
d = data.frame( group = group, r = r , group2 = group2) 
head(d) 
custom= function (x){ 
    q = quantile(x) 
    return(  c(q[1],q[3],q[5]) )} 

ggplot(data = d, aes(factor(group), r)) + 
    geom_boxplot() + 
    stat_summary(geom="text", fun.y=custom, 
       aes(label=sprintf("%1.0f", ..y..)), 
       position=position_nudge(x=0.33), size=3)+ 
    geom_text(data=  data.frame(x = unique(as.factor(group)) , y = quantile(r[group])[3], label= paste0("N=", length(r)) ), 
      aes(x,y,label=label),inherit.aes = FALSE)+ 
    facet_wrap(~group2) 

enter image description here

現在のカウントは、各ボックスプロットでも同じです。どのように私はそれを正確に各ボックスプロットのカウントを反映するようにし、boxplotがない場合には印刷しませんgroup2 = Aボックスプラスはありませんが、カウントはまだ印刷されていますか?

ありがとうございます。

答えて

1

私の答えは2部あります。最初のものは元の非ファセットの答えです。 2番目はファセットの答えです。

パートI

library(ggplot2) 
group = c(rep(c(1,2),100) ) 
r = rnorm(200,50,63) 
d = data.frame( group = group, r = r ) 
head(d) 

p <- 
ggplot(data = d, aes(factor(group), r)) + 
    geom_boxplot() + 
    stat_summary(geom="text", fun.y=quantile, 
       fun.args=list(probs=c(0,.5,1)), 
       aes(label=sprintf("%1.0f", ..y..)), 
       position=position_nudge(x=0.33), size=3) 

lb <- paste("N = ", as.character(length(group[group==1]))) 
lb2 <- paste("N = ", as.character(length(group[group==2]))) 

p <- p + annotate("text", x = 1, y = 40, label = lb) 
p + annotate("text", x = 2, y = 40, label = lb2) 

これはそれのためのチャートで最高の場所で、そうでないと言うだれでも*愚か者です。

enter image description here

*冗談。主観的です。

パートII

我々がannotateでこれを行うことはできませんが、我々はgeom_textでこれを行うことができそうです。私は時間が少し短いですが、私はあなたの道の99%を取得する必要があります(しかし、調整する必要があります)と私はあなたに関連する回答へのリンクを与えるテンプレートを与えるでしょう。

また、後で戻って、以下のコードを調整します。

group = c(rep(c(1,2),100) ) 
group2 = rep(c("A","B"),100) 
r = rnorm(200,50,63) 
d = data.frame( group = group, r = r , group2 = group2) 
head(d) 
custom= function (x){ 
    q = quantile(x) 
    c = length(x) 
    return(  c(q[1],q[3],q[5], q[5]*1.1) )} 


ggplot(data = d, aes(factor(group), r)) + 
    geom_boxplot() + 
    stat_summary(geom="text", fun.y=custom, 
       aes(label=sprintf("%1.0f", ..y..)), 
       position=position_nudge(x=0.33), size=3)+ 
    facet_wrap(~group2) 

label <- as.character() 
for(i in unique(group)){ 
    label[i] <- as.character(paste("N = ", length(group[group == i]))) 
} 

data=data.frame(x=1.1, y=1.5e+02, label=label, group2 = c("A", "B")) 

p + geom_text(data=data, 
       aes(data$x,data$y,label=data$label), inherit.aes=FALSE) 

Using annotate to add different annotations to different facets

+0

が、その溶液は、手動でアノテーションのxとyの値を設定する必要があります。私は、10,20または30のボックスプロットが存在する可能性があるため、再コード化する必要のないソリューションを探しています。私の場合は、ファセットも使用しています。ファセットを使ってコードを更新します。 – user3022875

+0

@ user3022875私に30ボックスプロットの例を与えることができるなら、それを管理する方法の例を与えることができます –

+0

ファセットを使って2つのプロットで1 boxplotを持つ上記の例を参照してください – user3022875

関連する問題