随着时间推移绘制离散变量(围巾图)

1 投票
1 回答
990 浏览
提问于 2025-04-17 20:56

我有一组时间序列数据,来自一个重复测量的眼动追踪实验。

这个数据集包含了多个参与者,每个参与者有48次实验。数据集中有一个变量叫做('saccade'),它表示眼睛注视之间的转换,还有一个变量('time'),它在每次实验中范围是0到1。这些转换被分为三种不同的类别('ver'、'hor'和'diag')。

这里有一段代码,可以用Python创建一个小的示例数据集(一个参与者和两次实验):

import numpy as np
import pandas as pd

saccade1 = np.array(['diag','hor','ver','hor','diag','ver','hor','diag','diag',
'diag','hor','ver','ver','ver','ver','diag','ver','ver','hor','hor','hor','diag',
'diag','ver','ver','ver','ver'])

time1 = np.array(range(len(saccade1)))/float(len(saccade1)-1)

trial1 = [1]*len(time1)

saccade2 = np.array(['diag','ver','hor','diag','diag','diag','hor','ver','hor',
'diag','hor','ver','ver','ver','ver','diag','ver','ver','hor','diag',
'diag','hor','hor','diag','diag','ver','ver','ver','ver','hor','diag','diag'])
time2 = np.array(range(len(saccade2)))/float(len(saccade2)-1)

trial2 = [2]*len(time2)

saccade = np.append(saccade1,saccade2)
time = np.append(time1,time2)
trial = np.append(trial1,trial2)
subject = [1]*len(time)

df = pd.DataFrame(index=range(len(subject)))
df['subject'] = subject
df['saccade'] = saccade
df['trial'] = trial
df['time'] = time

另外,我还制作了一个包含相同数据的csv文件,可以在这里下载

我想制作一个所谓的“围巾图”来可视化这些转换随时间的变化,但我不知道怎么做这些图。

我希望能为每个参与者单独制作图表,x轴是时间,y轴是实验次数。对于每次实验,我希望用不同颜色的“堆叠”条形图来表示这些转换。

我唯一见过这类图的例子是在书《眼动追踪 - 方法与测量的综合指南》中(图6.8b)链接

有没有人能告诉我/帮我做这个?

(我可以使用Python或R编程,最好是Python)

1 个回答

2

这里有一个用R语言和ggplot2库的解决方案。你需要重新编码time2,让它表示经过的时间,而不是总时间。

library(ggplot2)
dataset <- read.csv("~/Downloads/example_data_for_scarf.csv")
dataset$trial <- factor(dataset$trial)
dataset$saccade <- factor(dataset$saccade)
dataset$time2 <- c(0, diff(dataset$time))
dataset$time2[dataset$time == 0] <- 0
ggplot(dataset, aes(x = trial, y = time2, fill = saccade)) + 
    geom_bar(stat = "identity") + 
    coord_flip()

scarf plot

撰写回答