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

时间:2011-03-11 17:28:04

标签: r ggplot2

我正在尝试使用跨越ggplot中的因子的行来复制批次/案例/处理的点图。这就像道格拉斯贝茨的线性模型课程中的这个情节,它在y轴上显示6个组,在x轴上有连续响应,每个组的平均值由一条线连接: Dotplot from Bates

使用与lme4包捆绑在一起的sleepstudy数据集作为示例,我有:

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

其中给出了基本的点图,y轴上的对象按照反应时间的增加顺序。

然后,我创建了一个数据框,其中包含每个主题的平均反应时间:

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

我可以为每个主题绘制平均值:

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

但是我无法通过这些因素来划分这些因素。也就是说,从geom_point更改为geom_line不会显示任何内容

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

有人有什么想法吗?最终,我的目标是以这种方式在原始数据之上绘制一些模型结果,因此计算在原始数据框的绘图中“在运行中”的方法不太有用,因为我需要从中获取我的数据点一个更复杂的模型拟合。

感谢您的帮助!

赖安

2 个答案:

答案 0 :(得分:5)

<强>被修改

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

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

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

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

enter image description here

答案 1 :(得分:3)

你也可以像这样使用stat_summary:

require(lme4)
require(ggplot2)

data(sleepstudy)

ggplot(sleepstudy, aes(x = reorder(Subject, Reaction), y = Reaction)) + 
geom_point() + 
stat_summary(fun.y = mean, geom = "line", aes(group = 1)) + 
labs(x = "Subject", y = "Reaction") +
coord_flip()