Kako narišemo graf meritve

Zakaj rezultate meritev prikažemo na grafu?

Orodja za risanje grafov

Obstaja vrsta programov, namenjenih risanju grafov:

Zgledi na predavanjih bodo prikazani v programu matplotlib.

Napotki

Znanstvene revije običajno podajo napotke, kako naj grafi v objavljenih člankih izgledajo. Nekaj primerov iz pomembnejših fizikalnih revij:

Pomembno je, da so grafi konsistentni (imajo vsi osi enake debeline, enako velikost pisave -- le ta naj bo enako velika kot v tekstu, ...) To najlažje dosežemo tako, da si pripravimo standarden nabor nastavitev, ki jih potem uporabimo pri vseh grafih. Primer:

In [1]:
from pylab import *
%matplotlib inline

# nastavitve za izris grafov (http://matplotlib.org/1.3.1/users/customizing.html)
rc('text', usetex=True)
rc('font', size=12, family='serif', serif=['Computer Modern'])
rc('xtick', labelsize='small')
rc('ytick', labelsize='small')
rc('legend', frameon=False, fontsize='medium')
rc('figure', figsize=(5, 3))

Primer enostavnega grafa

Pri nekem poskusu so merili odgovor mišičnega vlakna na adrenalin. Mišično vlakno iz žabjega srca so napeli na mikrosilomer. Vlakno so oblivali z raztopino adrenalina različnih koncentracij in merili silo skrčenja. Rezultati teh meritev so shranjeni v datoteki adrenalin.dat. V prvem stolpcu datoteke je koncentracija adrenalina v \(\mu\)g/l, v drugem pa sila skrčenja, ki so jo normirali na 100% pri največji koncentraciji.

Podatke najprej preberemo iz datoteke v dvodimenzionalno polje.

In [2]:
podatki=loadtxt('adrenalin.dat')
podatki
Out[2]:
array([[    1. ,     0. ],
       [    2. ,     0. ],
       [    7. ,    15.3],
       [   10. ,    34.6],
       [   20. ,    49.3],
       [   70. ,    82.6],
       [  200. ,    96. ],
       [ 1000. ,   100. ]])

Prebrane podatke prikažemo na grafu, da dobimo občutek o obnašanju izmerjene količine. Pri poskusih običajno kontroliramo eno količino in opazujemo, kako le-ta vpliva na neko drugo količino. Prvo (v našem primeru koncentracijo adrenalina) prikažemo na vodoravni osi grafa, drugo (normirano silo skrčenja) pa na navpični osi.

In [3]:
plot(podatki[:, 0], podatki[:, 1])
Out[3]:
[<matplotlib.lines.Line2D at 0x104b04e90>]
Graf priredimo:
In [4]:
graf=figure()
plot(podatki[0:7, 0], podatki[0:7, 1], 'ko', clip_on=False)
xlabel(r'Koncentracija adrenalina ($\mu$g/l)')
ylabel(r'$F/F_\textrm{max}$ (\%)')
yticks(linspace(0, 100, 5))
grid(True)

Graf shranimo v datoteko adrenalin.pdf. Če je le mogoče, uporabimo vektorski format, ki omogoča poljubno povečavo brez izgube kvalitete slike.

In [5]:
graf.tight_layout(pad=0.3)
graf.savefig('adrenalin.pdf')

Datoteko z grafom vključimo v članek (vektorski format, bitni format). Nad ali pod grafom dodamo opisno vrstico, ki naj vsebuje številko grafa in opis na grafu prikazanih količin. Graf, skupaj z opisno vrstico, naj bo bralcu razumljiv sam po sebi, brez branja članka!

Naloge

  1. Nariši graf s podatki iz datoteke mtt1.dat. To je meritev diferencialnega sipalnega preseka (drugi stolpec, v enotah fb \(c^2\)/GeV) za tvorbo para kvarkov top in anti-top v odvisnosti od invariantne mase takšnega para (prvi stolpec v enotah GeV/\(c^2\)) na trkalniku protonov in antiprotonov Tevatron v Fermilabu, ZDA.

  2. V datoteki Kredarica.zip so zbrani vremenski podatki z merilne postaje Kredarica za obdobje od 1. 1. 1955 do 31. 1. 2014. Datoteka TG_STAID001752.txt vsebuje podatke o povprečni dnevni temperaturi (zapis podatkov je razložen v glavi datoteke). Na grafu prikaži, kako se je povprečna dnevna temperatura spreminjala v letu 2010.

  3. Nariši graf s podatki iz datoteke CSL123.MuD. To je meritev absorpcije rentgenskih žarkov (logaritem razmerja vpadnega in prepuščenega toka, drugi stolpec), z energijo fotonov (prvi stolpec) v področju robov L (L3 = 5017.8 eV, L2 = 5365.6 eV, L1 = 5720.4 eV), v cezijevi pari, izvedena na sinhrotronu v Hamburgu. Nariši posebej še ožje območje robu L3 (-50 eV, 150 eV), da bo profil robu razločnejši. Ali meniš, da je ostri vrh priškrnjen zaradi pregrobega koraka v energiji?