MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Suppressing display of LogPlots

  • To: mathgroup at smc.vnet.net
  • Subject: [mg22614] Re: Suppressing display of LogPlots
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Tue, 14 Mar 2000 22:46:27 -0500 (EST)
  • References: <8aejj2$3aj@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Dr Dan,
The likely cause is very interesting for any option that are set with
RuleDelayed(  :>  ).

Please make a copy of the file Graphics.m in the same folder as the original
and call it myGraphics.m.

Looking at this we see

In the usage notes,  DisplayFunction is set with RuleDelayed :
    DisplayFunction :> <value>
not Rule:
    DisplayFunction -> <value>

However we get

<< Graphics`Graphics`

Block[{$DisplayFunction = Identity}, LogLinearPlot[Sin[x], {x, 0, 3*Pi}]];

Options[%, DisplayFunction]

{DisplayFunction -> Identity, DisplayFunction :> Identity}

Now,  using Find to find DisplayFunction -> we find several inocuous cases
but eventually reach a case inside

(1)
Show[g, DisplayFunction -> disp,
                        PlotRange -> r,
                        AxesOrigin -> ao
                ]

We find that dis was defined earlier by

(2)
{scale, disp, ao} =
    {ScaleFunction, DisplayFunction, AxesOrigin}/.
   Flatten[{opts}]/.Options[ScaledPlot];

Although this is a common way of extracting the values for options it is
cause of the problem,  because it allows $DisplayFunction in DisplayFunction
:> $DisplayFunction to be evaluated inside Block[ ..] using the temporary
setting $DisplayFunction = Identity.

One way out is to replace (2)  with

{scale,  ao} =
    {ScaleFunction, AxesOrigin}/.
   Flatten[{opts}]/.Options[ScaledPlot];

dis = Cases[Flatten[{opts,Options[ScaledPlot]}],
    _[DisplayFunction,_]][[1]];

This gives dis = DisplayFunction:>$DisplayFunction with $DisplayFunction
unevaluated, because RuleDelayed has the attribute HoldRest.

and replace (1) with

Show[g,      disp,
                  PlotRange -> r,
                   AxesOrigin -> ao
                ].

There are two subsequent examples of this kind of problem in the code that
can be handled in the same way.

After dealing with these we get.

<< Graphics`myGraphics`

Block[{$DisplayFunction = Identity}, LogLinearPlot[Sin[x], {x, 0, 3*Pi}]];

Options[%, DisplayFunction]

{DisplayFunction :> $DisplayFunction, DisplayFunction :> Identity}

Show[%%]; (*displays the picture*)

You might like to tidy up so that  DisplayFunction :> Identity is not left
in.


Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565











"Dr Dan" <drdanw at my-deja.com> wrote in message
news:8aejj2$3aj at smc.vnet.net...
> There is a programming oversight (er, bug) in the Graphics` package
> that interferes with the delayed evaluation of DisplayFunction
> options.  A common trick to suppress the display of graphics is to wrap
> Plot in a Block function:
>
> In[1]:=
> Block[{$DisplayFunction = Identity},
>    g1 = Plot[Sin[x], {x, 0, 3*Pi}]; ];
>
> In[2]:=
> Show[g1]
>
> ---------plot deleted
> Out[2]=
> -Graphics-
>
> However, this trick does not work for many plot types defined in the
> Graphics`Graphics` package:
>
> In[3]:=
> << "Graphics`Graphics`"
>
> In[4]:=
> Block[{$DisplayFunction = Identity},
>    g2 = LogLinearPlot[Sin[x], {x, 0, 3*Pi}]; ];
>
> In[5]:=
> Show[g2]
>
>  ------------- plot doesn't show!
> Out[5]=
> -Graphics-
>
> We can see why the plot does not display outside the Block by checking
> the DisplayFunction options in the graphic:
>
> In[6]:=
> Options[g2, DisplayFunction]
>
> Out[6]=
> {DisplayFunction -> Identity, DisplayFunction :> Identity}
>
> I have tracked this bug to the utility functions ScaledPlot and
> ScaledListPlot in Graphics.m.  Since I am not brave enough to attempt
> to fix the code, I created the following hack:
>
> DisplayFunctionHack[Graphics[args__,
>     (opts___)?OptionQ]] := Graphics[args,
>    {Flatten[{DisplayFunction :> $DisplayFunction,
>       DeleteCases[Flatten[{opts}], (Rule | RuleDelayed)[
>         DisplayFunction, _]]}]}]
>
> The DeleteCases is not strictly necessary, but I like to clean up.  We
> can see the effect of the hack by checking the options of the graphic
> again:
>
> In[8]:=
> g3 = DisplayFunctionHack[g2];
>
> In[9]:=
> Options[g3, DisplayFunction]
>
> Out[9]=
> {DisplayFunction :> $DisplayFunction}
>
> Now the graphics displays properly:
>
> In[10]:=
> Show[g3]
>
> ----------------graphic deleted, but trust me, it was here.
> Out[10]=
> -Graphics-
>
>
>
> Sent via Deja.com http://www.deja.com/
> Before you buy.
>



  • Prev by Date: Re: MathLink Speed.
  • Next by Date: Re: [Q] Differential equation?
  • Previous by thread: Re: Re: Suppressing display of LogPlots
  • Next by thread: Re: Re: Suppressing display of LogPlots