R中的子组箱线图

3

我正在尝试制作一个图形,以便并排显示三个方面。首先是显示个体随时间变化的情况。接下来是显示同龄人群随时间变化的情况。最后是显示整个人口随时间变化的情况。

每个观察点上有四个时间点。我想看到的是两组并排的箱线图,一组用于同龄人群,另一组用于人口。在每个箱线图上叠加给定个体的数据点。每组都会显示时间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方法离正确还很远。请帮忙!
这是我想要做的草图。 示例

2
不太清楚你想要展示什么。你说你想把个体、同龄群体和整体人口并列展示。但接着你又说你想要2组箱线图,一组是同龄群体的,一组是整体人口的。请重新表述你的问题,以便明确你想要的东西。 - Synergist
1
也许可以制作一个所需输出的简单草图? - MrFlick
抱歉,@Synergist。我能理解那可能会让人感到困惑。我在第二段添加了一句话来澄清。 - drb
1
@MrFlick:我无法直接在这里发布,但我已经将示例上传到Imgur并进行了链接。好主意。谢谢! - drb
1个回答

5

这是否接近您所想要的?每个peer值和每个year都有一个箱线图。我还包括了每个组的平均值。

# 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))

enter image description here

更新:根据您的评论,也许可以这样:

基于您的评论,我们可能需要对此进行调整。

# 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()

这是第一个图表的样子: enter image description here

1
谢谢!这非常接近我所想要的,但是对于每个人,我只想显示他们自己同伴组的箱线图。我刚刚在这里发布了一个例子(http://imgur.com/JtiSoue)。另外,我希望我可以通过投票来给你点数,但我刚刚在这里注册,还没有被允许。 - drb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接