ggplot:在将因子作为参数时绘制单独的y行

时间:2013-07-28 21:52:02

标签: r ggplot2

我想创建以下图:x轴从1到900表示试用编号。 y轴显示三条不同的线,具有反应时间的移动平均值。每个难度级别显示一行(Hard,Medium,Easy)。应使用facet_wrap为每个参与者显示单独的图表。

如果我使用ggplot的geom_smooth()函数,现在一切正常。像这样:

ggplot(cw_trials_f, aes(x=trial_number, y=as.numeric(correct), col=difficulty)) + 
    facet_wrap(~session_id) + 
    geom_smooth() + 
    ggtitle("Stroop Task")

当我尝试使用 zoo 库的rollmean函数时出现问题。这是我试过的:

ggplot(cw_trials_f, aes(x=trial_number, y=rollmean(as.numeric(correct)-1, 50, na.pad=T, align="right"), col=difficulty)) + 
    facet_wrap(~session_id) + 
    geom_line() + 
    ggtitle("Stroop Task")

似乎这并不首先根据难度对数据进行分区然后应用rollmean函数,反之亦然。因此,仅显示一条线但是全部三种颜色。如何将rollmean分别应用于各类试验(简易,中等,硬)?

以下是一些示例数据:

  session_id test_number trial_number trial_duration  rule concordant switch correct reaction_time difficulty
1   11674020           1            1           1872  word concordant    yes     yes          1357       Easy
2   11674020           1            2           2839  word discordant     no     yes          2324     Medium
3   11674020           1            3           1525 color discordant    yes      no          1025       Hard
4   11674020           1            4           1544 color discordant     no      no          1044     Medium
5   11674020           1            5           1451  word concordant    yes     yes           952       Easy
6   11674020           1            6           1252 color concordant    yes     yes           746       Easy

1 个答案:

答案 0 :(得分:1)

所以,我最后从上面的评论中关注@joran的建议(谢谢)并做了以下事情:

cw_trials_f <- ddply(cw_trials_f, .(session_id, difficulty), .fun = function(X) transform(X, movrt = rollmean(X$reaction_time, 50, na.pad=T, align="right"), movacc = rollmean(as.numeric(X$correct)-1, 50, na.pad=T, align="right")))

这会在data.frame中添加两个额外的列,其中包含精度和反应时间的移动平均值。

然后这可以很好地绘制它们:

ggplot(cw_trials_f, aes(x=trial_number, y=movacc, col=difficulty)) + geom_line() + facet_wrap(~session_id) + ggtitle("Stroop Task")

与我最初的想法相比,这有一个(次要的)缺点:它使移动平均功能尝试不同的长度变得有点乏味和缓慢。