21
$\begingroup$

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.

$\endgroup$
7
  • $\begingroup$ This has the weird issue that it works even when you are hovering over another graphics. Does that bother? $\endgroup$
    – Rojo
    Jul 23, 2012 at 14:12
  • $\begingroup$ Methodologically related: Creating ghost trail effects $\endgroup$
    – Jens
    Jul 23, 2012 at 22:00
  • $\begingroup$ @Jens Yes indeed - I feel this can inspire a few ideas. Thanks! $\endgroup$ Jul 23, 2012 at 22:14
  • $\begingroup$ 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 $\endgroup$ Jul 24, 2012 at 0:53
  • $\begingroup$ @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. $\endgroup$ Jul 25, 2012 at 7:50

1 Answer 1

5
$\begingroup$

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}])]
$\endgroup$
5
  • $\begingroup$ Good touches, +1. It hangs my session, or at least did it twice, however... $\endgroup$
    – Rojo
    Jul 24, 2012 at 1:03
  • $\begingroup$ @Rojo So did for me the original one. I guess robust code for doing this is very difficult $\endgroup$ Jul 24, 2012 at 6:37
  • $\begingroup$ +1 Nice idea. Though it does, as noticed by others, hangs Front End - not sure why. Thanks anyway - go go creative thinking ;-) $\endgroup$ Jul 24, 2012 at 6:52
  • $\begingroup$ @belisarius my code hangs your FE? Could you let me know your system specs? It works for me. $\endgroup$ Jul 24, 2012 at 6:53
  • $\begingroup$ @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 $\endgroup$ Jul 24, 2012 at 12:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.