21

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:

enter image description here

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]

enter image description here

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.

Vitaliy Kaurov
  • 73,078
  • 9
  • 204
  • 355
  • 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" http://www.rif.org/kids/readingplanet/gamestation/picturepairs.htm – Dr. belisarius Jul 24 '12 at 00: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 07:50
  • This looks cool, but on my system (mid-2011 Macbook Pro, 2.2 GHz i7, 4 GB RAM, running Mac OSX Lion) with Mathematica 9.0.1, the touch samples are being acquired at a rather low rate by this program, so unless I move my finger across the trackpad really slowly, I get what looks more like a bunch of disjoint points on the heat map rather than the type of image you've shown. Any ideas? – Aky May 28 '13 at 07:19
  • @Aky Thanks. Maybe to rewrite code somehow to include function UpdateInterval - look it up in documentation. – Vitaliy Kaurov May 28 '13 at 16:13

1 Answers1

5

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=Developer`ToPackedArray@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}])]
Simon Woods
  • 84,945
  • 8
  • 175
  • 324