Opened 10 years ago
Last modified 7 years ago
#11500 new defect
Problem with accumulating 3D plots over a parameter
Reported by: | travis | Owned by: | jason, was |
---|---|---|---|
Priority: | minor | Milestone: | sage-6.4 |
Component: | graphics | Keywords: | plot3d |
Cc: | kcrisman | Merged in: | |
Authors: | Reviewers: | ||
Report Upstream: | N/A | Work issues: | |
Branch: | Commit: | ||
Dependencies: | Stopgaps: |
Description (last modified by )
When creating several layers that interpolate between two surfaces, only one layer is output when accumulating the layers via a loop. No problem if the layers are explicitly coded.
In the looped version, it appears that the plot3d commands are only executed at show() time and therefore only use the final value of the loop parameter. All of the layers are created on top of each other at that final parameter value.
This works:
P += plot3d(lambda x,y: H(x,y,tiers[2]/10),(x,-1,1),(y,-1,1),opacity=0.2)
P += plot3d(lambda x,y: H(x,y,tiers[5]/10),(x,-1,1),(y,-1,1),opacity=0.2)
P += plot3d(lambda x,y: H(x,y,tiers[8]/10),(x,-1,1),(y,-1,1),opacity=0.2)
show(P)
This does not:
for r in ratios:
P += plot3d(lambda x,y: H(x,y,r),(x,-1,1),(y,-1,1),opacity=0.2) # layer
show(P)
Example worksheet is attached.
Attachments (1)
Change History (11)
Changed 10 years ago by
comment:1 Changed 10 years ago by
- Cc kcrisman added; krisman removed
comment:2 Changed 10 years ago by
comment:3 Changed 10 years ago by
I don't think there is any guarantee that the function is actually executed when the plot3d command is called, is there? You are exposing this because the lambda function does not create a new scope. If instead you use a def function instead of a lambda function, things should work fine.
I agree that it is confusing. I'm trying to decide if it is "wrong".
I've published this worksheet here: http://sagenb.org/home/pub/2823/
comment:4 Changed 10 years ago by
Okay, after thinking about it and discussing this with KDC, I think the current behavior is wrong. I agree with kcrisman that the plot3d command should "freeze" the variables by creating a closure (or a fast_callable object) when it stores the function.
comment:5 Changed 10 years ago by
- Description modified (diff)
comment:6 Changed 9 years ago by
- Component changed from notebook to graphics
- Owner changed from jason, mpatel, was to jason, was
comment:7 Changed 8 years ago by
- Milestone changed from sage-5.11 to sage-5.12
comment:8 Changed 7 years ago by
- Milestone changed from sage-6.1 to sage-6.2
comment:9 Changed 7 years ago by
- Milestone changed from sage-6.2 to sage-6.3
comment:10 Changed 7 years ago by
- Milestone changed from sage-6.3 to sage-6.4
John, try to copy a minimal example with code so that people don't have to upload it to look at this ticket :) Thanks for getting the spelling right :)