Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 5979035
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 22, 20262026-05-22T21:36:09+00:00 2026-05-22T21:36:09+00:00

I want to describe an issue I have been having with Plot using With

  • 0

I want to describe an issue I have been having with Plot using With to keep defined parameters ‘local’. I am not necessarily asking for a fix: the problem I have is one of understanding.

Sometimes I use a construction such as the following to obtain a Plot:

Method 1

plot1 = With[{vmax = 10, km = 10}, 
  Plot[Evaluate@((vmax x)/(km + x)), {x, 0, 100}, 
   AxesOrigin -> {0, 0}]]

I like this method, and it is reasonably clear even to non-Mathematica users exactly what is going on.

When the equations to be plotted become more complex, I like to define them external to the plot (using SetDelayed). For example:

f[x_] := (vmax x)/(km + x)

However, the following does not work

Method 2

plot2 = With[{vmax = 10, km = 10}, 
  Plot[Evaluate@f[x], {x, 0, 100}, AxesOrigin -> {0, 0}]]

I have always naively thought that it should. However, based on the Help statement that

Plot treats the variable x as local,
effectively using Block

I have used various workarounds, mostly something like the following

Method 3

plot3 = Plot[With[{vmax = 10, km = 10}, Evaluate@f[x]], {x, 0, 100}, 
  AxesOrigin -> {0, 0}]

This one seems very awkward, and usually requires further explanation even to Mathematica users.

Plot outputs

enter image description here

However, recently I found out by chance that substituting Block for With in Method 2 works exactly as expected.

I can, for example, do something like the following (which to me seems a very versatile approach):

plot4 = Block[{vmax = {10, 10, 10}, km = { 10, 100, 1000}}, 
  Plot[Evaluate@f[x], {x, 0, 100}, AxesOrigin -> {0, 0}, 
   PlotStyle -> {Red, Green, Blue}]]

giving

enter image description here

My questiions are as follows. What is the explanation for the difference in behaviour with With in Method 1 and 2? Should I have expected Method 2 not to work? Furthermore, what is the explanation for the difference in behaviour with Block and With in Method 2? Should I have been able to predict that Block would work?

Funnily enough many workarounds have been suggested to me by those more experienced than I, but nobody suggested using Block.

Finally, I need to keep vmax and km local.(They have been defined algebraically elsewhere)

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-22T21:36:10+00:00Added an answer on May 22, 2026 at 9:36 pm

    Your question is not so much about Plot as it is about how the scoping constructs work. The main confusion here is due to the differences between lexical and dynamic scoping. And the main culprit is this definition:

    f[x_] := (vmax x)/(km + x)
    

    The problem with it is that it makes f implicitly depend on the global symbols (variables) vmax and km. I am very much against this sort of constructs since they lead to infinite confusion. Now, what happens can be illustrated with the following example:

    In[55]:= With[{vmax =1, km = 2},f[x]]
    
    Out[55]= (vmax x)/(km+x)
    

    To understand why this happens, one must understand what the lexical scoping means. We know that With has a HoldAll attribute. The way it works is that it looks are what is literally inside it, and substitutes variables found literally in the body with their values from the declaration list. This happens during the variable-binding stage, and only then it lets the body to evaluate. From this, it is clear that the following will work:

    In[56]:= With[{vmax =1, km = 2},Evaluate[f[x]]]
    
    Out[56]= x/(2+x) 
    

    This worked because Evaluate overrides the “part” of HoldAll attribute of With, forcing the body to evaluate before anything else (variable binding, and subsequent body evaluation). Therefore, it would be completely equivalent to use just With[{vmax = 1, km = 2}, (vmax x)/(km + x)] above, as you can see with Trace. The next part of the puzzle is why

    With[{vmax = 10, km = 10}, Plot[Evaluate@f[x], {x, 0, 100}, AxesOrigin -> {0, 0}]]
    

    does not work. This is because this time we do not evaluate the body first. The presence of Evaluate affects only f[x] inside Plot, but not the evaluation of Plot itself inside With. This is illustrated by

    In[59]:= With[{vmax = 10, km = 10}, q[Evaluate@f[x]]]
    
    Out[59]= q[(vmax x)/(km + x)]
    

    Moreover, we do not want Plot to evaluate first, since then the values of vmax and km will not be defined. However, all that With sees is f[x], and since the parameters vmax and km are not literally present in there (lexical scoping, remember), no substitution will be made. Should we use Block here, and things will work, because Block uses dynamic scoping, meaning that it redefines values in time (part of the execution stack if you wish), rather than in place. Therefore, using Block[{a =1, b =2}, ff[x]] where ff implicitly depends on a and b is (roughly) equivalent to a=1;b=2;ff[x] (with the difference that a and b resume their global values after the Block scope is left). So,

    In[60]:= Block[{vmax = 10, km = 10}, q[Evaluate@f[x]]]
    
    Out[60]= q[(10 x)/(10 + x)]
    

    To make the With version work, you’d have to inject the expression for f[x] (r.h.s), for example like so:

    In[63]:= Unevaluated[With[{vmax = 10, km = 10}, q[f[x]]]] /. DownValues[f]
    
    Out[63]= q[(10 x)/(10 + x)]
    

    Note that this won’t work:

    In[62]:= With[{fx = f[x]}, With[{vmax = 10, km = 10},  q[fx]]]
    
    Out[62]= q[(vmax x)/(km + x)]
    

    But the reason here is quite subtle: while outer With evaluates before the inner one, it spots the variable name conflicts and renames its variables. Rules are much more disruptive, they don’t respect inner scoping constructs.

    EDIT

    If one insists on nested With-s, here is how one can fool the name conflict resolution mechanism of With and make it work:

    In[69]:= With[{fx = f[x]}, With @@ Hold[{vmax = 10, km = 10}, q[fx]]]
    
    Out[69]= q[(10 x)/(10 + x)]
    

    Since outer With can no longer detect the presence of inner With (using Apply[With,Hold[...]] makes the inner With effectively dynamically generated), it does not make any renamings, and then it works. This is a general trick to fool lexical scoping name resolution mechanism when you don’t want renaming, although the necessity to use it usually indicates a bad design.

    END EDIT

    But I digressed. To summarize, making your second method work is quite hard and requires really weird constructs like

    Unevaluated[ With[{vmax = 10, km = 10}, Plot[Evaluate@f[x], {x, 0, 100},
         AxesOrigin -> {0, 0}]]] /.  DownValues[f]
    

    or

    With[{fx = f[x]}, 
       With @@ Hold[{vmax = 10, km = 10}, 
           Plot[Evaluate@fx, {x, 0, 100}, AxesOrigin -> {0, 0}]]]
    

    Once again: all this is because With must “see” the variables explicitly in the code, to make replacements. In contrast, Block does not need that, it replaces values dynamically at the moment of evaluation, based on their modified global values, as if you made assignments, this is why it works.

    Now, the real culprit is your definition of f. You could have avoided all these troubles should you have defined your f with explicit parameter-passing:

    ff[x_, vmax_, km_] := (vmax x)/(km + x)
    

    Now, this works out of the box:

    With[{vmax = 10, km = 10}, 
       Plot[Evaluate@ff[x, vmax, km], {x, 0, 100}, AxesOrigin -> {0, 0}]]
    

    because the parameters are explicitly present in the function call signature, and so are visible to With.

    To summarize: what you observed is a consequence of the interplay between lexical and dynamic scoping. Lexical scoping constructs must “see” their variables explicitly in the code at the variable-binding stage (before evaluation), or they won’t be effective. Dynamic scoping effectively modifies values of symbols, and is in this sense less demanding (the price you pay is that the code using lots of dynamic scoping is harder to understand, since it mixes state and behavior). The main reason for trouble is the function definition that makes implicit dependencies on global symbols (that are not in the formal parameter list of the function). It is best to avoid such constructs. It is still possible to make things work, but this is considerably more complicated (as was demonstrated above), and, at least for the case at hand, for no good reason.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I want to implement the solution using the pre-processor described here: Reuse define statement
I've done scaffolding using the method described here http://wiki.rubyonrails.org/rails/pages/ScaffoldGenerator However, I want to know
I want to create a Java application bundle for Mac without using Mac. According
I have an issue with a query I'm trying to run on some data,
I have been trying for quite a while to work out how to accomplish
i'm having a issue with the T4 templates for generating code. I'm wondering if
Having CSS layout issues with Internet Explorer 7 (big surprise). Upon using the Developer
I've been using git for some time now and understand how commits work, tags,
I want to describe an entity that can either function normally or be put
Greets to all! I want to describe each kind of product by a class:

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.