当使用facet_grid和多个数据点(R ggplot2)时,如何结合geom_point和geom_line?

3

我有一个类似下面的数据集,我想使用facet_grid函数绘制:

IV1<-c('DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO',
       'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO',
       'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO',
       'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO', 'DO', 'PO')
IV2<-c('DF', 'DF', 'SN', 'SN', 'SV', 'SV', 'DF', 'DF', 'SN', 'SN', 'SV', 'SV',
       'DF', 'DF', 'SN', 'SN', 'SV', 'SV', 'DF', 'DF', 'SN', 'SN', 'SV', 'SV',
       'DF', 'DF', 'SN', 'SN', 'SV', 'SV', 'DF', 'DF', 'SN', 'SN', 'SV', 'SV',
       'DF', 'DF', 'SN', 'SN', 'SV', 'SV', 'DF', 'DF', 'SN', 'SN', 'SV', 'SV')
IV3<-c('Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Child', 'Child', 'Child', 'Child', 'Child', 'Child', 
       'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Child', 'Child', 'Child', 'Child', 'Child', 'Child',
       'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Child', 'Child', 'Child', 'Child', 'Child', 'Child',
       'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Adult', 'Child', 'Child', 'Child', 'Child', 'Child', 'Child')
Subj<-as.character(c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
                     5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8))
Value<-runif(48)
data<-data.frame(Subj, IV1, IV2, IV3, Value)

我可以成功画出均值数据,代码如下:

library(ggplot2)
agg<-aggregate(Value~IV1*IV2*IV3, data=data, FUN="mean")

(P1<-ggplot(agg, aes(x=IV1, y=Value)) + theme_bw() + facet_grid(IV3~IV2) + 
  geom_point(aes(size=1.5, colour=factor(IV2), shape=factor(IV1))))

这看起来像这样: enter image description here 我也可以成功地绘制单个主题数据,如下所示:
(P2<-ggplot(data, aes(x=IV1, y=Value, group=Subj)) + theme_bw() + 
facet_grid(IV3~IV2)+ 
geom_point(aes(group=Subj, colour=factor(IV2), shape=factor(IV1))))

这是这样的: 输入图像描述 然而,我希望(a)汇总均值和Subj数据都在同一图表上(均值数据点更大),并且(b)每个方面内的数据点在DO和PO点之间连接(对于汇总均值和单个Subj数据点)。
就像这个假设图片一样(用画笔制作): 输入图像描述 提前感谢!

4
可能是 ggplot2中结合点和线的方法 的重复提问。 - BLT
1
什么阻止了你?每个geom_point()geom_line()图层都可以使用自己的数据参数...请参考帮助页面。 - Gregor Thomas
1个回答

4
agg$Subj <- rep(1:2, each = nrow(agg) / 2)
ggplot(data, aes(x=IV1, y=Value, colour=factor(IV2), shape=factor(IV1), group = Subj)) +  
    facet_grid(IV3~IV2)+ 
    geom_point() + 
    geom_point(data = agg, size = 5) +
    geom_line() +
    geom_line(data = agg, linetype = "dashed") +
    theme_bw()

我使用了另一种linetype来在视觉上区分实际观察值和聚合值(这只是一个需要考虑的想法)。

输入图片说明


这太完美了 - 谢谢!顺便问一下,在绘图之前为什么要执行agg$Subj <- rep(1:2, each = nrow(agg) / 2)?下次知道会很有帮助 :) - smh505
不客气!这是必需的,因为 agg 没有像 data 一样的 Subj 列,但它仍然需要 group 映射,以便 ggplot 知道应该连接哪些点在 geom_line 中。为了保持一致性,我只是手动添加它(有很多方法可以实现相同的结果)。 - tonytonov

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