使用 ggplot2 绘制嵌套箱线图之间的中位数

问题描述 投票:0回答:1

我有一些数据,每个人要么“满意”,要么“不满意”。那么,每个人也有两种计算距离。我在绘制箱线图时没有任何问题。但是,我无法弄清楚如何在箱线图的两个中位数之间绘制一条线。

可复制代码:

group1.ids <- c('A123', 'B123', 'C123', 'D123')
Dis.data <- data.frame(id = rep(group1.ids), 
                       satisfaction = rep('Dissatisfied', 8), 
                       DistType = c(rep('A', 4), 
                                    rep('B', 4)), 
                       Dist = runif(8))
group2.ids <- c('E123', 'F123', 'G123', 'H123')
Sat.data <- data.frame(id = rep(group2.ids), 
                       satisfaction = rep('Satisfied', 8), 
                       DistType = c(rep('A', 4), 
                                    rep('B', 4)), 
                       Dist = runif(8))
data <- rbind(Dis.data, Sat.data)

ggplot(data) +
  geom_boxplot(mapping = aes(x = satisfaction, y = Dist, fill = DistType))

我想要这个:

r ggplot2 boxplot median ggboxplot
1个回答
0
投票

一种方法是将 x 轴转换为连续刻度。为此,我们首先将

factor
化您的
satisfaction
DistType
变量(如果需要,您可以使用此变量和
levels=
控制顺序),然后我们可以使用
geom_line
添加您的行。

data2 <- transform(data, satisfaction = factor(satisfaction), DistType = factor(DistType))
medians <- aggregate(Dist ~ DistType + satisfaction, data2, FUN = median) |>
  transform(x = as.numeric(satisfaction) + as.numeric(DistType)/3 - 0.5)
medians
#   DistType satisfaction      Dist         x
# 1        A Dissatisfied 0.2042941 0.8333333
# 2        B Dissatisfied 0.5780955 1.1666667
# 3        A    Satisfied 0.7128209 1.8333333
# 4        B    Satisfied 0.6022990 2.1666667

ggplot(data2) +
geom_boxplot(mapping = aes(x = as.numeric(satisfaction), y = Dist, fill = DistType, group = interaction(satisfaction, DistType))) +
scale_x_continuous(name = "Satisfaction", breaks = seq_along(levels(data2$satisfaction)), labels = levels(data2$satisfaction)) +
geom_line(aes(x = x, y = Dist, group = satisfaction), data = medians)

© www.soinside.com 2019 - 2024. All rights reserved.