24

複数のボックスを示す箱ひげ図があります。各ボックスの平均を線でつなぎたい。箱ひげ図はデフォルトでは平均を表示しません。代わりに、中央の線は中央値のみを示します。私は試した

ggplot(data, aes(x=xData, y=yData, group=g)) 
    + geom_boxplot() 
    + stat_summary(fun.y=mean, geom="line")

これは動作しません。

興味深いことに、

stat_summary(fun.y=mean, geom="point") 

各ボックスに中央値を描画します。「ライン」が機能しないのはなぜですか?

このようなものですが、ggplot2を使用しています。http://www.aliquote.org/articles/tech/RMB/c4_sols/plot45.png

4

2 に答える 2

35

それはあなたが探しているものですか?

library(ggplot2)

x <- factor(rep(1:10, 100))
y <- rnorm(1000)
df <- data.frame(x=x, y=y)

ggplot(df, aes(x=x, y=y)) + 
geom_boxplot() + 
stat_summary(fun=mean, geom="line", aes(group=1))  + 
stat_summary(fun=mean, geom="point")

アップデート:

group = 1の設定に関するいくつかの説明:Hadley Wickhamの著書「 ggplot2:データ分析のためのエレガントなグラフィックス」で説明を見つけたと思います。51ページに彼は次のように書いています。

異なるレイヤー上の異なるグループ。

さまざまなレベルの集計に基づいて要約をプロットしたい場合があります。レイヤーが異なれば、グループの美学も異なる可能性があるため、個々のレベルのデータを表示するものもあれば、より大きなグループの要約を表示するものもあります。

前の例に基づいて、すべての男の子の年齢と身長に基づいて、作成したばかりのプロットに1本の滑らかな線を追加するとします。ラインに使用したのと同じグループ化をスムースに使用すると、図4.4の最初のプロットが得られます。

p + geom_smooth(aes(group = Subject)、method = "lm"、se = F)

これは私たちが望んでいたことではありません。男の子ごとに誤って滑らかな線を追加しました。この新しいレイヤーには、図の2番目のプロットに示すように、新しい線がすべてのデータに基づくように、異なるグループの美学、group=1が必要です。変更されたレイヤーは次のようになります。

p + geom_smooth(aes(group = 1)、method = "lm"、size = 2、se = F)

[...]スムーズレイヤーでaes(group = 1)を使用すると、すべての男の子に最適な1行に適合します。」

于 2010-10-21T18:23:41.213 に答える
1

もう1つのより長いアプローチ(データが2つの異なるデータにある場合)は次のとおりです。

library(dplyr); library(ggplot2)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

x <- factor(rep(1:10, 100)); y <- rnorm(1000);
df <- data.frame(x=x, y=y);
df_for_line <- df %>% group_by(x) %>% summarise(mean_y = mean(y));
ggplot(df, aes(x = x, y = y)) + geom_boxplot() + 
    geom_path(data = df_for_line, aes(x = x, y = mean_y, group = 1))

reprexパッケージ(v1.0.0)によって2021-04-15に作成されました


Again, `group = 1` is the key.
于 2020-04-14T20:50:25.873 に答える