# 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 Jul 23 '12 at 14:12
Methodologically related: Creating ghost trail effects –  Jens Jul 23 '12 at 22:00
@Jens Yes indeed - I feel this can inspire a few ideas. Thanks! –  Vitaliy Kaurov Jul 23 '12 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 –  belisarius Jul 24 '12 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. –  Vitaliy Kaurov Jul 25 '12 at 7:50

## 1 Answer

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;

SetOptions[ArrayPlot,PlotRange->All,PlotRangePadding->0,Frame->False,ImageSize->400,ColorFunction->"TemperatureMap"];
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 Jul 24 '12 at 1:03
@Rojo So did for me the original one. I guess robust code for doing this is very difficult –  belisarius Jul 24 '12 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 ;-) –  Vitaliy Kaurov Jul 24 '12 at 6:52
@belisarius my code hangs your FE? Could you let me know your system specs? It works for me. –  Vitaliy Kaurov Jul 24 '12 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 –  belisarius Jul 24 '12 at 12:42