Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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.

share|improve this question
    
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
show 2 more comments

1 Answer 1

up vote 4 down vote accepted

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}])]
share|improve this answer
    
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
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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