Zoomable ListPlot
- To: mathgroup at smc.vnet.net
- Subject: [mg91864] Zoomable ListPlot
- From: "peter.steneteg at gmail.com" <peter.steneteg at gmail.com>
- Date: Thu, 11 Sep 2008 06:12:23 -0400 (EDT)
Hi
I made a small function to produce a zoomable listplot, hold alt down
and draw a rect to zoom, shift click to return. I'm not very familiar
with the eventhandlers, maybe someone else can do this much better,
without redrawing the plot as many times? I would also like to be able
to turn data series on and off by clicking the legend, but I have no
idea on how to do that...
/Peter
PListPlot[fun_,
opts : OptionsPattern[{Options[ListPlot], Legend -> {""},
Frame -> True, ColorScheme -> 1}]] :=
DynamicModule[{p1, p2, pr = Automatic, pt = {{0, 0}, {0, 0}},
pl = {}, mylegend, is, style},
mylegend[data_] := Framed[Grid[
MapIndexed[{Item[
Graphics[{ColorData[OptionValue[ColorScheme], First@#2],
Thick, Line[{{0, 0}, {1, 0}}]}, AspectRatio -> .1,
ImageSize -> 30], Alignment -> {Center, Center}],
Item[Style[#1, FontSize -> 16, FontFamily -> "Helvetica"],
Alignment -> {Left, Bottom}]} &, data]],
Background -> RGBColor[1, 1, 0.99999]];
is[x_] := {x, x/GoldenRatio};
EventHandler[
Dynamic[
ListPlot[fun, PlotRange -> pr,
Epilog -> {pl,
Inset[mylegend[OptionValue[Legend]],
ImageScaled[{1 - 0.02, 1 - 0.02}], {Right, Top}]},
Evaluate@ FilterRules[{opts}, Options[ListPlot]],
MaxPlotPoints -> ControlActive[1000, Infinity]],
SynchronousUpdating -> Automatic],
"MouseDown" :> (If[CurrentValue["AltKey"],
p1 = MousePosition["Graphics"]];
If[CurrentValue["ShiftKey"], pr = Automatic];
),
"MouseUp" :> (If[CurrentValue["AltKey"],
p2 = MousePosition["Graphics"];
pt[[1, 1]] = p1[[1]];
pt[[1, 2]] = p2[[1]];
pt[[2, 1]] = p1[[2]];
pt[[2, 2]] = p2[[2]];
pr = pt;
pl = {};
]
),
"MouseDragged" :> (If[CurrentValue["AltKey"],
p2 = MousePosition["Graphics"];
pt[[1, 1]] = p1[[1]];
pt[[1, 2]] = p2[[1]];
pt[[2, 1]] = p1[[2]];
pt[[2, 2]] = p2[[2]];
pl = {Line[{p1, {p2[[1]], p1[[2]]}, p2, {p1[[1]], p2[[2]]},
p1}]};
];
)
,
PassEventsDown -> True
]
]