R 中的子组箱线图

Subgroup Boxplots in R

我正在尝试制作一个可以并排显示三件事的图形。首先是显示个人随时间的变化。接下来是显示他们的同龄人群体随时间的变化。最后是显示总人口随时间的变化。

我每次观察都有四个时间点。我想看到的是两组相邻的箱线图,一组用于同龄人组,一组用于总体。叠加在其中每一个上的将是给定个人的数据点。每组将显示时间 1、时间 2、时间 3 和时间 4 的数据。重叠的点会传达每个人在每个时间的位置,因此可以在两组箱线图中传达信息。

这是模拟我正在使用的数据类型的代码,以及我创建绘图的无效尝试。

peer <- c(rep(1, 15), rep(2, 41))
year <- rep(c(1, 2), 28)
pct <- rep(1:8, 7)
dat <- data.frame(cbind(peer, year, pct))

ggplot(dat, aes(peer==1, pct)) + geom_boxplot() + facet_grid(. ~ year)

我不认为我的 ggplot 方法接近正确。请帮忙!

这是我正在尝试做的事情的草图。

这与您的想法接近吗?每个 year 的每个 peer 值都有一个箱线图。我还包括了每组的平均值。

# Boxplots for each combination of year and peer, with means superimposed
ggplot(dat, aes(year, pct, group=interaction(year,peer), colour=factor(peer))) + 
  geom_boxplot(position=position_dodge(width=0.4), width=0.4) +
  stat_summary(fun.y=mean, geom="line", position=position_dodge(width=0.4), 
               aes(group=peer)) +
  stat_summary(fun.y=mean, geom="point", position=position_dodge(width=0.4), size=4, 
               aes(group=peer)) +
  scale_x_continuous(breaks=unique(dat$year)) 

您可以添加人口箱线图,但随后该图开始显得混乱:

# Add population boxplot (not grouped by peer)
ggplot(dat, aes(year, pct, group=interaction(year,peer), colour=factor(peer))) + 
  geom_boxplot(aes(group=year), width=0.05, colour="grey60", fill="#FFFFFF90") +
  geom_boxplot(position=position_dodge(width=0.4), width=0.2) +
  stat_summary(fun.y=mean, geom="line", position=position_dodge(width=0.4), 
               aes(group=peer)) +
  stat_summary(fun.y=mean, geom="point", position=position_dodge(width=0.4), size=4, 
               aes(group=peer)) +
  scale_x_continuous(breaks=unique(dat$year))

更新: 根据您的评论,可能是这样的:

# Add an ID variable to the data
dat$id = rep(1:(nrow(dat)/2), each=2)

library(gridExtra) # For grid.arrange function

pdf("plots.pdf", 7, 5)
for (i in unique(dat$id)) {
  p1 = ggplot() +
    geom_boxplot(data=dat[dat$peer==unique(dat$peer[dat$id==i]),],
                 aes(year, pct, group=year)) +
    geom_point(data=dat[dat$id==i,], aes(year, pct), 
               pch=8, colour="red", size=5) +
    ggtitle("Your Peers")

  p2 = ggplot() +
    geom_boxplot(data=dat, aes(year, pct, group=year)) +
    geom_point(data=dat[dat$id==i,], aes(year, pct), 
               pch=8, colour="red", size=5) +
    ggtitle("All Participants")

    grid.arrange(p1, p2, ncol=2, main=paste0("ID = ", i))
}
dev.off()

这是第一个情节的样子: