[英]Joining means on a boxplot with a line (ggplot2)
我有一個顯示多個框的箱線圖。 我想用一條線將每個框的平均值連接起來。 默認情況下,箱線圖不顯示平均值,而中間線僅表示中位數。 我試過了
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
這就是你要找的嗎?
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 頁他寫道:
不同層上的不同組。
有時我們想根據不同的聚合級別繪制摘要。 不同的圖層可能具有不同的組美學,因此一些圖層顯示個人級別數據,而其他圖層顯示較大組的摘要。
在前面的示例的基礎上,假設我們要根據所有男孩的年齡和身高,向剛剛創建的繪圖添加一條平滑線。 如果我們使用與直線相同的平滑分組,我們將得到圖 4.4 中的第一個圖。
p + geom_smooth(aes(group = Subject), method="lm", se = F)
這不是我們想要的; 我們無意中為每個男孩添加了一條平滑的線條。 這個新層需要一個不同的組美學,group = 1,這樣新線將基於所有數據,如圖中的第二個圖所示。 修改后的圖層如下所示:
p + geom_smooth(aes(group = 1), method="lm", size = 2, se = F)
[...] 在平滑層中使用 aes(group = 1) 適合所有男孩的最佳擬合線。”
另一種更長的方法(如果數據在兩個不同的數據幀中)是:
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 年 4 月 15 日創建
Again, `group = 1` is the key.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.