Re: Zoomable ListPlot
- To: mathgroup at smc.vnet.net
- Subject: [mg91895] Re: Zoomable ListPlot
- From: Peter Steneteg <peter.steneteg at gmail.com>
- Date: Fri, 12 Sep 2008 05:26:38 -0400 (EDT)
- References: <gaaqu7$12a$1@smc.vnet.net>
On 11 Sep, 04:12, "peter.stene... at gmail.com"
<peter.stene... at gmail.com> wrote:
> 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
I found a way to turn data series on and off...
PListPlot[fun_,
opts : OptionsPattern[{Options[ListPlot], Legend -> {""},
Frame -> True, ColorScheme -> 1, PPlotStyle -> {}}]] :=
DynamicModule[{p1, p2, pr = Automatic, pt = {{0, 0}, {0, 0}},
pl = {}, mylegend, is, style, show, ps},
show = Table[True, {i, 1, Length[fun]}];
ps = Table[
Directive[{ColorData[OptionValue[ColorScheme], i]}~Join~
OptionValue[PPlotStyle]], {i, 1, Length[fun]}];
mylegend[data_] := Framed[Grid[
MapIndexed[{Item[
Graphics[{ColorData[OptionValue[ColorScheme], First@#2],
Thick, Line[{{0, 0}, {1, 0}}]}, AspectRatio -> .1,
ImageSize -> 30], Alignment -> {Center, Bottom}],
Button[Item[
Style[#1, FontSize -> 16,
FontColor -> If[show[[First@#2]], Black, Gray],
FontFamily -> "Helvetica"], Alignment -> {Left, Top}],
show[[First@#2]] = ! show[[First@#2]],
Appearance -> Frameless, Alignment -> {Left, Top}]} &,
data]], Background -> RGBColor[1, 1, 0.99999]];
is[x_] := {x, x/GoldenRatio};
EventHandler[
Dynamic[
ListPlot[
fun[[ Select[MapIndexed[If[#1, First@#2] &, show], NumberQ]]],
PlotRange -> pr,
Epilog -> {pl,
Inset[mylegend[OptionValue[Legend]],
ImageScaled[{1 - 0.02, 1 - 0.02}], {Right, Top}]},
Evaluate@ FilterRules[{opts}, Options[ListPlot]],
PlotStyle ->
ps[[ Select[MapIndexed[If[#1, First@#2] &, show], NumberQ]]],
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
]
]