# Plotting multiple traces on a single plot in IJulia/Jupyter using a loop

Does any know how to add multiple traces to a plot in Jupyter?

The following code works fine in Juno. It generates a series of offset sine waves in the same plot.

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)

plot(x,y)

for i=1:10
oplot(x,y.+i/10)
end
``````

However, in Jupyter, no plot is produced. It seems anytime a cell ends in something other than the direct call for a plot, the plot does not show up when the cell is run.

Running Julia 1.0.3

Found a solution using a function. Not sure why the original does not work (maybe a scope related issue?).

Correction: the code below only worked once by accident, not sure what I did. For the correct implementation see Simon_Bollandâ€™s response below

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)

function tryplot()
plot(x,y)
for i=1:10
z=oplot(x,y.+i/10)
end
return z
end

tryplot()
``````

Still, if I try this code in Jupyter:

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)

plot(x,y)
println("Hello")
``````

The only output from running the cell is â€śHelloâ€ť. If anyone has any insight on why no plot shows up in the latter case it would be appreciated.

Jupyter defaults to only showing the last value in a cell

Try

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)

display(plot(x,y))
println("Hello")
``````

to force the plot to be shown

1 Like

Awesome. Thanks!. Now, any idea how to make that work in a loop so that all traces are plotting in the same plot?

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)

display(plot(x,y))
for i=1:10
display(oplot(x,y.+i/10))
end
println("Hello")
``````

The above generates 10 plots. All I need is the last one.

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)
p=nothing
for i=1:10
p=oplot(x,y.+i/10)
end
display(p)
println("Hello")
``````
1 Like

Excellent! Is the line below storing an array of svg images in p? If not, is there a way to do that so that the array elements (svg images) can be referenced/used elsewhere?

``````p=oplot(x,y.+i/10)
``````

This overwrites p with the plot so far on each loop. If you want all the intermediate plots you could set up an array and do p[i]=oplot(x,y.+i/10) but Iâ€™ve shut pc down for the night so canâ€™t look for correct element type - let me know if you need this and Iâ€™ll look tomorrow

Iâ€™m not finding the element type so any input you can provide tomorrow would be appreciated. Thanks!

Try this:

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)

p=Array{GR.SVG}(undef,1,11)
p[1]=plot(x,y)

for i=1:10
p[i+1]=oplot(x,y.+i/10)
end
display(p[1])
display(p[6])
display(p[11])
println("Hello")
``````
1 Like

Works great. Many thanks!

A quick addition for the benefit of anyone reading this later. A plot statement seems to be needed before the loop so the oplot function has an image to write over.

``````using GR

x=collect(0:0.1:2pi)
y=sin.(x)
p=nothing
plot(x,y)    #<===============
for i=1:10
p=oplot(x,y.+i/10)
end
display(p)
println("Hello")
``````