生成眼动数据的热力图

-1 投票
1 回答
2286 浏览
提问于 2025-04-20 11:15

我有一个来自Tobii眼动仪的数据集。经过一些处理后,数据集看起来是这样的:

timestamp      xposition      yposition

我使用Python来收集数据。数据是在参与者看着显示器的时候记录下来的。我想为显示器的大小生成热力图。

之后我还想制作一张图片,并在上面叠加这个热力图。

我想用R语言来生成热力图。请问有什么算法可以做到这一点,或者有没有插件可以直接把我的数据集作为输入?

实验设置:

  1. 时间是相对时间:100, 100.02, 100.04, 100.06……以0.02秒的间隔递增
  2. x坐标和y坐标是以厘米为单位的,都是从显示器的中心开始算的。
  3. 背景图像会被分成10行6列的正方形框,每个框的大小是3.4厘米
  4. 使用的显示器分辨率是1920x1080,具体型号可以查看这里

我运行的代码出现了错误:在用Matlab的dlmwrite导出后,我在R Studio的图形界面中加载了变量,并进行了以下操作:

> xPos = myfile[1:278,1]
> yPos = myfile[1:278,2]
> breaks.x <- seq(-23.5, 23.5, length.out = 3.4)
> breaks.y <- seq(-14.1, 14.1, length.out = 3.4)
> int.x <- findInterval(xPos, breaks.x)
> int.y <- findInterval(yPos, breaks.y)
> tb <- table(int.x, int.y)
> image(breaks.x, breaks.y, tb, las=1)
Error in image.default(breaks.x, breaks.y, tb, las = 1) : 
  dimensions of z are not length(x)(-1) times length(y)(-1)

我在x轴上设置了从-到+23.5,y轴上设置了从-到+14.1,这样就和我在实验中生成的点匹配了。图像只在这个区域内绘制。

数据集

1 个回答

2

首先,我们来生成一些数据。

# Set RNG seed for reproducibility 
set.seed(12345) 

times <- seq(as.POSIXct("2014-09-08 14:00:00"), 
             as.POSIXct("2014-09-08 16:00:00"), 5)
pos.x <- runif(length(times), 0, 1024)
pos.y <- runif(length(times), 0, 768)

现在我们可以使用 findInterval 来把每一对 x 和 y 映射到一个特定的区间,这些区间我们在 breaks.xbreaks.y 中定义。在这个例子中,我用了一个 20x20 的网格,但你当然可以随意更改这个设置。
接着,我们使用 table 来生成一个列联表,这个表就是我们的“位置矩阵”。

breaks.x <- seq(0, 1024, length.out = 20)
breaks.y <- seq(0, 768, length.out = 20)
int.x <- findInterval(pos.x, breaks.x)
int.y <- findInterval(pos.y, breaks.y)

# See below for explanation
int.x <- factor(int.x, levels=1:20)
int.y <- factor(int.y, levels=1:20)

tb <- table(int.x, int.y)

最后,绘制热图。

image(breaks.x, breaks.y, tb, las=1)

注意:这两个 factor 的调用是必要的,因为如果不这样做,table 会忽略那些没有数据点的区间。把数据转换为因子可以有效地强制 table 输出即使在那些没有值的地方也要有的值。

撰写回答