17 svar
362 visningar
lund 529
Postad: 3 dec 2020 19:39

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 9339
Postad: 3 dec 2020 19:54

Vad händer om du tar bort return?

lund 529
Postad: 3 dec 2020 19:55

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 6503 – Livehjälpare
Postad: 3 dec 2020 20:12 Redigerad: 3 dec 2020 20:16

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 271
Postad: 3 dec 2020 20:14

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 9339
Postad: 3 dec 2020 20:16

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 529
Postad: 3 dec 2020 20:19
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 529
Postad: 3 dec 2020 20:20
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 271
Postad: 3 dec 2020 20:29 Redigerad: 3 dec 2020 20:32

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 504 – Fd. Medlem
Postad: 3 dec 2020 20:35

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

Qetsiyah 6503 – Livehjälpare
Postad: 3 dec 2020 20:36

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

SeriousCephalopod 2692
Postad: 3 dec 2020 20:37 Redigerad: 3 dec 2020 20:38

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 9339
Postad: 3 dec 2020 20:39

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 529
Postad: 3 dec 2020 20:47
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 529
Postad: 3 dec 2020 20:47
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 9339
Postad: 3 dec 2020 20:50

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

lund 529
Postad: 3 dec 2020 21:05 Redigerad: 3 dec 2020 21:06
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 504 – Fd. Medlem
Postad: 3 dec 2020 21:56

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

Svara Avbryt
Close