# Mouse motion heat map - live visualization and analysis

Mouse motion heat map is an great way to study spatial attention distribution, styles of movement, reaction, etc. I am trying to design a code that visualizes such heat map. The requirements: 1) It must be real fast and 2) it must run for long time - no memory overload, etc. Simply collecting data points from 'MousePosition' in a list would probably run into a memory and slow interpolating graphics problems (unless you guys can prove otherwise ;-) ). So I came up with the idea of collecting data in an 'ArrayPlot'. This is pretty fast:

Manipulate[
IC = If[MousePosition["Graphics"] == None, IC, "fake",
Chop@Mod[IC + splash[100, 20] @@
Floor[{100 - #2, #1} & @@ MousePosition["Graphics"]], 10^6]];
ArrayPlot[IC, PlotRange -> All, PlotRangePadding -> 0,
Frame -> False, ImageSize -> 400, ColorFunction -> "TemperatureMap"]
, FrameMargins -> 0, AppearanceElements -> None
, Initialization :> (
IC = SparseArray[{{1, 1} -> 0., 100 {1, 1} -> 0.}];
splash[n_, r_][x_, y_] :=
SparseArray[Flatten[Table[{1 + Mod[i, n], 1 + Mod[j, n]} ->
1. Exp[-((i - x)^2 + (j - y)^2)/(n/10.)], {i, x - r,
x + r}, {j, y - r, y + r}]~
Join~{{1, 1} -> 0., n {1, 1} -> 0.}, 1]])]


This is an insight into how handwriting proceeds through time, where the hand spends more time, which part are more difficult to draw:

And here some very basic type of further analysis or visualization:

Column[ListPlot[#, PlotRange -> All, PlotRangePadding -> 0,
Frame -> True, ImageSize -> 600, ColorFunction -> "DarkRainbow",
Joined -> True, PlotStyle -> Opacity[.3],
AspectRatio -> 1/5] & /@ {IC, Transpose@IC}, Spacings -> .05]


My questions are: is there more efficient and fast approach? what interesting Mathematica stats we could try? what cool apps we can make (games, writing, etc.)?

All approaches are welcome.

• This has the weird issue that it works even when you are hovering over another graphics. Does that bother?
– Rojo
Commented Jul 23, 2012 at 14:12
• Methodologically related: Creating ghost trail effects
– Jens
Commented Jul 23, 2012 at 22:00
• @Jens Yes indeed - I feel this can inspire a few ideas. Thanks! Commented Jul 23, 2012 at 22:14
• How about using a grayscale Arrayplot as an alpha channel, using a background image and playing "picture pairs" rif.org/kids/readingplanet/gamestation/picturepairs.htm Commented Jul 24, 2012 at 0:53
• @belisarius good idea. i constantly thinking of putting some game under the heatmap. but what could it be - that it won't slow down the performance. Commented Jul 25, 2012 at 7:50

It looks like ArrayPlot is a good approach. I found it a bit faster (especially for a larger splash width) to create the splash up front as a packed array and use RotateRight to move it around.

I have also switched off SynchronousUpdating for the graphics, so IC can update more smoothly.

L=100;

blob=DeveloperToPackedArray@RotateRight[N@Chop@GaussianMatrix[{L/2,2.5}][[2;;,2;;]],{L/2+1,L/2+1}];
splash[{x_,y_}]:=RotateRight[blob,Floor@{L-y,x}];
splash[None]=0;

Manipulate[
IC+=splash[MousePosition["Graphics"]];
Dynamic[ArrayPlot[IC],SynchronousUpdating->False],
FrameMargins->0,AppearanceElements->None,
Initialization:>(IC=ConstantArray[0.,{L,L}])]
`
• Good touches, +1. It hangs my session, or at least did it twice, however...
– Rojo
Commented Jul 24, 2012 at 1:03
• @Rojo So did for me the original one. I guess robust code for doing this is very difficult Commented Jul 24, 2012 at 6:37
• +1 Nice idea. Though it does, as noticed by others, hangs Front End - not sure why. Thanks anyway - go go creative thinking ;-) Commented Jul 24, 2012 at 6:52
• @belisarius my code hangs your FE? Could you let me know your system specs? It works for me. Commented Jul 24, 2012 at 6:53
• @VitaliyKaurov I happened a few times I forgot your code running and went to do other things. I can't reproduce it at will. Platform WinXP SP3, MMa 8.0 Commented Jul 24, 2012 at 12:42