17 svar
155 visningar
lund 278
Postad: 3 dec 2020

Plotta en funktion med plt.plot()

Hej, jag försöker plotta nedanstående funktion i python:

import matplotlib.pyplot as plt

def plot_poly(p,x_start=-10,x_end=10,color='b'):
    
    lst_x = list(range(x_start, x_end + 1))
    print(lst_x)
    
    lst_y = [eval_poly(p,x) for x in lst_x]
    print(lst_y)
    
    return plt.plot(lst_y, lst_x, 'b')
    plt.show()

Men får endast ett felmeddelande, vad är det jag gör för fel?

Out[256]: [<matplotlib.lines.Line2D at 0x1274afeb0>]
Dr. G Online 5992
Postad: 3 dec 2020

Vad händer om du tar bort return?

lund 278
Postad: 3 dec 2020

Om jag tar bort return får jag endast ut de printade listorna, det vill säga:

[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[102, 83, 66, 51, 38, 27, 18, 11, 6, 3, 2, 3, 6, 11, 18, 27, 38, 51, 66, 83, 102]
Qetsiyah 4913 – Volontär digitala räknestugor
Postad: 3 dec 2020 Redigerad: 3 dec 2020

Du kan inte returna en plot sådär, plotstatementen måste stå ensam. Låt plt.show() stå inuti funktionen.

Felmeddelandet är namnet på en pekare till nåt i minnet, antagligen där plotfunktionen ligger. Jag är osäker. 

Tigster 252
Postad: 3 dec 2020

Du bör inte ha return där som Dr. G sa. Det returnerar det som står efter nyckelordet.

Har du lika många element i lst_x och lst_y? :)

Dr. G Online 5992
Postad: 3 dec 2020

Jag menade att de två sista raderna ska vara 

    plt.plot(lst_y, lst_x, 'b')
    plt.show()

I så fall kommer funktionen att printa två listor och visa en plot. 

Om du vill returnera något så kan du göra det efter plottandet. 

lund 278
Postad: 3 dec 2020
Dr. G skrev:

Jag menade att de två sista raderna ska vara 

    plt.plot(lst_y, lst_x, 'b')
    plt.show()

I så fall kommer funktionen att printa två listor och visa en plot. 

Om du vill returnera något så kan du göra det efter plottandet. 

Ja precis, det är så jag hade det kvar - tog endast bort return. Och då händer inget utöver att de två listorna visas tyvärr

lund 278
Postad: 3 dec 2020
Tigster skrev:

Du bör inte ha return där som Dr. G sa. Det returnerar det som står efter nyckelordet.

Har du lika många element i lst_x och lst_y? :)

Tack, har nu tagit bort return i min ordinarie funktion men utan framgång. Jag räknade dom precis och det var lika många element i lst_x som i lst_y.

Tigster 252
Postad: 3 dec 2020 Redigerad: 3 dec 2020

Det enda jag kan se att jag gjort annorlunda de gånger jag använt mig av matplotlib är att jag har x-värden först, plt.plot(x, y, color).. Borde inte vara det dock :/

 

Du kan ju prova att flytta det till main() dock, där hade jag min. Den kanske stänger plotten då du går ur funktionen? Finns bara i scope för din funktion dvs.

mp.plot(xValues, redValues, 'b')
mp.xlabel("Degrees")
mp.ylabel("Red value")
mp.show()
Aerius 510
Postad: 3 dec 2020

Testa något i stil med

funk = plot_poly(...)

plt.show()

 

Problemet är plt.plot() skapar ett objekt som försvinner när funktionen är klar. Ditt felmeddelande är inte ett felmeddelande. Det säger bara att det skapats ett objekt med den minnesadressen. Men eftersom det inte sparas någon stans kan den inte visas när du kör plt.show()

Visas ett tomt plotfönster eller inget fönster alls?

SeriousCephalopod 2155
Postad: 3 dec 2020 Redigerad: 3 dec 2020

Det du beskriver är inte ett felmeddelande, bara att plt.plot skapar ett objekt vilket den ska.

Return var helt klart problemet från början då en funktion alltid avbryts vid ett return-kommando. Inget som står efter return utförs.

Bäst att du laddar upp hur din nya kod efter att du tog bort return ser ut.

Dr. G Online 5992
Postad: 3 dec 2020

För mig så plottar den. Nu vet jag inte hur din funktion eval_poly(p,x) ser ut, så jag gjorde en egen. 

lund 278
Postad: 3 dec 2020
Dr. G skrev:

För mig så plottar den. Nu vet jag inte hur din funktion eval_poly(p,x) ser ut, så jag gjorde en egen. 

Jag får eventuellt kolla igenom min eval_poly() dock borde den inte vara felaktig då jag använt mig utan den i andra liknande uträkningar tidigare. Tack!

lund 278
Postad: 3 dec 2020
Aerius skrev:

Testa något i stil med

funk = plot_poly(...)

plt.show()

 

Problemet är plt.plot() skapar ett objekt som försvinner när funktionen är klar. Ditt felmeddelande är inte ett felmeddelande. Det säger bara att det skapats ett objekt med den minnesadressen. Men eftersom det inte sparas någon stans kan den inte visas när du kör plt.show()

Tack så mycket! Får testa detta!

Dr. G Online 5992
Postad: 3 dec 2020

Kan det vara så att plotten hamnar i ett fönster någonstans som du inte ser?

lund 278
Postad: 3 dec 2020 Redigerad: 3 dec 2020
Dr. G skrev:

Kan det vara så att plotten hamnar i ett fönster någonstans som du inte ser?

Ja så kan det mycket väl vara eftersom att det fungerade för dig så det är nog mes troligt att den hamnar i ett annat fönster, får undersöka detta först innan jag ändrar mer i kodningen. Har iallafall tagit bort return då detta verkade vara en faktor till att det inte blev rätt. Tack!

Aerius 510
Postad: 3 dec 2020

du kanske glömt skriva poly_plot() som ett anrop? Funktionen kanske aldrig körs.

Svara Avbryt
Close