Problem plotting a function with plot()

39 views
Skip to first unread message

Jose Guzman

unread,
Mar 23, 2009, 6:10:37 PM3/23/09
to sage support
Dear Sage users and developers,

I am using Sage version 3.4 running on Linux/Debian. I am still not very
familiar with Sage though. I tried to plot the following equation:

sage: var('t'); # symbolic variable
sage: var('g'); # symbolic variable
sage: f(t) = g*(t**2-1)/(2*(t-1)) # try to simplify this function later...

Obviously the function is not defined at t=1. Returns (0/0)

sage: f(1).subs(g=9.81) # returns Division by 0

The problem comes when I try to plot the whole function f(t). By default
the plot is between -1 and +1.

sage: fig = plot(f.subs(g=9.81)) # substitute g by 9.81 , otherwise not
plotted
sage: show(fig)

even If I try to plot between the t=1 and t=10.

sage: show(fig,xmin=1,xmax=10)

The function is not plotted above x>1. . Is there any way to plot this
function above xmin=1?


Thank you very much in advance for your help

John H Palmieri

unread,
Mar 23, 2009, 6:31:07 PM3/23/09
to sage-support
On Mar 23, 3:10 pm, Jose Guzman <n...@neurohost.org> wrote:
> Dear Sage users and developers,
>
> I am using Sage version 3.4 running on Linux/Debian. I am still not very
> familiar with Sage though. I tried to plot the following equation:
>
> sage: var('t'); # symbolic variable
> sage: var('g'); # symbolic variable
> sage:  f(t) = g*(t**2-1)/(2*(t-1)) # try to simplify this function later...
>
> Obviously the function is not defined at t=1. Returns (0/0)
>
> sage: f(1).subs(g=9.81) # returns Division by 0
>
> The problem comes when I try to plot the whole function f(t). By default
> the plot is between -1 and +1.
>
> sage: fig = plot(f.subs(g=9.81)) # substitute g by 9.81 , otherwise not
> plotted
> sage: show(fig)

How about:

sage: fig = plot(f.subs(g=9.81), xmin=-1,xmax=1) + plot(f.subs
(g=9.81), xmin=1, xmax=10)

Actually,

sage: fig = plot(f.subs(g=9.81), xmin=-1,xmax=10)

seems to work, too.

John H Palmieri

unread,
Mar 23, 2009, 6:39:18 PM3/23/09
to sage-support
On Mar 23, 3:31 pm, John H Palmieri <jhpalmier...@gmail.com> wrote:
> On Mar 23, 3:10 pm, Jose Guzman <n...@neurohost.org> wrote:
>
>
>
>
>
> > Dear Sage users and developers,
>
> > I am using Sage version 3.4 running on Linux/Debian. I am still not very
> > familiar with Sage though. I tried to plot the following equation:
>
> > sage: var('t'); # symbolic variable
> > sage: var('g'); # symbolic variable
> > sage:  f(t) = g*(t**2-1)/(2*(t-1)) # try to simplify this function later...
>
> > Obviously the function is not defined at t=1. Returns (0/0)
>
> > sage: f(1).subs(g=9.81) # returns Division by 0
>
> > The problem comes when I try to plot the whole function f(t). By default
> > the plot is between -1 and +1.
>
> > sage: fig = plot(f.subs(g=9.81))

This is why you are getting a plot between -1 and 1: the plot command
expects xmin and xmax arguments, and if you don't specify any, it uses
xmin=-1 and xmax=1. From this point on, fig goes from -1 to 1, and
specifying different end points in show (for example) doesn't affect
the actual plot in fig.

By the way, if you type

sage: plot(f.subs(g=9.81), 0, 10)

then the plot will be displayed -- you don't need to save the plot and
then 'show' it.

Jose Guzman

unread,
Mar 23, 2009, 6:40:40 PM3/23/09
to sage-s...@googlegroups.com

wrote:
Hello John H Palmieri

That was it!, i had only to define a figure as combination of 2
different plot objects one from above x=1 and one bellow x=1 . Sage even
plots the small hole (0/0=indetermination) between the 2 graphics!!!
simply great.

thank you very much!


Greetings!

Jose Guzman

unread,
Mar 23, 2009, 6:45:06 PM3/23/09
to sage-s...@googlegroups.com
Once again thank you very much. As i wrote, I am not very familiar with
Sage and that's why I got so many mistakes (by the way it is very
difficult to find information even with the help command). The plot tip
is fantastic! I will use it from now on.

All the best

Jose.

Jose Guzman

unread,
Mar 24, 2009, 5:11:36 AM3/24/09
to sage-s...@googlegroups.com

>
> By the way, if you type
>
> sage: plot(f.subs(g=9.81), 0, 10)
>
> then the plot will be displayed -- you don't need to save the plot and
> then 'show' it.
>
>
>
I tried this and it works only with the console. If you use the notebook
you have to use the show() command. Anyway, thank you very much for the
tip!!1

Jose.

Stan Schymanski

unread,
Mar 24, 2009, 6:12:39 AM3/24/09
to sage-s...@googlegroups.com
The following displays a plot in my notebook (Sage3.4) if I put it all
in the same cell:

sage: var('t'); # symbolic variable
sage: var('g'); # symbolic variable
sage: f(t) = g*(t**2-1)/(2*(t-1)) # try to simplify this function later...
sage: plot(f.subs(g=9.81), 0, 10)

Does this not work for you?

Stan

Jose Guzman

unread,
Mar 24, 2009, 10:12:58 AM3/24/09
to sage-s...@googlegroups.com
Yes it works! for some strange reason it did not work in my old sheet. I
though to plot one should use a combination of plot() and show()
commands. Actually, I created a small tutorial for private use to learn
more about sage commands to plot, which talks about the use of plot()
and show(). I expected to use it for my future curse of Sage for
scientist in my institute. :P You can see in http://sagenb.org/home/pub/399



Jason Grout

unread,
Mar 24, 2009, 10:38:49 AM3/24/09
to sage-s...@googlegroups.com
Jose Guzman wrote:

> Yes it works! for some strange reason it did not work in my old sheet. I
> though to plot one should use a combination of plot() and show()
> commands. Actually, I created a small tutorial for private use to learn
> more about sage commands to plot, which talks about the use of plot()
> and show(). I expected to use it for my future curse of Sage for
> scientist in my institute. :P You can see in http://sagenb.org/home/pub/399


This looks great. Would you be willing to contribute it to Sage as a
"primer"? (A Sage primer is a short, focused exploration of a specific
functionality of Sage.)

Jason

Jason Grout

unread,
Mar 24, 2009, 10:44:00 AM3/24/09
to sage-s...@googlegroups.com
Jose Guzman wrote:

> Yes it works! for some strange reason it did not work in my old sheet. I
> though to plot one should use a combination of plot() and show()
> commands. Actually, I created a small tutorial for private use to learn
> more about sage commands to plot, which talks about the use of plot()
> and show(). I expected to use it for my future curse of Sage for
> scientist in my institute. :P You can see in http://sagenb.org/home/pub/399


In looking at your code, I had an idea about specifying colors. Why
don't we have some default color objects defined in Sage, like red,
blue, yellow, green, etc. Methods could include .darker(), .lighter(),
etc. So you could specify a plot as:

plot(x^2, (x,0,1), color=red)
plot(x^3, (x,0,1), color=blue.darker())
plot(x^4, (x,0,1), color=green.lighter())
plot(x^5, (x,0,1), color=red+blue) #gives purple :)

and then for the more esoteric names (all of the standard web colors,
all of the standard x11 colors, etc.), use the color namespace.

plot(sin(x), (x,0,1), color=color.goldenrod)

Thoughts?

Jason

Jose Guzman

unread,
Mar 24, 2009, 10:57:56 AM3/24/09
to sage-s...@googlegroups.com
Dear Jason,

I would be happy to contribute to any form with the
development/expansion of Sage :D. Feel free to use this document.
However, somebody would have to check it just before publishing. The
document is only a very short introduction, I was planning to add some
other features (ie. plot_list() ) and the 3D plotting capabilities of Sage.

You may want to have a look to the other worksheet I published online
about limit calculations, just enter: http://sagenb.org/home/pub/398/

As I commented before, I am planning to do a series of basic
documentation of that type related with Sage for scientific purposes.

Feel free to contact me any time.

Jose.

kcrisman

unread,
Mar 24, 2009, 11:19:08 AM3/24/09
to sage-support


> In looking at your code, I had an idea about specifying colors.  Why
> don't we have some default color objects defined in Sage, like red,
> blue, yellow, green, etc.  Methods could include .darker(), .lighter(),
> etc.  So you could specify a plot as:
>
> plot(x^2, (x,0,1), color=red)
> plot(x^3, (x,0,1), color=blue.darker())
> plot(x^4, (x,0,1), color=green.lighter())
> plot(x^5, (x,0,1), color=red+blue) #gives purple :)
>
> and then for the more esoteric names (all of the standard web colors,
> all of the standard x11 colors, etc.), use the color namespace.
>
> plot(sin(x), (x,0,1), color=color.goldenrod)

This sounds great; presumably it wouldn't be too hard to do, if very
annoying (particularly because some of the plot methods only allow
rgbcolor, others allow cmap options, etc.) - though what if I want red
to stand for some other Python/Sage object? And of course only
English colors would be there, and what about gray/grey ...

By the way, other readers of this thread please note:

sage: plot(x^2, (x,0,1), color='red')

works fine!

- kcrisman

Jose Guzman

unread,
Mar 24, 2009, 11:43:02 AM3/24/09
to sage-s...@googlegroups.com
I particularly like the rgbcolor notation. That's the only way I found
to have vector graphic environment (i.e inkscape) to match with
matplotlib or sage . On the other hand I usually use some kind of ...

plot (x**2, (0,1), rgbcolor=(0.5,0.5,0) ) # dark green

because I found the default green color (rgbcolor=(0,1,0)) looks too
brilliant with some beamers when you give a talk. Anyway, I tried with
rgbcolor='blue' ,'red','green','yellow','black','orange' and worked fine.

Jason Grout

unread,
Mar 24, 2009, 12:27:12 PM3/24/09
to sage-s...@googlegroups.com


Yes, I'm saying that in addition to being able to pass a tuple or
string, we'd be able to pass a sage color object.

Jason

William Stein

unread,
Mar 24, 2009, 1:29:02 PM3/24/09
to sage-s...@googlegroups.com

That's a great idea, which is why I implemented it over a year ago :-)

sage: C = Color('red') # a Sage color object
sage: C
RGB color (1.0, 0.0, 0.0)
sage: C.html_color()
'#ff0000'
sage: plot(x^2, (x,0,1), color=C)

I think the only strings allowed in the Color constructor are:

"red" : (1.0,0.0,0.0),
"orange": (1.0,.5,0.0),
"yellow": (1.0,1.0,0.0),
"green" : (0.0,1.0,0.0),
"blue" : (0.0,0.0,1.0),
"purple": (.5,0.0,1.0),
"white" : (1.0,1.0,1.0),
"black" : (0.0,0.0,0.0),
"grey" : (.5,.5,.5)

You can also use any html color strings.

To give the functionality you want, you could add methods "lighter()"
and "darker()" to the existing color object.

William

Jason Grout

unread,
Mar 24, 2009, 2:03:04 PM3/24/09
to sage-s...@googlegroups.com


So how about:

* predefining a bunch of colors in the global namespace (maybe just what
is available in the current strings?)
* predefining a huge number of colors, but sticking them in the colors
namespace
* making some nicely matched color sets (color schemes, if you will).
* make a generic mixing function (which takes the weighted average of
self and other, according to a specifiable fraction)
* make darker/lighter functions
* adding together colors averages them
* a linear combination takes a weighted average (hmmm...have to think
about how to do this one...maybe it'd make more sense to do a different
average?)

Here is what MMA does with colors:
http://reference.wolfram.com/mathematica/guide/Colors.html


Sounds like a great get-your-feet-wet student project...

Jason

William Stein

unread,
Mar 24, 2009, 2:06:27 PM3/24/09
to sage-s...@googlegroups.com
On Tue, Mar 24, 2009 at 11:03 AM, Jason Grout
I would say "-1", except Mathematica does that, and I'm for general
mathematica-style api compatibility. So I'm +1 on that.

> * predefining a huge number of colors, but sticking them in the colors
> namespace

I don't care...

> * making some nicely matched color sets (color schemes, if you will).
> * make a generic mixing function (which takes the weighted average of
> self and other, according to a specifiable fraction)

That sounds useful.

> * make darker/lighter functions

That couldn't hurt.

> * adding together colors averages them

That makes sense.

> * a linear combination takes a weighted average (hmmm...have to think
> about how to do this one...maybe it'd make more sense to do a different
> average?)

Well if you do A + B + C, then Python will do "A+B" then (A+B)+C, so
the previous point determines this one.

> Here is what MMA does with colors:
> http://reference.wolfram.com/mathematica/guide/Colors.html
>
>
> Sounds like a great get-your-feet-wet student project...
>
> Jason
>
>
> >
>



--
William Stein
Associate Professor of Mathematics
University of Washington
http://wstein.org

Robert Bradshaw

unread,
Mar 24, 2009, 4:07:06 PM3/24/09
to sage-s...@googlegroups.com

I like all your comments but this one--the global namespace is huge
enough as it is. Also, colors.* gives nice tab completion, etc. I
could be OK with the limited set defined above.

> * predefining a huge number of colors, but sticking them in the colors
> namespace
> * making some nicely matched color sets (color schemes, if you will).
> * make a generic mixing function (which takes the weighted average of
> self and other, according to a specifiable fraction)
> * make darker/lighter functions
> * adding together colors averages them
> * a linear combination takes a weighted average (hmmm...have to think
> about how to do this one...maybe it'd make more sense to do a
> different
> average?)
>
> Here is what MMA does with colors:
> http://reference.wolfram.com/mathematica/guide/Colors.html

+1. As well as rgb, we should offer hsb, hsv ways of constructing
colors.

- Robert


Jason Grout

unread,
Mar 24, 2009, 5:39:31 PM3/24/09
to sage-s...@googlegroups.com
Robert Bradshaw wrote:

>>
>> * predefining a bunch of colors in the global namespace (maybe just
>> what
>> is available in the current strings?)
>
> I like all your comments but this one--the global namespace is huge
> enough as it is. Also, colors.* gives nice tab completion, etc. I
> could be OK with the limited set defined above.
>
>> * predefining a huge number of colors, but sticking them in the colors
>> namespace
>> * making some nicely matched color sets (color schemes, if you will).
>> * make a generic mixing function (which takes the weighted average of
>> self and other, according to a specifiable fraction)
>> * make darker/lighter functions
>> * adding together colors averages them
>> * a linear combination takes a weighted average (hmmm...have to think
>> about how to do this one...maybe it'd make more sense to do a
>> different
>> average?)
>>
>> Here is what MMA does with colors:
>> http://reference.wolfram.com/mathematica/guide/Colors.html
>
> +1. As well as rgb, we should offer hsb, hsv ways of constructing
> colors.


Okay, see:

http://trac.sagemath.org/sage_trac/ticket/5601

http://trac.sagemath.org/sage_trac/ticket/5602

http://trac.sagemath.org/sage_trac/ticket/5603

http://trac.sagemath.org/sage_trac/ticket/5604

http://trac.sagemath.org/sage_trac/ticket/5605

If anyone wants to do these, feel free!

Jason

Reply all
Reply to author
Forward
0 new messages