如何使用函数在 geom_boxplot 中放置文本
How to use a function to place text in geom_boxplot
我正在绘制一些箱线图。这是一个工作示例:
data(mtcars)
# Compute means for each group
mpgmn <- aggregate(mpg ~ cyl, mtcars, mean)
mpgmn$mpg <- round(mpgmn$mpg, 2)
# Same thing for 50th and 75th %tiles
mpglims <- mtcars %>% group_by(cyl) %>%
summarize(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75))
# Plot
library(ggplot2)
g <- ggplot(mtcars, aes(x = as.factor(cyl), y = mpg,
fill = as.factor(cyl)))
g <- g + geom_boxplot()
g <- g + stat_summary(fun = mean, color = "white", geom = "point",
shape = 18, size = 3, show.legend = FALSE)
g <- g + geom_text(data = mpgmn,
aes(label = paste("mean = ", mpg),
y = mpg + 0.5), color = "white")
g
所有这些都有效。但是,我想使用我计算的 mpglims
(对我来说看起来是正确的)将白色文本放置在每个箱线图中(即,而不是当前的垂直位置参数:y = mpg + 0.05
) .有没有办法告诉 R 选择我为每个组计算的垂直位置的两个值之间的中间点?
最简单的方法可能是在 mpglims
:
的创建中再添加一个变量
mpglims <- mtcars %>% group_by(cyl) %>%
summarize(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75),
mid = (q50 + q75)/ 2)
在 geom_text()
调用的 y = mid
中使用 mid
。
如果你想使用你在第一个数据帧 mpgmn
中计算的结果,让你自己更容易一点并将其添加到 mpglims
,以及:
mpglims <- mtcars %>% group_by(cyl) %>%
summarize(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75),
mid = (q50 + q75)/ 2,
mmpg = mean(mpg) %>% round(., digits = 2))
它创建的内容与您的 aggregate()
调用相同。看看:
mpglims[, 5] %>% unlist()
# mmpg1 mmpg2 mmpg3
# 26.66 19.74 15.10
把 Kat 已经提供的所有信息(这个答案应该是公认的)和 OP 放在一起,这是一种可能的 tidyverse
方式:
library(tidyverse)
mtcars %>%
select(cyl, mpg) %>%
group_by(cyl = as.factor(cyl)) %>%
mutate(mpg_mean = round(mean(mpg, na.rm = TRUE),2)) %>%
mutate(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75)) %>%
mutate(mid = (q50 + q75)/ 2) %>%
ggplot(aes(x = cyl, y = mpg, fill = cyl)) +
geom_boxplot() +
stat_summary(fun = mean, color = "white", geom = "point",
shape = 18, size = 3, show.legend = FALSE) +
geom_text(aes(label = paste("mean = ", mpg_mean),
y = mid), color = "white")
我正在绘制一些箱线图。这是一个工作示例:
data(mtcars)
# Compute means for each group
mpgmn <- aggregate(mpg ~ cyl, mtcars, mean)
mpgmn$mpg <- round(mpgmn$mpg, 2)
# Same thing for 50th and 75th %tiles
mpglims <- mtcars %>% group_by(cyl) %>%
summarize(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75))
# Plot
library(ggplot2)
g <- ggplot(mtcars, aes(x = as.factor(cyl), y = mpg,
fill = as.factor(cyl)))
g <- g + geom_boxplot()
g <- g + stat_summary(fun = mean, color = "white", geom = "point",
shape = 18, size = 3, show.legend = FALSE)
g <- g + geom_text(data = mpgmn,
aes(label = paste("mean = ", mpg),
y = mpg + 0.5), color = "white")
g
所有这些都有效。但是,我想使用我计算的 mpglims
(对我来说看起来是正确的)将白色文本放置在每个箱线图中(即,而不是当前的垂直位置参数:y = mpg + 0.05
) .有没有办法告诉 R 选择我为每个组计算的垂直位置的两个值之间的中间点?
最简单的方法可能是在 mpglims
:
mpglims <- mtcars %>% group_by(cyl) %>%
summarize(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75),
mid = (q50 + q75)/ 2)
在 geom_text()
调用的 y = mid
中使用 mid
。
如果你想使用你在第一个数据帧 mpgmn
中计算的结果,让你自己更容易一点并将其添加到 mpglims
,以及:
mpglims <- mtcars %>% group_by(cyl) %>%
summarize(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75),
mid = (q50 + q75)/ 2,
mmpg = mean(mpg) %>% round(., digits = 2))
它创建的内容与您的 aggregate()
调用相同。看看:
mpglims[, 5] %>% unlist()
# mmpg1 mmpg2 mmpg3
# 26.66 19.74 15.10
把 Kat 已经提供的所有信息(这个答案应该是公认的)和 OP 放在一起,这是一种可能的 tidyverse
方式:
library(tidyverse)
mtcars %>%
select(cyl, mpg) %>%
group_by(cyl = as.factor(cyl)) %>%
mutate(mpg_mean = round(mean(mpg, na.rm = TRUE),2)) %>%
mutate(q50 = quantile(mpg, probs = 0.50),
q75 = quantile(mpg, probs = 0.75)) %>%
mutate(mid = (q50 + q75)/ 2) %>%
ggplot(aes(x = cyl, y = mpg, fill = cyl)) +
geom_boxplot() +
stat_summary(fun = mean, color = "white", geom = "point",
shape = 18, size = 3, show.legend = FALSE) +
geom_text(aes(label = paste("mean = ", mpg_mean),
y = mid), color = "white")