Permalänk
Medlem

Vpython-grafer

Hejsan!
Jag är helt ny med Vpython och jag fick en uppgift som lyder såhär:

Folj introduktionen till VPython som finns pa sidan: http://vpython.
org/contents/docs/VPython_Intro.pdf. For att lara sig ett nytt bibliotek
ar det viktigt att bryta upp helheten i sma steg som ar latta att
felsoka, precis som i detta exempel.
2. Koden i VPython ar anvandbar for att kvalitativt illustrera simuleringens
forlopp i realtid. For fysikalisk data ar det daremot nodvandigt med grafer
som kvantitativt beskriver storheter, t.ex. positionens komponenter som
funktioner av tiden. For att lagga till en graf i VPython kan visual.graph
anvandas, se funktionen gcurve(...). Ett kanske vanligare alternativ ar
att spara datan och gora en graf i efterhand med t.ex. matplotlib, se
matplotlib.pyplot.plot(...) funktionen, som senare kan importeras i en
rapport eller artikel. Producera minst en lamplig graf for att beskriva
simuleringens resultat i en rapport.

Jag har gjort uppgift 1, det är alltså uppgift 2 jag har fastnat på. Kan någon hjälpa mig snälla?

Såhär långt har jag kommit med uppgift 1:

from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.cyan) ball2 = sphere(pos=(5,0,0), radius=1, color=(1,0.7,0.7)) wallR = box(pos=(6,0,0), size=(0.2,12,12), color=color.green) wallL = box(pos=(-6,0,0), size=(0.2,12,12), color=color.green) wallU = box(pos=(0,6,0), size=(12,0.2,12), color=color.blue) wallD = box(pos=(0,-6,0), size=(12,0.2,12), color=color.blue) wallB = box(pos=(0,0,-6), size=(12,12,0.2), color=color.red) ball.velocity = vector(25,5,15) ball2.velocity = vector(10,2,5) ball.acc = 2.5 deltat = 0.005 t = 0 vscale = 0.1 vscale2 = 0.5 varr = arrow(pos=ball.pos, axis=vscale*ball.velocity, color=color.yellow) varr2 = arrow(pos=ball2.pos, axis=vscale*ball2.velocity, color=color.magenta) ball.trail = curve(color=ball.color) ball2.trail = curve(color=ball2.color) scene.autoscale = False while True: rate(100) if ball.pos.x +0.5 > wallR.pos.x: ball.velocity.x = -ball.velocity.x if ball.pos.x -0.5 < wallL.pos.x: ball.velocity.x = -ball.velocity.x if ball.pos.y +0.5 < wallU.pos.y: ball.velocity.y = -ball.velocity.y if ball.pos.y -0.5 > wallD.pos.y: ball.velocity.y = -ball.velocity.y if ball.pos.z -0.5 < wallB.pos.z: ball.velocity.z = -ball.velocity.z if ball.pos.z +0.5 > 6: ball.velocity.z = -ball.velocity.z ball.pos = ball.pos + ball.velocity*deltat varr.pos = ball.pos varr.axis = vscale*ball.velocity ball.trail.append(pos=ball.pos) t = t + deltat if ball2.pos.x +1 > wallR.pos.x: ball2.velocity.x = -ball2.velocity.x if ball2.pos.x -1 < wallL.pos.x: ball2.velocity.x = -ball2.velocity.x if ball2.pos.y +1 < wallU.pos.y: ball2.velocity.y = -ball2.velocity.y if ball2.pos.y -1 > wallD.pos.y: ball2.velocity.y = -ball2.velocity.y if ball2.pos.z -1 < wallB.pos.z: ball2.velocity.z = -ball2.velocity.z if ball2.pos.z +1 > 6: ball2.velocity.z = -ball2.velocity.z ball2.pos = ball2.pos + ball2.velocity*deltat varr2.pos = ball2.pos varr2.axis = vscale2*ball2.velocity ball2.trail.append(pos=ball2.pos) t = t + deltat

och i uppgift 2 har jag kommit:

import matplotlib.pyplot as plt fig = plt.figure(facecolor='white') plt.title('XY plot') ax = fig.add_subplot(111) ax.set_xlabel('x') ax.set_ylabel('y') x=[1,2,3,4,5,6,7,8,9,10] y=[2,3,2,4,3,5,4,6,7,7] TextWindow = "label 1" plt.plot(x,y,c='blue',label=TextWindow) plt.legend(loc='upper right') plt.show()

Jag är oerhört tacksam för svar!!!

Lagt till Code-taggar /moderator
Permalänk
Medlem

Sätt koden inom forumets code-taggar så rätt intendering bibehålls vilket är "smått" viktigt för Python.

Permalänk
Hedersmedlem

@Fiskward

Jag har sammanfogat dina trådar då vi ej tillåter korspostning (flera trådar om samma ämne, se §3.3). Ifall man behöver hjälp med redigering av inlägg/trådstarten går det bra att antingen rapportera inlägget eller kontakta en moderator (vi bits inte ). Välkommen till Sweclockers!
/moderator

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk
Medlem

Ok då vet jag! Tack så mycket!

Permalänk
Medlem

@Fiskward

Vad är det du behöver hjälp med? Mycket lättare att få svar om du ställer en direkt fråga, istället för bara "hjälp mig!".

Är det något du inte fattar? Behöver du hjälp med din syntax? Är det uppgiften du inte förstår och behöver tolkningshjälp med?

Indenteringen stämmer inte heller på dina kodnuttar, OM folk skulle vilja kopiera och köra själv. Är ingen hejare på Python själv, men att indenteringen spelar roll, det vet jag...

Permalänk
Medlem

@thulin82:
Jo, så här är det. Jag har gjort en simulering av två bollar som studsar omkring i en låda och uppgiften jag fick är att göra en graf, alltså: Producera minst en lämplig graf för att beskriva simuleringens resultat i en rapport. Då kan man använda sig a matplotlib vilket jag har försökt göra, men det blir ingen graf. För det ska komma upp två rutor när man kör programmet, en där man ser bollarna studsa omkring (vilket jag får) och en annan där man ser grafen (vilket jag inte får). Eller, det är vad jag tror ska hända.
Här är uppgiften: https://mondo.su.se/access/content/group/bcfdf1ac-072e-44cb-9...
Det är uppgift 2 alltså!

Permalänk
Medlem

@Fiskward

Att länka till en uppgift som kräver inloggning är inte heller något som hjälper dig att få ett svar...

Får du något felmeddelande när du kör uppgift 2?

Utan att veta hur matplotlib fungerar så ser det ut som att du bara sätter upp din graf, utan att rita upp något.

Permalänk
Medlem

@thulin82: Hej! Detta är felmeddelandet:

Traceback (most recent call last):
File "C:\Users\TEDDY\Documents\EdvardMotzi.py", line 2
import matplotlib.pyplot as plt
ImportError: No module named matplotlib.pyplot

Jag har laddat ner matplotlib och alla verktyg jag fått för uppgiften...

Permalänk
Medlem

Fast eftersom det smäller redan i din import av modulen så lär du inte komma så mycket längre...
Börja med att lösa det

Permalänk
Medlem

@thulin82: Hej!

Jag har laddat ner matplotlib och nu så fick jag denna error:

Traceback (most recent call last):
File "C:\Users\TEDDY\Documents\EdvardMotzi.py", line 2
import matplotlib.pyplot as plt
File "C:\Python32\lib\site-packages\matplotlib\__init__.py", line 105
import six
ImportError: No module named six

vad kan detta bero på?

Permalänk
Medlem

Såhär långt har jag kommit nu!

Traceback (most recent call last):
File "C:\Users\TEDDY\Documents\EdvardMotzi.py", line 2
import matplotlib.pyplot as plt
File "C:\Python32\lib\site-packages\matplotlib\__init__.py", line 138
import pyparsing
File "C:\Users\TEDDY\Documents\pyparsing.py", line 1557
print t
^
SyntaxError: invalid syntax

vet du vilket problemet kan vara nu? jag laddade ner six, dateutil, pyparsing och pytz från internet, då kom jag hit

Permalänk
Medlem

Om man kollar på instruktionerna för din modul:
http://matplotlib.org/users/installing.html

Så kan du läsa följande

For standard Python installations you will also need to install compatible versions of setuptools, numpy, python-dateutil, pytz, pyparsing, and cycler in addition to matplotlib.

edit: och nej, jag kan ej python mer än väldigt basic. Men google tar en rätt så långt...

Permalänk
Medlem
Skrivet av Fiskward:

...
File "C:\Users\TEDDY\Documents\pyparsing.py", line 1557
print t
^
SyntaxError: invalid syntax

vet du vilket problemet kan vara nu? jag laddade ner six, dateutil, pyparsing och pytz från internet, då kom jag hit

Om du kör python 3 så behöver du parenteser, *print(t)*. Annars kan det vara ett följdfel av satsen innan. Jag ser inte denna print-rad i din kod så kan inte säga så mycket mer...

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Medlem

Vi kan ta det från början. För att använda matplotlib så måste du ladda ner det. Matplotlib har sedan i sin tur en del moduler som den behöver för att allting ska fungera.

Först och främst, hur har du installerat matplotlib hitills? Kör du med python 2 eller python 3? Att du får syntax error på "print t" antyder att du kör python 3 men har installerat någon av modulerna till python 2.

Det du vill göra när du installerar program till python är att installera med pip. Pip är helt enkelt en pakethanterare till python och du kan installera paket med ett kommando. pip ska vara installerat med python om du har en nog ny version.

Du kör helt enkelt:

python -m pip install matplotlib

Då får du också alla dependencies.

Skrivet av Gräs-Mannen:

Om du kör python 3 så behöver du parenteser, *print(t)*. Annars kan det vara ett följdfel av satsen innan. Jag ser inte denna print-rad i din kod så kan inte säga så mycket mer...

Som du ser så inträffar felet när pyparsing importeras vilket tyder på att han har pyparsing till python 2 och inte till python 3.

Permalänk
Medlem

VPython-Win-Py3.2-5.74.exe 19-Aug-2015 13:30 12M
[TXT] get-pip.py 19-Aug-2015 13:44 1.4M
[TXT] install.txt 02-Sep-2015 21:06 1.0K
[ ] matplotlib-1.4.3.win32-py3.2.exe 19-Aug-2015 13:30 3.8M
[ ] python-3.2.5.msi 19-Aug-2015 13:30 17M
[ ] scipy-0.15.1-win32-superpack-python3.2.exe 19-Aug-2015 13:30 58M

dessa har jag installerat enligt skolans rekommendationer.

och i install.txt står det:

First copy all files to a known directory on you windows computer.

Install python using the win32 exe binaries by clicking on them:
python-3.2.5
matplotlib-1.4.3
vpython-5.74
scipy-0.15.1

To get the remaining extra packages:

Go to the windows search box in the lower left corner and type "cmd".
You should now have a command promt window open.
Set the path with: "path=%path%;c:\python32;c:\python32\scripts".
Make sure you are in the same directory as the downloaded "get-pip.py" file.
You can list files with "dir", and change directory with "cd".
type: "python get-pip.py"
type: "pip install six"
type: "pip install python-dateutil"
type: "pip install pyparsing"
type: "pip install pytz"
type: "exit"

Permalänk
Medlem
Skrivet av Fiskward:

VPython-Win-Py3.2-5.74.exe 19-Aug-2015 13:30 12M
[TXT] get-pip.py 19-Aug-2015 13:44 1.4M
[TXT] install.txt 02-Sep-2015 21:06 1.0K
[ ] matplotlib-1.4.3.win32-py3.2.exe 19-Aug-2015 13:30 3.8M
[ ] python-3.2.5.msi 19-Aug-2015 13:30 17M
[ ] scipy-0.15.1-win32-superpack-python3.2.exe 19-Aug-2015 13:30 58M

dessa har jag installerat enligt skolans rekommendationer.

och i install.txt står det:

First copy all files to a known directory on you windows computer.

Install python using the win32 exe binaries by clicking on them:
python-3.2.5
matplotlib-1.4.3
vpython-5.74
scipy-0.15.1

To get the remaining extra packages:

Go to the windows search box in the lower left corner and type "cmd".
You should now have a command promt window open.
Set the path with: "path=%path%;c:\python32;c:\python32\scripts".
Make sure you are in the same directory as the downloaded "get-pip.py" file.
You can list files with "dir", and change directory with "cd".
type: "python get-pip.py"
type: "pip install six"
type: "pip install python-dateutil"
type: "pip install pyparsing"
type: "pip install pytz"
type: "exit"

Okej, om du startar python via cmd, vilket version av python startas?

Som vanlig kör skolorna fett gamla python vilket gör det drygt att installera andra paket. Dessutom förstår jag inte varför ni inte installerar allting via pip. Det är rätt typiskt att få sådana här problem när man installerar vissa saker med .exe filer och andra inte.

Permalänk
Medlem

det är väl python 3.2 som kommer tror jag, för det är väl den jag laddade ner?

Permalänk
Medlem
Skrivet av Fiskward:

det är väl python 3.2 som kommer tror jag, för det är väl den jag laddade ner?

Tro är inte samma sak som att veta. Anledningen till att jag frågar är för att paketen du laddat ner med pip verkar vara för python 2 och inte för python 3. Därav syntax felet vid "print t".

Edit: Never mind, sökt bara på google efter felet och det är en bugg i pyparsing 2.0.4: https://github.com/matplotlib/matplotlib/pull/5346.

Du måste alltså uppgradera pyparsing. Det borde fungera med

python -m pip install --upgrade pyparsing

eftersom 2.0.5 släpptes i November och jag får upp 2.0.7 med nyaste versionen i pip.

Permalänk
Medlem

jag testade den där som du skickade och fick igen invalid syntax och den klagade på print t

Permalänk
Medlem

Den sista idén jag har (om du testat det sista jag skrev) är att uppdatera pip eftersom du säkert har laddat ner en gammal version. Om du kör

python -m pip install --upgrade pip

och sedan uppgraderar pyparsing så borde det fungera.

Permalänk
Medlem

Inte för att låta dum (jag kan verkligen inget om python o sånt) men var skriver jag in "python -m pip install --upgrade pip"

Permalänk
Medlem
Skrivet av Fiskward:

Inte för att låta dum (jag kan verkligen inget om python o sånt) men var skriver jag in "python -m pip install --upgrade pip"

På samma sätt som du körde pip förut, dvs i cmd. Har man pip i in PATH kan man även köra bara pip direkt utan att blanda in python.

Permalänk
Medlem

alltså, jag har försökt göra allt men det kommer bara invalid syntax varje gång. jag vet inte vad jag ska göra...

Permalänk
Medlem
Skrivet av Fiskward:

alltså, jag har försökt göra allt men det kommer bara invalid syntax varje gång. jag vet inte vad jag ska göra...

Kan du snälla skriva exakt vad du gör och vad du får tillbaka?

Permalänk
Medlem

först skriver jag in i cmd:

path=%path%;c:\python32;c:\python32\scripts

sen skriver jag in

python get-pip.py

då kommer ett felmeddelande: can't open file python get-pip.py: [errno 2] no such file or directory

sen skriver jag in:

pip install six
pip install python-dateutil
pip install pyparsing
pip install pytz

dessa fungerar

och sen skriver jag in exit

Permalänk
Medlem
Skrivet av Fiskward:

först skriver jag in i cmd:

path=%path%;c:\python32;c:\python32\scripts

sen skriver jag in

python get-pip.py

då kommer ett felmeddelande: can't open file python get-pip.py: [errno 2] no such file or directory

sen skriver jag in:

pip install six
pip install python-dateutil
pip install pyparsing
pip install pytz

dessa fungerar

och sen skriver jag in exit

1. Om du får ett delmeddelandet betyder det att allting inte är OK, du kan inte bara ignorera detta. I detta fallet så spelar det ingen roll eftersom att pip redan är installerat vilket raden "python get-pip.py" gör.
2. I ovan nämnda text får du ju inte alls felet "invalid syntax".
3. Kör kommandona som jag skrivit i cmd: python -m pip install --upgrade pip och sedan python -m pip install --upgrade pyparsing

Permalänk
Medlem

ska jag skriva in efter path=%path%;c:\python32;c:\python32\scripts?
och jag fick invalid syntax efter jag skrev in python -m pip install --upgrade pip och python -m pip install --upgrade pyparsing, men det var ju tidigare, jag kan testa igen

edit: när jag skrev in upgrade pip då kom invalid syntax

Permalänk
Medlem
Skrivet av Fiskward:

ska jag skriva in efter path=%path%;c:\python32;c:\python32\scripts?
och jag fick invalid syntax efter jag skrev in python -m pip install --upgrade pip och python -m pip install --upgrade pyparsing, men det var ju tidigare, jag kan testa igen

Ja, men på en egen rad då. Testa skriv in igen och om det inte fungerar så skriver du här vilket fel den ger.

Permalänk
Medlem

det kommer upp ganska mycket text som jag inte kan copy-pastea men i slutet står det invalid syntax

Permalänk
Medlem

@kobb3:

vet du vad, skulle du kunna göra en tjänst? det verkar ju som att min dator inte kan läsa mitt program, skulle inte du kunna testa mitt program och kolla om det kommer en graf? för att uppgiften var att få en graf av bollarna. och jag kan ju inte öppna grafen, så skulle du kunna bara testa snabbt om det fungerar?
jag skulle vara otroligt tacksam

from visual import * # must import visual or vis first import matplotlib.pyplot as plt ball = sphere(pos=(-5,0,0), radius=0.5, color=color.cyan) ball2 = sphere(pos=(5,0,0), radius=1, color=(1,0.7,0.7)) wallR = box(pos=(6,0,0), size=(0.2,12,12), color=color.green) wallL = box(pos=(-6,0,0), size=(0.2,12,12), color=color.green) wallU = box(pos=(0,6,0), size=(12,0.2,12), color=color.blue) wallD = box(pos=(0,-6,0), size=(12,0.2,12), color=color.blue) wallB = box(pos=(0,0,-6), size=(12,12,0.2), color=color.red) ball.velocity = vector(25,5,15) ball2.velocity = vector(10,2,5) ball.acc = 2.5 deltat = 0.005 t = 0 vscale = 0.1 vscale2 = 0.5 varr = arrow(pos=ball.pos, axis=vscale*ball.velocity, color=color.yellow) varr2 = arrow(pos=ball2.pos, axis=vscale*ball2.velocity, color=color.magenta) ball.trail = curve(color=ball.color) ball2.trail = curve(color=ball2.color) scene.autoscale = False ballXpos = [] #Här startas listan ballXpos tid = [] #Här startas listan tid while True: rate(100) if ball.pos.x +0.5 > wallR.pos.x: ball.velocity.x = -ball.velocity.x if ball.pos.x -0.5 < wallL.pos.x: ball.velocity.x = -ball.velocity.x if ball.pos.y +0.5 < wallU.pos.y: ball.velocity.y = -ball.velocity.y if ball.pos.y -0.5 > wallD.pos.y: ball.velocity.y = -ball.velocity.y if ball.pos.z -0.5 < wallB.pos.z: ball.velocity.z = -ball.velocity.z if ball.pos.z +0.5 > 6: ball.velocity.z = -ball.velocity.z ballXpos.append(ball.pos.x) #Här lägger jag värden i listan tid.append(t) #Här lägger jag värden i listan ball.pos = ball.pos + ball.velocity*deltat varr.pos = ball.pos varr.axis = vscale*ball.velocity ball.trail.append(pos=ball.pos) t = t + deltat if ball2.pos.x +1 > wallR.pos.x: ball2.velocity.x = -ball2.velocity.x if ball2.pos.x -1 < wallL.pos.x: ball2.velocity.x = -ball2.velocity.x if ball2.pos.y +1 < wallU.pos.y: ball2.velocity.y = -ball2.velocity.y if ball2.pos.y -1 > wallD.pos.y: ball2.velocity.y = -ball2.velocity.y if ball2.pos.z -1 < wallB.pos.z: ball2.velocity.z = -ball2.velocity.z if ball2.pos.z +1 > 6: ball2.velocity.z = -ball2.velocity.z ball2.pos = ball2.pos + ball2.velocity*deltat varr2.pos = ball2.pos varr2.axis = vscale2*ball2.velocity ball2.trail.append(pos=ball2.pos) t = t + deltat from visual.graph import * # import graphing features f1 = gcurve(color=color.cyan) # a graphics curve for x in arange(0, 8.05, 0.1): f1.plot(pos=ball.pos) # plot """ Här skrivs ut en plot med bollens x-position över tid. """ fig = plt.figure(facecolor='white') plt.title('XY plot') ax = fig.add_subplot(111) ax.set_xlabel('x') ax.set_ylabel('y') x=tid #Här anger jag x-axis som tid y=ballXpos #Här anger jag y-axis som ballXpos TextWindow = "label 1" plt.plot(x,y,c='blue',label=TextWindow) plt.legend(loc='upper right') plt.show()