# plotting multiple functions from a for loop

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 close merge delete

Sort by » oldest newest most voted

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.)

[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)])

more

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.

( 2012-06-01 19:55:37 -0500 )edit

Even better! To achieve this in one line:

plot = sum(i for i in plotlist)

more

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

( 2012-06-02 18:37:41 -0500 )edit