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()
这是第一个情节的样子:
我正在尝试制作一个可以并排显示三件事的图形。首先是显示个人随时间的变化。接下来是显示他们的同龄人群体随时间的变化。最后是显示总人口随时间的变化。
我每次观察都有四个时间点。我想看到的是两组相邻的箱线图,一组用于同龄人组,一组用于总体。叠加在其中每一个上的将是给定个人的数据点。每组将显示时间 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()
这是第一个情节的样子: