Ask Your Question
2

plotting multiple functions from a for loop

asked 2012-06-02 01:25:51 +0100

daniel.e2718 gravatar image

updated 2012-06-02 01:35:19 +0100

Here I link to a worksheet with which I'm having the darnedest trouble...

PlotTest

The code in the worksheet makes it easy to plot many similar plots, and this is a pretty organized way to do it. I got it to work once, but I changed something and made too many changes afterward to get it working again to undo back to my original code.

The problem is in the third cell, obviously. I want to assign to 'a' "plot all of the functions in the list funclist." I realize that they aren't functions, really (they aren't assigned names such as f0,f1,f2, etc), but I'll try to solve that another day. But anyway, how can I set this loop up to add all of these plots and dump them into an object? I need to be able to input 'a' and get a plot containing all of these.

As is evident from the worksheet, I can't use the operator += (though I swear I did the first time).

I would rather not to do it like this:

a = plotlist[0]
for i in range(1,len(plotlist)):
    a += plotlist[i]

Because that requires that I spread out the definition of 'a' and has an unnecessary amount of code. However, that seems to be the easiest way to do it.

But I would like to be able to do it in two lines of code --- for i in plotlist, add all these plots to this object. Or three lines, if I have to initialize 'a' beforehand (give it a type or whatever.)

edit retag flag offensive close merge delete

2 Answers

Sort by ยป oldest newest most voted
6

answered 2012-06-02 02:06:55 +0100

DSM gravatar image

updated 2012-06-02 02:10:17 +0100

I think you're going to be interested in list comprehensions and generator expressions.

Using listcomps, your code compresses to:

sage: funclist = [1/x^i for i in range(10)]
sage: plotlist = [f.plot((x, 1, 10)) for f in funclist]
sage: plot(plotlist)

(Note that I changed the x lower limit to make it look better.)

image description

[BTW, as for your ability to use "a += something", that was almost certainly because you already had an "a" floating around from before.]

If you want to one-line it:

plot([(1/x^i).plot((x, 1, 10)) for i in range(10)])
edit flag offensive delete link more

Comments

I'm very very new to Sage and programming in general; I only started looking at in like a week or so ago haha. Thanks for the answer! I probably would have done the same thing eventually after realizing how the immediate issue condensed to one line. And yeah, I thought the same thing about my having used successfully "a += i", though I'm not sure how I didn't get a TypeError, doubled a graph, or whatever. Oh well, unimportant.

daniel.e2718 gravatar imagedaniel.e2718 ( 2012-06-02 02:55:37 +0100 )edit
3

answered 2012-06-02 02:06:42 +0100

daniel.e2718 gravatar image

Even better! To achieve this in one line:

plot = sum(i for i in plotlist)
edit flag offensive delete link more

Comments

You should be able to do simply `plot = sum(plotlist)`. But since `plot` is a Sage function, it's better to not overwrite it.

Eviatar Bach gravatar imageEviatar Bach ( 2012-06-03 01:37:41 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

Stats

Asked: 2012-06-02 01:25:51 +0100

Seen: 2,442 times

Last updated: Jun 02 '12