Leo
Leo

Reputation: 113

Using julia's PyPlot shows the address of the image instead of the image

I wrote a least squares method in Julia, and the following information is prompted when I want to draw a graph.(In jupyter in Vscode and includes the julia extension.)

PyObject <matplotlib.collections.PathCollection object at 0x00000000017978E0>

I have added the show() command, but it doesn't output the picture either, giving the following prompt.

UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

All codes are as follows.

using PyPlot
function leastsqfit(x::Array,y::Array,n)
    m=length(x)
    d=n+1
    A,b=zeros(d,d),zeros(d,1)
    p=Array{Float64}(undef,2*n+1)
    for k in 1:d
        sum=0
        for i in 1:m
            sum=sum+y[i]*x[i]^(k-1)
        end
        b[k]=sum
    end
    p[1]=m
    for i in 2:2*n+1
        sum =0
        for j in 1:m
            sum=sum+x[j]^(i-1)
        end
        p[i]=sum
    end
    for k in 1:d
        for j in k:d
            A[k,j]=p[k+j-1]
        end
    end
    for i in 2:d
        for j in 1:i-1
            A[i,j]=A[j,i]
        end
    end
    a=A\b
end
function poly(x,A::Array)
    d,sum=length(A),0
    for i in 1:d
        sum=sum+A[i]*x^(i-1)
    end
    return sum
end
function SSE(A::Array,x::Array,y::Array)
    m,sum=length(y),0
    for i in 1:m
        sum=sum+(y[i]-poly(x[i],a))^2
    end
    return sum
end
function Pollt(x::Array,y::Array,n)
    n=length(x)
    a=leastsqfit(xd,yd,1)
    xaxis=x[1]:1/100:x[n]
    yvals=map(x->poly(x,a),xaxis)
    plot(xaxis,yvals)
    scatter(x,y)
end
xd=[1,2,3,4,5,6]
yd=[3,5,9.2,11,14.5,19]
a=leastsqfit(xd,yd,1)
display(a)
Pollt(xd,yd,1)
#show()

I'm a beginner in julia language, I don't know anything about the above problems, I hope you can help me.

Upvotes: 1

Views: 165

Answers (1)

Giovanni
Giovanni

Reputation: 293

to capture the figure you can add

gcf() at the end of Pollit this way the returned value will be the current figure and Jupyter will show it.

function Pollt(x::Array,y::Array,n)
    n=length(x)
    a=leastsqfit(xd,yd,1)
    xaxis=x[1]:1/100:x[n]
    yvals=map(x->poly(x,a),xaxis)
    plot(xaxis,yvals)
    scatter(x,y)
    gcf()
end

Otherwise also calling f = gcf() after colling Pollit will make f be the figure and Jupyter shouls show it when it is the last element of a cell or also calling display(f) at some point in the cell.

So also something like

function Pollt(x::Array,y::Array,n)
    n=length(x)
    a=leastsqfit(xd,yd,1)
    xaxis=x[1]:1/100:x[n]
    yvals=map(x->poly(x,a),xaxis)
    plot(xaxis,yvals)
    scatter(x,y)
    f = gcf()
    display(f)
    more_code...
end

Should work.

Upvotes: 1

Related Questions