簡體   English   中英

用一條線(ggplot2)在箱線圖上加入意味着

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM