前言
最近因为论文,需要补充一个分析,在参照前人的文献中,别人有画过这样一个图
在前人的研究中,每个block可以划分成5个bin(图中用蓝色线呈现的),外侧灰色带则是误差线。也就是说,每个block内又可以分成一段折线,每个block间也可以画成一条折线(图中黑色线条)。本次画图就是基于前人的图形再结合自己的实验设计,将呈现一个相似的图。
数据准备
本次数据用到的是我自己研究的数据结果,其中包含被试姓名,block,被试反应时等
library(tidyverse)
head(data) #数据类型如下图所示
在这里,我们首先参照前人文献的做法,将每个block分装出4个bin,每个bin对应于8个trial
#封装bin, 这里我是直接将每8个位置生成一个bin
data <- data %>%
group_by(phase, filename) %>%
mutate(bin = case_when(
row_number() %in% 1:8 ~ 1,
row_number() %in% 9:16 ~ 2,
row_number() %in% 17:24 ~ 3,
row_number() %in% 25:32 ~ 4,
))
head(data)
接下来,我们将被试维度平均处理,生成一个条件间的平均值结果。在这里,我使用的是 Rmisc 包的函数,这个包的一个优点是操作简单,并且能够输出se, sd 等统计值。
# 函数可以直接用两个冒号(::)直接调用,而不需要library()包本身
temp_data <- Rmisc::summarySE(data, groupvars = c("phase","bin"),measurevar = "RT" ) %>%
na.omit()
# 为了生成画图时的X轴,我额外生成了一个新的变量,命名为X,我会在后面的图中将x的值作为X轴
temp_data <- temp_data %>%
mutate(x = row_number())
head(temp_data)
画折线图
现在我们将直接用temp_data这个数据进行画图
在该图中,其实我们是将每个block视为不同的处理水平(condition) ,并且通过不同的颜色将其标识出来。而在每个block内部,也就是不同的 bin 之间,我们则是将其视为同一个组。组内通过相同的颜色处理。
#将block设置为分类变量,否则R会默认识别成数值型变量
temp_data$phase <- as.factor(temp_data$phase)
ggplot(temp_data,aes(x = x, y = RT , colour = phase))+ # 我们额外将不同的block添加了颜色属性,以便更好的区分不同的block
theme_bw() + # 设置白色背景,个人偏好
geom_point()+ # 添加折线上的三点
geom_line()+ # 添加折线,注意折线只在block内存在折线,这是因为我们在添加整个画布时,就将block设置了分组,
# 所以ggplot认为block内是一个分组,它就将同一个分组内的数据增加了折线
# 如果需要像原始图中将所有数据点通过折线链接起来,可以设置 geom_line(aes(group = 1))
geom_ribbon(aes(ymax = RT + se, ymin = RT - se, colour = NA, fill =phase), alpha = 0.1)+ # 添加置信区间,并且去掉线的颜色
scale_color_brewer(palette="Dark2")+ # 改变整个色系
scale_fill_brewer(palette="Dark2")+ # 改变整个色系
scale_x_continuous(breaks = c(2.5,6.5,10.5,14.5,18.5,22.5), labels = c(1,2,3,4,5,6))+ # 改变x刻度点的位置
labs(y = "Reaction Time (ms)", x= "Block")+ #改变坐标轴标签
theme(legend.position = "none") #删除图例
实际上,我们也可以根据需求,自由定义我们想要设置的折线组。在定义的过程中,关键是创建标识组间的变量,使得ggplot理解我们是根据哪个变量区分组别的,并且将该组别映射(mapping)到相应刺激属性之上(如线条颜色或填充颜色)
仍以该数据为例,我们仍然可以根据前三个block为一个实验处理,而后三个block则为另一个实验处理。
# 将前三个block设置为 condition1, 后三个block则设置为condition2
temp_data <- temp_data %>%
mutate(condition = case_when(
phase %in% c(1,2,3) ~ "condition1",
phase %in% c(4,5,6) ~ "condition2"
))
temp_data$phase <- as.factor(temp_data$phase)
ggplot(temp_data,aes(x = x, y = RT , colour = condition))+ # 我们额外将不同的block添加了颜色属性,以便更好的区分不同的block
theme_bw() + # 设置白色背景,个人偏好
geom_point()+ # 添加折线上的三点
geom_line()+ # 添加折线,注意折线只在block内存在折线,这是因为我们在添加整个画布时,就将block设置了分组,
# 所以ggplot认为block内是一个分组,它就将同一个分组内的数据增加了折线
# 如果需要像原始图中将所有数据点通过折线链接起来,可以设置 geom_line(aes(group = 1))
geom_ribbon(aes(ymax = RT + se, ymin = RT - se, colour = NA, fill =condition), alpha = 0.1)+ # 添加置信区间,并且去掉线的颜色
scale_color_brewer(palette="Set1")+ # 改变整个色系
scale_fill_brewer(palette="Set1")+ # 改变整个色系
scale_x_continuous(breaks = c(2.5,6.5,10.5,14.5,18.5,22.5), labels = c(1,2,3,4,5,6))+ # 改变x刻度点的位置
labs(y = "Reaction Time (ms)", x= "Block")+ #改变坐标轴标签
theme(legend.position = "none") #删除图例