Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2000
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2000

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

Search the Archive

RE: Confusing Behavior of LogPlot vs. Plot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg24852] RE: [mg24838] Confusing Behavior of LogPlot vs. Plot
  • From: Wolf Hartmut <hwolf at debis.com>
  • Date: Wed, 16 Aug 2000 03:24:14 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com


> -----Original Message-----
> From:	AES [SMTP:siegman at stanford.edu]
To: mathgroup at smc.vnet.net
> Sent:	Tuesday, August 15, 2000 9:04 AM
> To:	mathgroup at smc.vnet.net
> Subject:	[mg24838] Confusing Behavior of LogPlot vs. Plot
> 
> If I run the following input cells with the "Table" cell commented out 
> as shown, I get four valid and correct plots.
> 
>    Remove["Global`*"]
> 
>    Needs["Graphics`"]
> 
>    f[a_, x_] := Exp[-a x^2]
> 
>    a = 1; Plot[f[a, x], {x, -1, 1}]
> 
>    a = 1; LogPlot[f[a, x], {x, -1, 1}];
> 
>    (* x = 3.; Table[{a, f[x, a]}, {a, 0, 2}] // TableForm *)
> 
>    a = 4; Plot[f[a, x], {x, -1, 1}]
> 
>    a = 4; LogPlot[f[a, x], {x, -1, 1}]
> 
> If, however, I remove the (* and *) and run the notebook including the 
> "Table" input cell, both "Plot" plots are still fine, still give correct 
> results, but the second "LogPlot" cell doesn't give me a plot at all, it 
> gives me the list of options for something called "ScaledPlot".
> 
> (With various other test circumstances, the repeated "Plot" cells always 
> continue to function OK, but the repeated "LogPlot" cell gives other 
> weird results, e.g, a totally incorrect plot.)
> 
> If I've somehow goofed on this, I apologize -- but if this is how 
> LogPlot really works, I'd say that's inexcusably bad interface design.  
> If LogPlot looks, smells, and feels like Plot, and does essentially the 
> same job as Plot, it should *function* just like Plot.
> 
> 
[Hartmut Wolf]  

Dear AE,

as you will have seen, "after removal of the (* and *)", the global symbol x
has got the value 3. and since LogPlot (as well as LinearLogPlot and
ScaledPlot, which are called from LogPlot) only have the HoldFirst
attribute, the call of LogPlot[f[a,x],{x,-1,1}] is equivalent to the call
LogPlot[f[a,x],{3.,-1,1}], which of course doesn't work. The miracle indeed
is that Plot[f[a,x],{x,-1,1}] _does_ work. Ok, it has the HoldAll attribute,
but that won't suffice for LogPlot, LinearLogPlot and ScaledPlot; the
behaviour is still wrong, however in a different way.

The right way to treat the problem of course is, to clear the global symbol
x before using it as the range variable. 

However you might ask how to fix the problem such that LogPlot gets the same
behaviour as Plot. The idea to just overload the symbol ScaledPlot (and to
refer to the symbol from the package Graphics`Graphics` as
Graphics`Graphics`ScaledPlot) doesn't work, since if the new definition is
made _after_ loading the package both names designate the same symbol, if
however the new definition is made _before_ loading the package (and
shadowing occurs) then LinearLogPlot will reference the package symbol, not
the global one.

What did succeed was, after loading the package to introduce a symbol
OldScaledPlot and transfer the DownValues of ScaledPlot to that, then Clear
ScaledPlot and redefine it:

  
In[1]:= f[a_, x_] := Exp[-a x^2]
In[2]:=
x = 3.; Table[{a, f[x, a]}, {a, 0, 2}] // TableForm

In[3]:= a = 4; Plot[f[a, x], {x, -1, 1}]

(this works anyways)

In[4]:= Needs["Graphics`Graphics`"]
In[5]:=
SetAttributes[{LogPlot, LinearLogPlot, ScaledPlot}, HoldAll]

In[9]:= Attributes[OldScaledPlot] = {HoldAll}
In[10]:=
DownValues[OldScaledPlot] = 
  DownValues[ScaledPlot] /. ScaledPlot -> OldScaledPlot

In[11]:= Clear[ScaledPlot]

now redefine ScaledPlot (protect the range variable with Block)

In[14]:=
ScaledPlot[f_, {x_Symbol, x0_, x1_}, opts___] := 
  Block[{x}, OldScaledPlot[f, {x, x0, x1}, opts]]

In[15]:=
a = 4; LogPlot[f[a, x], {x, -1, 1}]

This now works!

-- Hartmut 



  • Prev by Date: RE: Expanding a nested structure (pattern matching?)
  • Next by Date: Re: Differentiating Functions and Root objects [ was Re: ArcCos[]]
  • Previous by thread: Re: Confusing Behavior of LogPlot vs. Plot
  • Next by thread: Re: Incorrect Fourier Transforms?