Permalänk
Medlem

Plotta data i Python?

Jag har en datafil (datafile.txt) innehållande 10 mätningar av temperatur, lufttryck resp. luftfuktighet. Värdena skall ritas upp i tre olika grafer i Python. Mitt script (inledning) ser ut enligt följande:

import serial, atexit
import time
import numpy as np
import matplotlib.pyplot as plt

f = open('datafile.txt')
print(f.read())

.......

Vilken/vilka funktioner i Python kan man använda för att plotta data?
Jag har läst lite om plt-funktionen men förstår inte riktigt hur den skall implementeras?!...

/nybörjare i Python-programmering

Permalänk
Medlem

plt.plot(x, y) är nog det du söker efter där du bara behöver specificera x- och y-värdena.

Permalänk
Medlem

Ska dina mätningar plottas mot tid? Hur ser din "datafile.txt" ut? Är det 10 rader med 3 kolumner? Isåfall skulle något såhär funka

measurements = []
t = np.linspace(0,10,10,dtype=int)
f = open("datafile.txt",'r')
data = f.read().splitlines()
f.close()
for row in data:
measurements.append(row)
plt.figure()
plt.plot(t,measurements[0],'or',label='temp')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

Permalänk
Medlem
Skrivet av Telixian:

plt.plot(x, y) är nog det du söker efter där du bara behöver specificera x- och y-värdena.

OK. Hur specificerar jag x- och y-värdena inom parentesen?
Min datafil ser ut så här:

Thu Nov 26 22:53:24 2020 19.53 1014.03 40.75
Thu Nov 26 22:53:28 2020 19.61 1013.99 40.44
Thu Nov 26 22:53:32 2020 19.69 1014.01 40.18
Thu Nov 26 22:53:37 2020 19.74 1013.99 39.97
Thu Nov 26 22:53:41 2020 19.78 1013.99 39.83
Thu Nov 26 22:53:45 2020 19.8 1013.99 39.72
Thu Nov 26 22:53:50 2020 19.82 1013.95 39.63
Thu Nov 26 22:53:54 2020 19.83 1013.97 39.57
Thu Nov 26 22:53:58 2020 19.84 1013.99 39.52
Thu Nov 26 22:54:03 2020 19.86 1013.97 39.47

Temperaturen står i kolumn nr 6, lufttrycket i kolumn nr 7, fuktighet i kolumn nr 8.
x = värden i kolumn nr 4, y1 = värden i kolumn nr 6 osv.
Data i kolumn nr 4 sparade som klockslag. Men för att göra det lite enklare kan man låta x-värdena gå från 1...10.

Jag har tidigare stor erfarenhet av att skapa grafer i MATLAB. Har däremot nollkoll på hur det fungerar i Python?...

Permalänk
Medlem
Skrivet av rspektral:

Ska dina mätningar plottas mot tid? Hur ser din "datafile.txt" ut? Är det 10 rader med 3 kolumner? Isåfall skulle något såhär funka

measurements = []
t = np.linspace(0,10,10,dtype=int)
f = open("datafile.txt",'r')
data = f.read().splitlines()
f.close()
for row in data:
measurements.append(row)
plt.figure()
plt.plot(t,measurements[0],'or',label='temp')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

Mina data finns sparade i en textfil med namn "datafile.txt". Så här ser min datamatris ut:

Thu Nov 26 22:53:24 2020 19.53 1014.03 40.75
Thu Nov 26 22:53:28 2020 19.61 1013.99 40.44
Thu Nov 26 22:53:32 2020 19.69 1014.01 40.18
Thu Nov 26 22:53:37 2020 19.74 1013.99 39.97
Thu Nov 26 22:53:41 2020 19.78 1013.99 39.83
Thu Nov 26 22:53:45 2020 19.8 1013.99 39.72
Thu Nov 26 22:53:50 2020 19.82 1013.95 39.63
Thu Nov 26 22:53:54 2020 19.83 1013.97 39.57
Thu Nov 26 22:53:58 2020 19.84 1013.99 39.52
Thu Nov 26 22:54:03 2020 19.86 1013.97 39.47

Temperaturen står i kolumn nr 6. Skall plottas mot tiden (klockslag) i kolumn nr 4. För att förenkla det hela så skulle man också kunna skapa en ny vektor där x-värdena går från 1...10.

Permalänk
Medlem
Skrivet av Placodontos:

Mina data finns sparade i en textfil med namn "datafile.txt". Så här ser min datamatris ut:

Thu Nov 26 22:53:24 2020 19.53 1014.03 40.75
Thu Nov 26 22:53:28 2020 19.61 1013.99 40.44
Thu Nov 26 22:53:32 2020 19.69 1014.01 40.18
Thu Nov 26 22:53:37 2020 19.74 1013.99 39.97
Thu Nov 26 22:53:41 2020 19.78 1013.99 39.83
Thu Nov 26 22:53:45 2020 19.8 1013.99 39.72
Thu Nov 26 22:53:50 2020 19.82 1013.95 39.63
Thu Nov 26 22:53:54 2020 19.83 1013.97 39.57
Thu Nov 26 22:53:58 2020 19.84 1013.99 39.52
Thu Nov 26 22:54:03 2020 19.86 1013.97 39.47

Temperaturen står i kolumn nr 6. Skall plottas mot tiden (klockslag) i kolumn nr 4. För att förenkla det hela så skulle man också kunna skapa en ny vektor där x-värdena går från 1...10.

Tänk på att i python så börjar index med 0 till skillnad från matlab där du börjar med 1. Annars är plottandet med matplotlib paketet exakt på samma sätt.
#### EDIT; plottade strängar istället för siffror så "castade" dem till floats i for loopen. Tog också bort klockslagen.
T = []
p = []
fukt = []
tid = np.linspace(0,10,10,dtype=int)

### Läser in varje rad i filen och lagrar i resp. lista.
f = open('input.txt')
data = f.read().splitlines()
for row in data:
____ rad = row.split() #lista med all data i en rad splittat med mellanslag
____ T.append(float(rad[5]))
____ p.append(float(rad[6]))
____ fukt.append(float(rad[7]))
f.close()

plt.figure()
plt.plot(tid, T, 'or') #plt.plot(tid,T,'r') om du vill ha linje istället för punkter.
plt.xlabel('tid')
plt.ylabel('temperatur')
plt.tight_layout()
plt.show()

Permalänk
Medlem
Skrivet av rspektral:

Tänk på att i python så börjar index med 0 till skillnad från matlab där du börjar med 1. Annars är plottandet med matplotlib paketet exakt på samma sätt.

T = []
p = []
fukt = []
tid = []

### Läser in varje rad i filen och lagrar i resp. lista.
f = open('input.txt')
data = f.read().splitlines()
for row in data:
____ rad = row.split() #lista med all data i en rad splittat med mellanslag
____ tid.append(rad[3])
____ T.append(rad[5])
____ p.append(rad[6])
____ fukt.append(rad[7])
f.close()

plt.figure()
plt.plot(tid, T, 'or')
plt.xlabel('tid')
plt.ylabel('temperatur')
plt.tight_layout()
plt.show()

Tack för uppföljande tips!
Jag förstår inte riktigt alla delar i ditt script?? Detta är för mig programmering på avancerad nivå.

data = f.read().splitlines() # Vad händer här?

rad = row.split() # Varför skapas denna variabel?

Sedan undrar jag hur funktionen 'append' fungerar?..

Jag känner igen de flesta kommandona i ditt script efter 'f.close()'. Vad innebär: 'plt.tight_layout()' resp. 'plt.show()' ??

Permalänk
Medlem
Skrivet av Placodontos:

Tack för uppföljande tips!
Jag förstår inte riktigt alla delar i ditt script?? Detta är för mig programmering på avancerad nivå.

1. data = f.read().splitlines() # Vad händer här?

2. rad = row.split() # Varför skapas denna variabel?

3. Sedan undrar jag hur funktionen 'append' fungerar?..

Jag känner igen de flesta kommandona i ditt script efter 'f.close()'. Vad innebär: 'plt.tight_layout()' resp. 'plt.show()' ??

1. Läser in filen och separerar rader ut till arrayen data så den kan gås igenom rad för rad i for-loopen. https://www.geeksforgeeks.org/python-string-splitlines/
2. Splittar (separerar) strängen som finns i row till en array som heter rad så man kan ta ut individuella fält, används när scriptet appendar. https://www.w3schools.com/python/ref_string_split.asp
3. p.append("hej") lägger till en rad i arrayen p med strängen "hej". https://www.w3schools.com/python/ref_list_append.asp

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.ti...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.sh...

Permalänk
Medlem
Skrivet av Placodontos:

Tack för uppföljande tips!
Jag förstår inte riktigt alla delar i ditt script?? Detta är för mig programmering på avancerad nivå.

data = f.read().splitlines() # Vad händer här?

rad = row.split() # Varför skapas denna variabel?

Sedan undrar jag hur funktionen 'append' fungerar?..

Jag känner igen de flesta kommandona i ditt script efter 'f.close()'. Vad innebär: 'plt.tight_layout()' resp. 'plt.show()' ??

Hej, jag hann edita koden innan du svarade; så titta gärna igen. Förklarar gärna delarna, det är inte jättekomplicerat. ^^

data = f.read().splitlines() #Här lagras det som du har i din fil i en lista. I det här fallet så blir det 10 element där varje element är en rad i din fil. I ditt fall här blir det:

data =
['Thu Nov 26 22:53:24 2020 19.53 1014.03 40.75',
'Thu Nov 26 22:53:28 2020 19.61 1013.99 40.44',
'Thu Nov 26 22:53:32 2020 19.69 1014.01 40.18',
'Thu Nov 26 22:53:37 2020 19.74 1013.99 39.97',
'Thu Nov 26 22:53:41 2020 19.78 1013.99 39.83',
'Thu Nov 26 22:53:45 2020 19.8 1013.99 39.72',
'Thu Nov 26 22:53:50 2020 19.82 1013.95 39.63',
'Thu Nov 26 22:53:54 2020 19.83 1013.97 39.57',
'Thu Nov 26 22:53:58 2020 19.84 1013.99 39.52',
'Thu Nov 26 22:54:03 2020 19.86 1013.97 39.47']

Sedan så loopar vi över varje rad i listan ovan:
rad = row.split() # Här separerar vi delarna i varje rad, där separationen mellan varje sker efter mellanslag, så första gången vi är inne i for loopen så har vi:
rad = ['Thu', 'Nov', '26', '22:53:24', '2020', '19.53', '1014.03', '40.75'].

Då vi i förväg skapade listorna för temperatur osv, så är de just nu tomma, e.g. T = [].
För att lägga till ett värde i en lista så använder vi metoden T.append(det du vill stoppa in) och på samma sätt blir första gången vi är i loopen att:
T = [19.53], vid andra gången T = [19.53, 19.61], etc tills vi har gått igenom alla rader. Tänk här att vår lista ovan innehåller strängar, dvs '19.53', för att "casta" om dem till siffror så använder du float('19.53'). Har du haft heltal hade det räckt med int('8') tex.

Vad innebär: 'plt.tight_layout()' resp. 'plt.show()' ?? # Detta är bara vana av mig sorry, tight_layout() gör bara plotten mer kompakt typ så inget viktigt, och plt.show() visar plotten men jag tror att den ska visas bara du kallar plt.plot() ändå så du kan ta bort dem ^^.

Permalänk
Medlem
Skrivet av rspektral:

Hej, jag hann edita koden innan du svarade; så titta gärna igen. Förklarar gärna delarna, det är inte jättekomplicerat. ^^

data = f.read().splitlines() #Här lagras det som du har i din fil i en lista. I det här fallet så blir det 10 element där varje element är en rad i din fil. I ditt fall här blir det:

data =
['Thu Nov 26 22:53:24 2020 19.53 1014.03 40.75',
'Thu Nov 26 22:53:28 2020 19.61 1013.99 40.44',
'Thu Nov 26 22:53:32 2020 19.69 1014.01 40.18',
'Thu Nov 26 22:53:37 2020 19.74 1013.99 39.97',
'Thu Nov 26 22:53:41 2020 19.78 1013.99 39.83',
'Thu Nov 26 22:53:45 2020 19.8 1013.99 39.72',
'Thu Nov 26 22:53:50 2020 19.82 1013.95 39.63',
'Thu Nov 26 22:53:54 2020 19.83 1013.97 39.57',
'Thu Nov 26 22:53:58 2020 19.84 1013.99 39.52',
'Thu Nov 26 22:54:03 2020 19.86 1013.97 39.47']

Sedan så loopar vi över varje rad i listan ovan:
rad = row.split() # Här separerar vi delarna i varje rad, där separationen mellan varje sker efter mellanslag, så första gången vi är inne i for loopen så har vi:
rad = ['Thu', 'Nov', '26', '22:53:24', '2020', '19.53', '1014.03', '40.75'].

Då vi i förväg skapade listorna för temperatur osv, så är de just nu tomma, e.g. T = [].
För att lägga till ett värde i en lista så använder vi metoden T.append(det du vill stoppa in) och på samma sätt blir första gången vi är i loopen att:
T = [19.53], vid andra gången T = [19.53, 19.61], etc tills vi har gått igenom alla rader. Tänk här att vår lista ovan innehåller strängar, dvs '19.53', för att "casta" om dem till siffror så använder du float('19.53'). Har du haft heltal hade det räckt med int('8') tex.

Vad innebär: 'plt.tight_layout()' resp. 'plt.show()' ?? # Detta är bara vana av mig sorry, tight_layout() gör bara plotten mer kompakt typ så inget viktigt, och plt.show() visar plotten men jag tror att den ska visas bara du kallar plt.plot() ändå så du kan ta bort dem ^^.

Tack så mycket för dina förklaringar! Nu förstår jag mkt bättre hur scriptet fungerar.
Jag har läst en del om Python-programmering i Erik Lindblads bok från 2006 (Studentlitteratur), boken lånad från Uppsala univ. bibliotek. I avsnitt 4.4.1 finns flera exempel hur man hanterar listor. Det står att metoden append används för att lägga till ett objekt sist i en lista.

En fundering när det gäller kommandot: rad = row.split()
Metoden split() delar alltså upp innehållet på varje rad i 10 olika delsträngar? Är det korrekt uppfattat?

Jag modifierade min python-kod i det avsnitt som berör grafiken.

-------------------

import serial, atexit
import time
import numpy as np
import matplotlib.pyplot as plt

T = []
p = []
fukt = []
tid = np.linspace(0,9,10,dtype=int)

# Läser in varje rad i filen och lagrar i resp. lista.
f = open('datafile.txt')
data = f.read().splitlines()
for row in data:
rad = row.split() #lista med all data i en rad splittat med mellanslag
T.append(float(rad[5]))
p.append(float(rad[6]))
fukt.append(float(rad[7]))
f.close()

plt.figure()
plt.plot(tid, T, 'xr')
plt.xlabel('tid')
plt.ylabel('temperatur')
plt.ylim(10.0, 14.0)
plt.xlim(0, 9)
plt.tight_layout()
plt.grid()
plt.show()

---------------

Här är resultatet av plotten:
Temperaturplot

Permalänk
Medlem

Använder Grafana till det

Permalänk
Medlem
Skrivet av iXam:

1. Läser in filen och separerar rader ut till arrayen data så den kan gås igenom rad för rad i for-loopen. https://www.geeksforgeeks.org/python-string-splitlines/
2. Splittar (separerar) strängen som finns i row till en array som heter rad så man kan ta ut individuella fält, används när scriptet appendar. https://www.w3schools.com/python/ref_string_split.asp
3. p.append("hej") lägger till en rad i arrayen p med strängen "hej". https://www.w3schools.com/python/ref_list_append.asp

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.ti...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.sh...

Tack för svar på mina frågor!
Punkt 3 är nu solklar i mitt huvud. Jag har lånat en bok om Python-programmering från Uppsala univ. bibliotek. I avsnitt 4.4.1 i Erik Lindblads bok från 2006 (Studentlitteratur) finns ett bra exempel som visar hur metoden append fungerar.

Har däremot lite svårt att se skillnaden mellan metoderna split() resp. splitlines()?

Permalänk
Medlem
Skrivet av Placodontos:

Har däremot lite svårt att se skillnaden mellan metoderna split() resp. splitlines()?

Splitlines splittar på "\n", "\r" (newline, carridge return) och split splittar på angiven separator. Och om ingen parameter ges så splittar den på "whitespace" (mellanslag,tab osv).

Ex :

txt = "apple#banana#cherry#orange" x = txt.split("#") print(x)

x blir arrayen ['apple', 'banana', 'cherry', 'orange']

Länkarna jag la till i mitt förra inlägg visar exempelkod.

Permalänk
Medlem

Inte jättestor skillnad, men split är mer avsett för enskilda rader eller på listor med exempelvis siffror istället, medan splitlines kör på newline tecken, '\n'. Sedan är det lite skillnad hur de hanterar tomma strängar, se nedan. Tanken är att om man läser något från exempelvis en fil som är helt tom, så ska inte splitlines säga att det är en tom rad, dvs "" först.

https://docs.python.org/3/library/stdtypes.html?highlight=spl...

>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']

For comparison, split('\n') gives:
>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']

Permalänk
Medlem
Skrivet av iXam:

Splitlines splittar på "\n", "\r" (newline, carridge return) och split splittar på angiven separator. Och om ingen parameter ges så splittar den på "whitespace" (mellanslag,tab osv).

Ex :

txt = "apple#banana#cherry#orange" x = txt.split("#") print(x)

x blir arrayen ['apple', 'banana', 'cherry', 'orange']

Länkarna jag la till i mitt förra inlägg visar exempelkod.

Tack för nytt inlägg 👍, då fick vi det utrett också!
Jag skall kolla igenom innehållet på länkarna i ditt förra inlägg.

Permalänk
Medlem
Skrivet av SkynetBuilder:

Inte jättestor skillnad, men split är mer avsett för enskilda rader eller på listor med exempelvis siffror istället, medan splitlines kör på newline tecken, '\n'. Sedan är det lite skillnad hur de hanterar tomma strängar, se nedan. Tanken är att om man läser något från exempelvis en fil som är helt tom, så ska inte splitlines säga att det är en tom rad, dvs "" först.

https://docs.python.org/3/library/stdtypes.html?highlight=spl...

>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']

For comparison, split('\n') gives:
>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']

Tack för lärorika exempel i mitt ämne.
Jag funderade lite på det sista fallet. Varför blir det två strängar i listan? Det finns väl ingen "whitespace" efter 'Two lines'?!...

Permalänk
Medlem
Skrivet av Placodontos:

Tack för lärorika exempel i mitt ämne.
Jag funderade lite på det sista fallet. Varför blir det två strängar i listan? Det finns väl ingen "whitespace" efter 'Two lines'?!...

\n (line feed-tecknet) klassas som whitespace.

EDIT: Det stämmer, men var nog inte rätt svar på frågan i och med att i exemplet var \n medskickad som sträng att splitta på.

Jag noterade också att man får rätt mycket borttrimmat om man använder split utan argument, vilket känns som upplagt för extra förvirring. Ex:

>>> " god natt ".split() ['god', 'natt'] >>> " god natt ".split(" ") ['', '', '', '', '', '', 'god', 'natt', '', '', '', '', '', '', '', '', '']