Re: Dynamic Control of Graphics
- To: mathgroup at smc.vnet.net
- Subject: [mg105082] Re: Dynamic Control of Graphics
- From: dr DanW <dmaxwarren at gmail.com>
- Date: Fri, 20 Nov 2009 06:39:28 -0500 (EST)
- References: <he0oae$4ov$1@smc.vnet.net>
Here is a function I wrote that creates a legend based on the tooltips
on the functions being plotted. Each line swatch in the legend is a
button that lets me dim (lower the opacity) or darken (opacity -> 1)
the associated curve. I tried very hard to get this to work on the
curves themselves (treating each curve as a button) but could never
get it to work. However, I find this function is extremely useful,
and I get many surprised gasps from the audience when I use it in a
presentation. Not quite what you were looking for, but maybe you can
use the technique.
Code follows. Enjoy.
--------------------
Attributes[DynamicLegend] = {HoldFirst};
DynamicLegend[(plotfnc_)[f_, args___, (opts___)?OptionQ]] :=
Module[{tags, ps, op, dim, makeLegend}, tags = Flatten[{f}][[All,
2]];
ps = MapIndexed[Directive[ColorData[1, #2[[1]]], Thick,
Opacity[op[#1]]] & , tags]; op[_] = 1; dim = 0.3;
makeLegend[s_, t_] := {Toggler[Dynamic[op[t]],
{1 -> Graphics[Flatten[{s, Line[{{0, 0}, {1, 0}}]}],
ImageSize -> 72/3, AspectRatio -> 0.1], Dynamic[dim] ->
Graphics[Flatten[{s, Line[{{0, 0}, {1, 0}}]}],
ImageSize -> 72/3, AspectRatio -> 0.1]}], Text[t]};
Column[{Dynamic[Row[{plotfnc[f, args, PlotStyle -> ps,
ImageSize -> Medium, opts], Grid[MapThread[makeLegend,
{ps, tags}], Alignment -> {Left, Right}]}]],
ButtonBar[{"Dim All" :> (Clear[op]; op[_] = Dynamic[dim]),
"Darken All" :> (Clear[op]; op[_] = 1)}],
Slider[Dynamic[dim], {0, 1}]}]];
DynamicLegend[
Plot[{
Tooltip[x^2, TraditionalForm[x^2]],
Tooltip[x^3, TraditionalForm[x^3]],
Tooltip[x^4, TraditionalForm[x^4]]}, {x, -3, 3}]]