在点图(ggplot)中添加线交叉因子

Rya*_*yan 2 r ggplot2

我正在尝试使用与ggplot中的因子交叉的线来复制批次/案例/处理的点图。就像道格拉斯·贝茨(Douglas Bates)的线性模型课程中的图所示,该图在y轴上显示6个组,在x轴上显示连续的响应,每组的平均值由一条线相连: 贝茨的点图

以与lme4软件包捆绑在一起的sleepstudy数据集为例,我有:

library(ggplot2)
p <- ggplot(sleepstudy, aes(x=Reaction, y=reorder(Subject, Reaction)))
p <- p + geom_point()
print(p)
Run Code Online (Sandbox Code Playgroud)

这给出了基本的点图,对象在y轴上以增加反应时间的顺序排列。

然后,我为每个主题创建一个具有平均反应时间的数据框:

mean_rxn <- function(df) mean(df$Reaction, na.rm=T)
sleepsummary <- ddply(sleepstudy, .(Subject), mean_rxn)
Run Code Online (Sandbox Code Playgroud)

我能够在每个主题的平均值处绘制点:

p.points <- p + geom_point(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1), size=10))
print(p.points)
Run Code Online (Sandbox Code Playgroud)

但是我无法跨越因素。也就是说,从geom_point更改为geom_line不会显示任何内容

# does nothing
p.line <- p + geom_line(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1)))
print(p.line)
Run Code Online (Sandbox Code Playgroud)

有人有想法么?最终,我的目标是以这种方式在原始数据的顶部绘制一些模型结果,因此在原始数据帧的绘制中“即时”计算的方法用处不大,因为我需要从中获取数据点更复杂的模型拟合。

谢谢你的帮助!

瑞安

And*_*rie 5

已编辑

我的第一个建议是在绘图之前将值转换为数字。

p.line <- p + 
  geom_line(data=sleepsummary, aes(x=V1, y=as.numeric(reorder(Subject, V1))))
Run Code Online (Sandbox Code Playgroud)

但是Hadley指出,最好在解决方案中使用group = 1,而不要使用as.numeric():

p.line <- p + 
  geom_line(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1), group=1))
print(p.line)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明