In [4]:
%matplotlib inline 

title

Matplotlib: Plotting i python

Windows

Installasjon

Last ned fra www.python.org og start installasjonen, på en av sidene må dere velge "Add python 3.6 to PATH"

velg dette

Mac

Installasjon

Last ned fra www.python.org og start installasjonen.

pip pakkebehandler

pip er et program som følger med python og brukes til å installere moduler til python. pip3 er for python3

Installasjon på linux, Mac og lignende

Sålenge du har installert python og pip kan du åpne en terminal, cmd+shift på Mac. (Linux-brukere regner jeg med kan dette allerede)

sudo pip install matplotlib
sudo pip install numpy
sudo pip install pandas

Sålenge du har installert python og pip via moderne pakker. Trykk windows, skriv cmd.exe og kjør dette.

Pythonmoduler

pip.exe install matplotlib
pip.exe install numpy
pip.exe install pandas

Såfremt dette ikke feiler foregår resten i python-skallet, eller din valgte teksteditor

Kjør python enten fra terminal, eller start det som et vanlig program. Det skal se cirka slik ut: pythonskall

Importering

Som vanlig importerer vi, vi trenger en submodul fra matplotlib kalt pyplot.

In [5]:
from matplotlib import pyplot
from numpy import pi,e,exp,sin,cos,arange

Denne imiterer matlab. Neste steg er å ha noe data, dette kan være alt som er listeaktig, her lager jeg en range med data ved hjelp av arange fra numpy. Det er verd å merke seg at jeg bruker numpy sine funksjoner da de kan operere på mange data uten at jeg trenger løkker.

In [6]:
xs = arange(0,2*pi,0.01)
ys = []
for x in xs:
    ys.append(sin(x))
In [7]:
pyplot.plot(xs,ys)
pyplot.show()
pyplot.savefig("filnavn.pdf") # gyldige extensions hos meg er: eps, pdf, pgf, png, ps, raw, rgba, svg, svgz.
<matplotlib.figure.Figure at 0x10f57ba90>

Farger på linjer

In [8]:
# når du plotter en linje kan du også spesifisere farger og linjestil, 
# det finnes enda noen flere valg, men dette er de mest nyttige
pyplot.plot(xs,ys,linestyle="dashed",color="coral")
pyplot.title("Dette er en tittel")
pyplot.xlabel("Tid [s]")
pyplot.ylabel("Utsving [m]")
Out[8]:
<matplotlib.text.Text at 0x10faa9c88>

Objektorientert API

Vi har til nå brukt det som kalles pyplot-APIet til Matplotlib, fordi det er enkelt, en del eksempler frammover vil nå inneholde demonstrasjon av det objektorienterte APIet. Nå vil vi se at en figure, fig, er forksjellig fra aksen, ax, og at funksjonene som vi tidligere brukte på pyplot nå tilhører enten figuren, eller aksen.

Figure er det omsluttende objektet, det inneholder akser, akser inneholder plottede data.

In [9]:
fig,ax = pyplot.subplots()
ax.plot(xs,ys)
#fig.show() # husk denne linjen om du skriver et script eller i python-skallet. 
Out[9]:
[<matplotlib.lines.Line2D at 0x10f5d57b8>]

Flere akser i samme figur

In [17]:
from matplotlib import pyplot

figur,subplot = pyplot.subplots(2)
subplot[0].plot([1,2])
subplot[1].plot([3,2])
#figur.show()

figur2,subplot2 = pyplot.subplots(2)
subplot2[0].plot([10,2])
subplot2[1].plot([30,2])
Out[17]:
[<matplotlib.lines.Line2D at 0x110e23978>]
In [18]:
from matplotlib import pyplot

fig,ax=pyplot.subplots(2,2)
ax[0][0].plot([1,2,3,4,5,6,7,8,9,10],label="alder", color='blue')
ax[0][1].plot([2,2,3,4,5,6,7,8,9,10])
ax[1][0].plot([3,2,3,4,5,6,7,8,9,10])
ax[1][1].plot([4,2,3,4,5,6,7,8,9,10])
ax[0][0].legend(loc='best') # Legends settes per akse. 
Out[18]:
<matplotlib.legend.Legend at 0x110c44390>

Polarplot

In [13]:
xs = arange(0,2*pi,0.01)
ys = [sin ( x ) for x in xs]
pyplot.polar(xs,ys,linestyle='dashed')
Out[13]:
[<matplotlib.lines.Line2D at 0x111222b00>]

Scatterplot

In [14]:
import matplotlib.pyplot as pyplot
xs = arange(0,2*pi,0.1)
ys = [sin ( x ) for x in xs]
pyplot.scatter(xs,ys)
Out[14]:
<matplotlib.collections.PathCollection at 0x11134bfd0>

Semilog

In [22]:
import matplotlib.pyplot as pyplot
xs = arange(0,2*pi,0.1)
ys = [sin ( x ) for x in xs]
fig,ax = pyplot.subplots()
ax.semilogy(xs, ys)
Out[22]:
[<matplotlib.lines.Line2D at 0x111ae9d68>]
In [17]:
from matplotlib import pyplot
import numpy as np

# disse 3 linjene er for å lage normalfordelte data til å late som er data. 
xs = np.arange(1000)
prng = np.random.RandomState(19680801) 
ys = prng.normal(size=1000)


# jeg bruker pyplot til å gi meg direkte tilgang til figur og akser. For å se tilhørende funksjoner må jeg nå slå opp 
# i dokumentasjonen for det objektorienterte APIet til matplotlib. 
fig,ax=pyplot.subplots(1,2)

# I ax[0] plotter jeg det tilfeldige signalet, og i ax[1] plotter jeg histogrammet. 
ax[0].plot(xs,ys);
ax[1].hist(ys,bins=20); # bins er et keyword-argument som sier hvor mange bøtter jeg vil ha dataene talt opp i
In [20]:
# Dette er bare en liten variasjon over den forrige hvor jeg roterer histogrammet for å bedre vise distribusjonen 
# for signalet

xs = np.arange(1000)
prng = np.random.RandomState(19680801)
ys = prng.normal(size=1000)


# jeg bruker pyplot til å gi meg direkte tilgang til figur og akser. For å se tilhørende funksjoner må jeg nå slå opp 
# i dokumentasjonen for det objektorienterte APIet til matplotlib. 
fig,ax = pyplot.subplots(1,2)

ax[0].plot(xs,ys,color='pink', );
ax[0].plot(xs,0.01*ys,color='blue', );
ax[1].hist(ys,orientation=u'horizontal', label="which label",bins=40);
ax[1].legend(loc="upper center")
# litt viktige forskjeller mellom pyplot-APIet og det objektorienterte APIet, vi bruker .set_title og .set_xlabel 
# og lignende
ax[1].set_title("fordeling") 
ax[1].set_ylabel("målingsfordeling")
ax[1].set_xlabel("antall")
#fig.show()
Out[20]:
<matplotlib.text.Text at 0x113ec1e10>
In [21]:
## Og enda en variasjon for å endre hvor mye plass hver kolonne tar.
import matplotlib.gridspec as gridspec


xs = np.arange(1000)
prng = np.random.RandomState(19680801)
ys = prng.normal(size=1000)


fig,ax = pyplot.subplots(1,2,gridspec_kw=dict(width_ratios=[3,1]))
ax[0].plot(xs,ys,color='pink', );
ax[0].plot(xs,0.01*ys,color='blue', );
ax[1].hist(ys,orientation='horizontal', label="distribution", bins=40);
ax[1].legend(loc="upper center")
ax[1].set_title("fordeling")
ax[1].set_ylabel("målingsfordeling")
ax[1].set_xlabel("antall")
#fig.show()
Out[21]:
<matplotlib.text.Text at 0x10fdedd68>

Demonstrasjon av hva som skjer om vi snur om på rekkefølgen av verdiene våre.

In [25]:
import matplotlib.pyplot as pyplot
from math import sin

xs = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0]
ys = []
for x in xs:
    ys.append( sin(x))

pyplot.plot(xs,ys)
pyplot.show()
xs = [ 1.0,1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
ys = []
for x in xs:
    ys.append( sin(x))

pyplot.plot(xs,ys)
pyplot.show()

Pandas, enkel lesing av data

In [26]:
import pandas
import matplotlib.pyplot as plt

data_frame = pandas.read_csv("Torje+Hos_Digernes_2018-04-04_15-35-03.csv",header=2)
print( data_frame[0:-1][0:5] )
data_frame = data_frame.drop(labels=["Stride length (m)","Cadence","Altitude (m)","Power (W)", "Temperatures (C)","Unnamed: 11"], axis=1)
print( data_frame[0:-1][0:5] )
#print(pandas.to_datetime(data_frame["Time"]))
data_frame["Time"]= pandas.to_datetime(data_frame["Time"])


plt.plot(data_frame["Time"], data_frame[["HR (bpm)","Speed (km/h)"]])
plt.show()
   Sample rate      Time  HR (bpm)  Speed (km/h) Pace (min/km)  Cadence  \
0          1.0  00:00:00       107           0.0         00:00        0   
1          NaN  00:00:01       107           0.0         00:00        0   
2          NaN  00:00:02       107           0.1         00:00        0   
3          NaN  00:00:03       107           0.9         65:34        0   
4          NaN  00:00:04       108           0.9         65:34        0   

   Altitude (m)  Stride length (m)  Distances (m)  Temperatures (C)  \
0           NaN                NaN            0.0               NaN   
1           NaN                NaN            0.0               NaN   
2           NaN                NaN            0.0               NaN   
3           NaN                NaN            0.0               NaN   
4           NaN                NaN            0.0               NaN   

   Power (W)  Unnamed: 11  
0        NaN          NaN  
1        NaN          NaN  
2        NaN          NaN  
3        NaN          NaN  
4        NaN          NaN  
   Sample rate      Time  HR (bpm)  Speed (km/h) Pace (min/km)  Distances (m)
0          1.0  00:00:00       107           0.0         00:00            0.0
1          NaN  00:00:01       107           0.0         00:00            0.0
2          NaN  00:00:02       107           0.1         00:00            0.0
3          NaN  00:00:03       107           0.9         65:34            0.0
4          NaN  00:00:04       108           0.9         65:34            0.0
In [30]:
import pandas
import matplotlib.pyplot as plt

data_frame = pandas.read_csv("Torje+Hos_Digernes_2018-04-04_15-35-03.csv",header=2)
data_frame = data_frame.drop(labels=["Stride length (m)","Cadence","Altitude (m)","Power (W)", "Temperatures (C)","Unnamed: 11"], axis=1)
data_frame["Time"]= pandas.to_datetime(data_frame["Time"])

plt.plot(data_frame["Time"], data_frame[["HR (bpm)"]])
ax1 = plt.twinx()
ax1.plot(data_frame["Time"], data_frame[["Speed (km/h)"]],color="red")
plt.show()
In [35]:
import pandas
import matplotlib.pyplot as plt

data_frame = pandas.read_csv("Torje+Hos_Digernes_2018-04-04_15-35-03.csv",header=2)
data_frame = data_frame.drop(labels=["Stride length (m)","Cadence","Altitude (m)","Power (W)", "Temperatures (C)","Unnamed: 11"], axis=1)
data_frame["Time"]= pandas.to_datetime(data_frame["Time"])
plt.plot(data_frame["Time"], data_frame[["HR (bpm)"]])
ax1 = plt.twinx()
ax1.plot(data_frame["Time"], data_frame[["Speed (km/h)"]], c="green")
plt.title("Running session")
ax1.set_ylim(0,24)
plt.show()

For å fikse tallene på x-aksen

Siden det var helt uleselig over

In [36]:
import pandas
import matplotlib.pyplot as plt


from pandas.tseries import converter as pdtc
pdtc.register()

import matplotlib.dates as mdates

minute = mdates.MinuteLocator(range(0,60,5))
second = mdates.SecondLocator()
fmt = mdates.DateFormatter('%M:00')

data_frame = pandas.read_csv("Torje+Hos_Digernes_2018-04-04_15-35-03.csv",header=2)
data_frame = data_frame.drop(labels=["Stride length (m)","Cadence","Altitude (m)","Power (W)", "Temperatures (C)","Unnamed: 11"], axis=1)
data_frame["Time"]= pandas.to_datetime(data_frame["Time"])

fig, ax0 = plt.subplots()
ax0.plot(data_frame["Time"], data_frame[["HR (bpm)"]])


ax0.xaxis.set_major_locator(minute)
ax0.xaxis.set_major_formatter(fmt)
labels =  ax0.get_xticks()


ax1 = plt.twinx()

ax1.plot(data_frame["Time"], data_frame[["Speed (km/h)"]], c="green")
fig.suptitle("Running session")
ax1.set_ylim(0,24)
plt.show()