Legtöbbször a legjobb ábrák a legegyszerűbb ábrák! Az alábbiakban áttekintünk néhány egyszerű ábrakészítési módot, amelyek segítségével a leggyakrabban előforduló ábrázolási problémáinkat orvosolhatjuk. Fontos megjegyezni, hogy ábrát a matplotlib
segítségével több hasonló módon is elő lehet állítani. Az alábbiakban törekedünk a lehető legegyszerűbb módszer bemutatására. Fontos azt is megjegyezni, hogy az alábbi példákban előforduló függvényopciók (kulcsszavas argumentumok) lehetséges értékeinek csak egy szűk halmazára térünk ki. A megfelelő paraméterek lehetséges értékei után vagy a matplotlib mintapéldái vagy a megfelelő függvények, pl. plot
,hist
,pcolor
, contour
és contourf
docstring-jében érdemes kutatni!
#a már megszokott betöltési parancs
%pylab inline
Sok esetben a feladat egy ismert adathalmaz, netán egy analitikus függvény ábrázolása. Ha analitikus fügvénnyel van dolgunk, akkor az ábrázoláshoz először legyártunk kiértékelési pontokat, ezután ezekben a pontokban kiértékeljük az adott függvényt. Az alábbi példában a $\sin(x)$ függvényt fogjuk kiértékelni a $[-\pi,\pi]$ intervallumban 25 pontban.
x=linspace(-pi,pi,25);
y=sin(x);
Az ábrázolás (ahogy azt már korábban is láttuk) a plot
paranccsal történik.
plot(x,y)
Vizsgáljunk meg néhány kulcsszavas argumentumot, amely segítségével a plot
parancs kimenetelét tudjuk változtatni.
A color
kulcsszó az ábrázolt adat színeit változtatja meg. Ez az ábra tartalmazza a matplotlib
-ben néven nevezett színek nevét. Változtassuk meg a fenti ábrában a görbe színét pirosra!
plot(x,sin(x),color='red')
A linewidth
kulcsszó segítségével a vonalszélességen változtathatunk.
plot(x,sin(x),linewidth=3)
A linestyle
kulcscszó a vonalstílust állítja be. Ez lehet megnevezett kulcsszó (mint az alábbi példában) vagy szimbólum is.
plot(x,sin(x),linestyle='dashed') # szaggatott vonal (angolul: dashed line)
Ha üres stringet adunk vonalstílusnak, és a marker
kulcsszót használjuk, akkor az ábrán csak pontok jelennek meg. Így például ábrázolhatunk olyan adatokat, amik nincsenek szépen sorbarendezve.
plot(x,sin(x),linestyle='',marker='o')
Ha a linestyle
és a marker
kulcsszavakat egyszerre alkalmazzuk, akkor a markereket a kért vonalstílussal köti össze a matplotlib
.
plot(x,sin(x),linestyle='dashed',marker='s')
Természetesen ahogy már megszoktuk, kulcsszavas argumentumokból egyszerre többet is beadhatunk (vajon mit jelenthetnek azok a kulcsszavak, amiről eddig nem volt szó?):
jellemzok=dict(color='green', linestyle='dashed', marker='o', markerfacecolor='blue',
markeredgecolor='red',markeredgewidth=2, markersize=12 )
plot(x, sin(x), **jellemzok)
Az ábra tengelyeinek tartományát az xlim()
, illetve ylim()
függvények segítségével tudjuk beállítani, melyeket a plot
függvény után hívunk meg:
plot(x,sin(x))
xlim(-pi,pi);
A plot
függvény számos más kulcsszavas argumentummal rendelkezik. A docstring-jében mindezek jól le vannak dokumentálva!
?plot
Ha két (vagy több) plot
parancsot adunk ki egymás után, akkor az ábrán egyszerre két (vagy több) függvény is megjelenik.
plot(x,sin(x))
plot(x,cos(x))
Speciális esete ennek az, amikor az egyik plot
csak egyetlen pontot tartalmaz. Ezzel a módszerrel jelölhetünk érdekes pontokat a függvény görbéjén.
plot(x,sin(x))
plot(1,sin(1),'o')
Ha több függvényt ábrázolunk, akkor a label
kulcsszó és a legend()
függvény segítségével tudjuk egyszerűen jelölni, hogy melyik görbe melyik függvényt ábrázolja.
plot(x,sin(x),label='sin(x)',color='red',linestyle='-',linewidth=3)
plot(x,cos(x),label='cos(x)',color='blue',linestyle='--',linewidth=3)
legend()
Az xlabel()
és az ylabel()
függvények segítségével tengelyfeliratokat készíthetünk.
plot(x,sin(x))
xlabel(r'ido',fontsize=20)
ylabel('kiteres',fontsize=20)
Az xticks()
és yticks()
függvények a a tengelybeosztások formázásáért felelősek. Segítségükkel tudjuk a beosztásokat saját igényeink szerint beállítani. Ezen függvények dockstringjeit is érdemes megvizsgálni!
plot(x,sin(x))
xticks([-pi,-pi/2,0,pi/2,pi],[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'],fontsize=20);
yticks(linspace(-1,1,9));
#Vajon mi változott a fenti ábrához képest ?
Végül nézzünk meg egy példát, amely a fent tanult trükköket egyszerre alkalmazva egy publikációs minőségű ábrát készít.
plot(x,sin(x),label='sin(x)',color='red',linestyle='-',linewidth=3)
plot(x,cos(x),label='cos(x)',color='blue',linestyle='--',linewidth=3)
xticks([-pi,-pi/2,0,pi/2,pi],[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'],fontsize=20);
yticks(linspace(-1,1,3),fontsize=20);
xlabel('ido',fontsize=20)
ylabel('kiteres',fontsize=20)
legend(loc='upper left',fontsize=20)
xlim(-pi,pi)
grid(True) #Vajon ez a függvény mit csinál ?
Fontos megjegyezni, hogy a vonal- és pontábrázolások kulcsszavas paraméterezését sok másik függvény is megörökölte. Így például 3D-s ábra készítésnél is hasonlóan használhatóak mint itt. Továbbá a tengelyfeliratozás és -beosztás kezelése is hasonlóan általánosan használható, nem csak a plot()
paranccsal egyetemben!
Láttuk, hogy a plot függvény segítségével akár mérési adatpontokat is tudunk ábrázolni. Sokszor azonban a mérések során a mérési hiba is rendelkezésünkre áll! Vizsgáljunk meg erre egy példát!
Az alábbiakban a történelmi napfoltadatok ábrázolásán keresztül igazi mérési adatokat fogunk ábrázolni. Az adatok a data
könyvtárban található SN_m_tot_V2.0.txt
file-ban vannak. Ahhoz hogy az adatok a rendelkezésünkre álljanak, először be kell tölteni a file tartalmát. Ezt legegyszerűbben a numpy
modul loadtxt
függvénye segítségével tehetjük meg. Ez a függvény egyszerűen strukturált adatfileokat olvas be egy array
-be.
dat=loadtxt('data/SN_m_tot_V2.0.txt'); # a napfolt adatok betöltése.
A fenti parancs tehát a dat
tömbbe beolvasta a file-ban található adatokat. A file 3. oszlopa tartalmazza a megfigyelés idejét években mérve, a 4. oszlop pedig a napfoltok számát.
Ábrázoljuk az utolsó 100 pontot az adatfile-ból:
plot(dat[-100:,2],dat[-100:,3],linestyle='',marker='o')
Az 5. oszlop viszont a megfigyelések statisztikus hibáit tartalmazza. Ha a mérési pontokat és a hibát egy ábrán szeretnénk látni, akkor ezt az errorbar()
függvény segítségével megtehetjük.
errorbar(dat[-100:,2],dat[-100:,3],dat[-100:,4],linestyle='',marker='o')
Az errorbar()
függvény tehát három bemenő oszlopot vár, amelyekből az első kettő a mérési pontok, illetve a mért értékek, a harmadik pedig a hiba. Ezeken felül, hasonlóan a plot()
-hoz kulcsszavakkal vezérelhetjük a megjelenést. Az alábbi példa illusztrál néhány kulcsszót.
jellemzok=dict(linestyle='',marker='o',ecolor='green',capsize=4,capthick=2)
errorbar(dat[-100:,2],dat[-100:,3],dat[-100:,4],**jellemzok)
További opciókról a docstringben kaphatunk némi felvilágosítást:
?errorbar
Természetesen két különféle ábrázolást is meg lehet egy képen jeleníteni! Az alábbi példában egy plot()
és egy errorbar()
függvényt kombinálunk.
errorbar(dat[-300:,2],dat[-300:,3],dat[-300:,4],linestyle='',marker='o')
plot(dat[-300:,2],70*cos(2*pi/11*dat[-300:,2]-pi*0.25)+70,color='red',linewidth=3)
A hisztogramok a statisztikai elemzések fontos eszközei.
A múlt órán már láttunk pár példát hisztogram készítésére a hist
parancs segítségével. Ismerkedjünk most meg a hist()
hisztogramgyártó-rutin néhány kulcsszavas argumentumával. Először is gyártsunk néhány véletlen számot!
meres1=randn(10000);
meres2=random.normal(2,0.5,10000);
Amint már korábban láttuk, ez a legegyszerűbb módja a hisztogramgyártásnak.
hist(meres1)
Ha növelni akarjuk a hisztogram felbontását, akkor azt a bins
argumentummal tehetjük meg. Ha a bins
egy számot kap a bemenetre, akkor annyi automatikusan legenerált beosztás szerint gyártódik le a hisztogramm.
hist(meres1,bins=100);
A beosztások széleit önkényesen is megadhatjuk!
hist(meres1,bins=[-2,0,1,2,3]);
Ha oszlopok helyett egy folytonos vonallal szeretnénk elkészíteni a hisztogramot, akkor a histtype
kulcsszó segít!
hist(meres1,histtype='step');
Természetesen ahogy a plot parancsnál, úgy a hist parancsnál is lehet egyszerre több hisztogramot egy képen ábrázolni.
hist(meres1,bins=100,linewidth=0);
hist(meres2,bins=100,linewidth=0);
Ha nagyon eltakarná a két eloszlás egymást, akkor az alpha
kulcsszó segítségével némileg áttetszővé tehetjük őket!
hist(meres1,bins=100,linewidth=0,alpha=0.5);
hist(meres2,bins=100,linewidth=0,alpha=0.5);
Kétváltozós függvények megjelenítése az egyváltozósokéhoz hasonlóan, adatgyűjtéssel vagy mintavételezéssel kezdődik. A már ismert linspace()
függvényt kombinálva a meshgrid()
függvénnyel a múlt órán megismert módon mintavételezünk egy kétváltozós paraméterteret:
x2,y2 = meshgrid(linspace(-4,4,50),linspace(-3,3,50)) #mintavételezési pontok legyártása
z2 = sin(x2) ** 10 + cos(10 + y2 * x2) * cos(x2) #függvény kiértékelés
A fenti kódsor tehát legyártott három tömböt. Az első kettő tartalmazza a (2 indexes array formájában) a mintavételezési pontok $x$ és $y$ koordinátáját. A z2
változó pedig a kiértékelt függvényt. Most már csak ábrázolni kell! Ezt legegyszerűbben - ahogy már láttuk - a pcolor()
függvény teszi meg:
pcolor(x2,y2,z2)
Hogy egy adott szín mit jelent, azt a colorbar()
függvény segítségével tudhatjuk meg.
pcolor(x2,y2,z2)
colorbar()
Sok színsála létezik. Mindegyiknek megvan a maga előnye és hátránya. A matplotlib színskálák oldalán néhány megnevezett színsála közzül a cmap
kulcsszó segítségével tudunk válogatni.
pcolor(x2,y2,z2,cmap='viridis')
colorbar()
Kétváltozós függvényeket szokás kontúrok segítségével is ábrázolni. Egy kontúrvonal azokat a pontokat tartalmazza, ahol az adott kétváltozós függvény ugyanazt az értéket veszi fel. A contour()
függvény segítségével tudunk kontúrábrákat generálni:
contour(x2,y2,z2)
Ha csak megadott kontúrértékekre vagyunk kíváncsiak, akkor azt a levels
kulcsszó használatával tehetjük meg.
contour(x2,y2,z2,levels=[-0.5,0,0.5])
A clabel()
függvény segítségével a kontúr vonalakat a megfelelő értékek szerint tudjuk feliratozni.
cs=contour(x2,y2,z2,levels=[-0.5,0,0.5])
clabel(cs)
A contourf()
függvény a pcolor()
és a contour()
függvények jó tulajdonságait ötvözi. Segítségével kitöltött színes ábrákat tudunk generálni, amelyek jobban illeszkednek a megjelenítendő függvény alakjához.
contourf(x2,y2,z2)
A levels
kulcsszó segítségével feljebb vehetjük a felbontást.
contourf(x2,y2,z2,levels=linspace(-1.5,1.5,100))
colorbar()
Előfordulhat, hogy a mintavételezés valamilyen oknál fogva nem volt egyenletes. Ekkor az adatpontok háromszögelésének segítségével lehet ábrázolni a kérdéses függvényt. Az alábbiakban erre látunk példát.
Gyártsunk le először is véletlenszerűen síkbeli pontokat!
tx,ty = [8*rand(50*50)-4,6*rand(50*50)-3] #mintavételezési pontok legyártása
Értékeljük ki ezekben a véletlen mintavételezési pontokban az ábrázolni kívánt függvényt!
tz = sin(tx) ** 10 + cos(10 + ty * tx) * cos(tx) #függvény kiértékelés
Ha az adatpontok rendezetlenek, akkor a tripcolor()
, tricontour()
és tricontourf()
függvényeket használhatjuk a pcolor()
, contour()
, illetve a contourf()
függvényekkel teljesen analóg módon!
tripcolor(tx,ty,tz)
tricontourf(tx,ty,tz,linspace(-1.5,1.5,100))
A fizikában gyakran van dolgunk erőterekkel. Gondoljunk csak az elektrodinamikára vagy a meteorológiára. Vizsgáljuk meg az eddig ábrázolt kétváltozós függvény gradiensét. A síkbeli gradiensvektor az alábbiak szerint adódik:
u=-y2*sin(x2*y2 + 10)*cos(x2) + 10*sin(x2)**9*cos(x2) - sin(x2)*cos(x2*y2 + 10)
v=-x2*sin(x2*y2 + 10)*cos(x2)
A quiver()
függvény segítségével a sík minden pontjához, amelyet az x2
és y2
tömbök definiálnak, egy az u
és v
tömbök által definiált vektort tudunk rendelni. Azaz a tér (x2[i],y2[i])
pontjába egy (u[i],v[i])
vektor kerül!
quiver(x2,y2,u,v)
Rajzoljuk csak minden harmadik vektort ki, piros színnel és kicsit vastagabban.
quiver(x2[::3, ::3], y2[::3, ::3], u[::3, ::3], v[::3, ::3],
color='red',width=0.005)
Mint ahogy azt fent is említettük, további részletekért érdemes a dokumentációt böngészni!
?quiver
A quiver()
alternatívája az áramvonal-ábrázolás, avagy a streamplot()
:
streamplot(x2[::3, ::3], y2[::3, ::3], u[::3, ::3], v[::3, ::3])
További részletek a dokumentációban:
?streamplot
A streamplot()
-ot és a quiver()
-t használhatjuk közösen a pcolor()
és a kontúrkészítő rutinokkal!
pcolor(x2,y2,z2)
colorbar()
quiver(x2[::2,::2],y2[::2,::2],u[::2,::2],v[::2,::2],color='white',width=0.005)
contourf(x2,y2,z2,levels=linspace(-1.5,1.5,100))
colorbar()
streamplot(x2[::3, ::3], y2[::3, ::3], u[::3, ::3], v[::3, ::3],color='white')
Egy ábra véglegesítése során sokszor előfordulhat, hogy valamilyen magyarázó szövegre van szükség, esetleg az ábra egy részét valamiért ki szeretnénk emelni. Ezt a text()
és az annotate()
függvények segítségével tehetjük meg. A text()
függvény 3 alapvető bemenő paraméterrel rendelkezik. Az első kettő egy koordináta, a harmadik pedig egy string. Nézzünk egy példát!
plot(x,y);
text(1,0,'Ez egy felirat')
text(-3,0,'Ez egy másik felirat',fontsize=13,color='red')
Ha egy részt ki szeretnénk emelni, akkor arra a legalkalmasabb megoldás az annotate()
. Ezen függvény segítségével egy "rámutató" nyilat és egy magyarázó szöveget helyezhetünk el az ábrán. Az első bemenő paraméter egy string, ami a magyarázat, ezen kívül kulcsszavakkal vezéreljük a függvény további viselkedését. Az xy
kulcsszó a kiemelni kívánt pont helye. Az xytext
a magyarázat helye, az arrowprops
pedig egy olyan dict
-et tartalmaz, amely a nyíl tulajdonságait határozza meg.
plot(x,y)
annotate('lokális minimum', xy=(-pi/2, -1), xytext=(-pi, 0.5),arrowprops=dict(color='red',width=3),fontsize=20)
?annotate
Végül lássunk néhány példát ábratömbökre! A subplot()
függvény segítségével tudunk ábratömböt vagy ábrarácsot generálni.
Ha egy kódcellába több subplot()
parancsot írunk, akkor minden subplot()
parancs alatti ábrázolórutin külön alábrára kerül.
A subplot(n,m,i)
kód jelentése a következő: ami ezután jön, azt rajzold egy n*m-es ábratömb i-edik alábrájába. Vigyázzunk rá, hogy itt i nem haladhatja meg n*m-et!
Lássunk néhány példát:
figsize(12,4) #ábraméret nagyítása vízszintesen
subplot(1,2,1)
plot(x,y)
subplot(1,2,2)
pcolor(x2,y2,z2)
figsize(6,8) #ábraméret nagyítása függőlegesen
subplot(2,1,1)
plot(x,y)
subplot(2,1,2)
pcolor(x2,y2,z2)
A legenerált ábrákat a savefig()
paranccsal tudjuk kimenteni képfile-okba.
figsize(6,4) # megszokott ábraméret visszaállítása
plot(x,y)
savefig('az_en_abram.png')