web-dev-qa-db-ja.com

グループごとに多くの観測値を追加し、ggplot2 boxplotでグループ平均を使用する方法は?

私は_y=ageおよびx=Patient groups

age <- ggplot(data, aes(factor(group2), age))  + ylim(15, 80) 
age + geom_boxplot(fill = "grey80", colour = "#3366FF")

私はあなたがいくつかのことで私を助けてくれることを望んでいました:

1)ペイントでこれを行うことなく、各グループボックスプロットの上にグループごとにいくつかの観測値を含めることができます(ただし、グループラベルがあるX軸ではありません)?私は使用してみました:

age + annotate("text", x = "CON", y = 60, label = "25")

ここで、CONは最初のグループであり、y = 60は、このグループの箱ひげ図のすぐ上にあります。ただし、コマンドは機能しませんでした。 xをカテゴリ変数ではなく連続変数として読み取ることが、何らかの処理があると思います。

2)また、箱ひげ図の中央値ではなく平均値を使用することについて多くの質問がありますが、私に役立つコードはまだ見つかりませんか?

3)同じ問題で、ボックスプロットに平均グループ統計を含める方法はありますか?おそらく

age + stat_summary(fun.y=mean, colour="red", geom="point")

ただし、平均値の位置のドットのみが含まれます。または再び使用

age + annotate("text", x = "CON", y = 30, label = "30")

ここで、CONは最初のグループであり、y = 30はグループの平均年齢です。柔軟性と豊かさを知るggplot2構文は、annotateではなく実際の統計出力を使用するよりエレガントな方法があることを望んでいました。

どんな提案/リンクも大歓迎です!

ありがとう!!

20
user1442363

これはあなたが望んでいるようなものですか? stat_summary、要求どおり:

# function for number of observations 
give.n <- function(x){
  return(c(y = median(x)*1.05, label = length(x))) 
  # experiment with the multiplier to find the perfect position
}

# function for mean labels
mean.n <- function(x){
  return(c(y = median(x)*0.97, label = round(mean(x),2))) 
  # experiment with the multiplier to find the perfect position
}

# plot
ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
  geom_boxplot(fill = "grey80", colour = "#3366FF") +
  stat_summary(fun.data = give.n, geom = "text", fun.y = median) +
  stat_summary(fun.data = mean.n, geom = "text", fun.y = mean, colour = "red")

黒の数字は観測数、赤の数字は平均値です。ジョランの答えは、ボックスの一番上に数字を置く方法を示しています enter image description here

hat-tip: https://stackoverflow.com/a/3483657/10365

31
Ben

これがあなたが探しているものだと思いますか?

myboxplot <- ddply(mtcars,
                    .(cyl),
                    summarise,
                    min = min(mpg),
                    q1 = quantile(mpg,0.25),
                    med = median(mpg),
                    q3 = quantile(mpg,0.75),
                    max= max(mpg),
                    lab = length(cyl))
ggplot(myboxplot, aes(x = factor(cyl))) + 
    geom_boxplot(aes(lower = q1, upper = q3, middle = med, ymin = min, ymax = max), stat = "identity") + 
    geom_text(aes(y = max,label = lab),vjust = 0)

enter image description here

あなたが平均について尋ねていたとき、私は誤って中央値を使用したことに気づきましたが、middle美学のためにどんな関数でも使用できることは明らかです。

17
joran

最初の問題に答えてください。ボックスの上に値を表示するには、レベル名としてではなく数値としてx値を指定する必要があります。したがって、最初の値より上の値をプロットするには、x=1

data(ToothGrowth)
ggplot(ToothGrowth,aes(supp,len))+geom_boxplot()+
   annotate("text",x=1,y=32,label=30)
3
Didzis Elferts