生成眼动数据的热力图
我有一个来自Tobii眼动仪的数据集。经过一些处理后,数据集看起来是这样的:
timestamp xposition yposition
我使用Python来收集数据。数据是在参与者看着显示器的时候记录下来的。我想为显示器的大小生成热力图。
之后我还想制作一张图片,并在上面叠加这个热力图。
我想用R语言来生成热力图。请问有什么算法可以做到这一点,或者有没有插件可以直接把我的数据集作为输入?
实验设置:
- 时间是相对时间:100, 100.02, 100.04, 100.06……以0.02秒的间隔递增
- x坐标和y坐标是以厘米为单位的,都是从显示器的中心开始算的。
- 背景图像会被分成10行6列的正方形框,每个框的大小是3.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.x
和 breaks.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
输出即使在那些没有值的地方也要有的值。