Kategória: Python.
Alkategória: Adatkezelés Pythonban.
Bevezető
Az adatok fel felderítéshez valamint illusztrálásához egy-egy diagram is segíthet. Ebben a szakaszban azt vizsgáljuk meg, hogy hogyan tudunk Pythonban diagramokat készíteni.
Ezt a szakaszt az alábbi oldalak alapján készítettem el:
- https://www.w3schools.com/python/pandas/pandas_plotting.asp
- https://www.w3schools.com/python/matplotlib_intro.asp
Matplotlib alapok
A Matplotlib könyvtárat fogjuk használni erre a célra (https://matplotlib.org/). Ha még nincs feltelepítve, akkor telepítsük a szokásos módon:
pip3 install matplotlib
Az alábbi példa illusztrálja a használatát:
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 3, 4, 7, 9]) plt.plot(xpoints) plt.show()
Tehát be kell tölteni a matplotlib.pyplot modult, és annak függvényeivel (jelen esetben a plot() függvénnyel) készítjük a diagramokat. A show() függvény jeleníti meg, előtte ugyanis több műveletet is végrehajthatunk.
Az eredmény, amit egy ablakban feldob:

Fontos hangsúlyozni, hogy a teljesség igényére itt sem törekszünk; ennek is épp, hogy csak karcoljuk a felszínét. A további részletekről az igen jól felépített specifikációban tájékozódhatunk.
Vonal diagram
Az egyik leggyakoribb diagram típus a vonal diagram, fenti is egy ilyen példát láttunk. Most láttunk egy olyan példát, amelyben az x és az y koordinátát is mi magunk állítjuk be:
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 3, 4, 8, 9]) ypoints = np.array([3, 7, 6, 12, 16]) plt.plot(xpoints, ypoints) plt.show()

A paraméterekkel módosítani tudjuk a kinézetet:
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 3, 4, 8, 9]) ypoints = np.array([3, 7, 6, 12, 16]) plt.plot( xpoints, ypoints, marker='o', markersize=20, markeredgecolor='black', markerfacecolor='red', linestyle='dashed', linewidth=5, color='green' ) plt.show()

Magyarázat:
- marker: azt mutatja meg, hogy hogyan nézzen ki a jelölő,
- markersize: a jelölő mérete,
- markeredgecolor: a jelölő szélének a színe,
- markerfacecolor: a jelölő színe,
- linestyle: a vonal stílusa,
- linewidth: a vonal vastagsága,
- color: a vonal színe.
A további paraméter értékekről ill. a további paraméterekről a https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html oldalon található specifikációban tájékozódhatunk.
Szórásdiagram
Angolul scatter plot. Ezzel pontokat jelenítünk meg:
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 1, 4, 4, 9]) ypoints = np.array([3, 7, 7, 12, 16]) plt.scatter(xpoints, ypoints) plt.show()

Érdemes megfigyelni - szándékosan ilyen példát választottam - hogy ugyanahhoz az x koordinátához több y koordináta érték tartozhat. Ez tehát nem függvény, így nem értelmezett a vonaldiagram sem, és többnyire az x és az y koordináta felcserélhető. Általában két egymástól független, de többnyire egymással korreláló adatot szoktunk így megjeleníteni, pl. egy ember magassága és testtömege, egy autó motorjának hengerűrtartalma és teljesítménye, egy ország területe és lakóinak száma stb.
Ha több adatot is meg szeretnénk jeleníteni, nemcsak kettőt, akkor a pontok egyéb tulajdonságait is kihasználhatjuk, pl. azok méretét és színét.
import matplotlib.pyplot as plt import numpy as np np.random.seed(2021) plt.scatter( x = np.random.randint(100, size=(100)), # x-coordinate y = np.random.randint(100, size=(100)), # y-coordinate c = np.random.randint(100, size=(100)), # color cmap = 'nipy_spectral', # color map s = 10 * np.random.randint(100, size=(100)), # size alpha = 0.5, # transparency ) plt.colorbar() plt.show()

Oszlopdiagram
Az oszlopdiagram tökéletesen alkalmas egydimenziós adatok illusztrálására:
import matplotlib.pyplot as plt import numpy as np names = ['apple', 'orange', 'banana', 'cherry', 'lemon'] xpoints = np.array([1, 8, 4, 9, 3]) plt.bar(names, xpoints) plt.show()

Vízszintesen elhelyezkedő oszlopdiagramot a barh() függvénnyel tudunk készíteni:
import matplotlib.pyplot as plt import numpy as np names = ['apple', 'orange', 'banana', 'cherry', 'lemon'] xpoints = np.array([1, 8, 4, 9, 3]) plt.barh(names, xpoints) plt.show()

Torta diagram
Célját tekintve hasonló az oszlopdiagramhoz. Kevésbé alkalmas az elemek egymáshoz viszonyított méretének illusztrálására (a tortacikkelyen kevésbé látszik az, hogy melyik a nagyobb), viszont gyakran alkalmazzák különösen azokban az esetekben, amikor egy egésznek részekre történő felosztását szeretnénk illusztrálni (pl. a Föld lakosságát kontinensekre bontva).
A példa a fenti adatok megjelenítése tortadiagramon:
import matplotlib.pyplot as plt import numpy as np names = ['apple', 'orange', 'banana', 'cherry', 'lemon'] xpoints = np.array([1, 8, 4, 9, 3]) plt.pie(xpoints, labels=names) plt.show()

Van még egy érdekes lehetőség: ki az explode paraméterrel ki lehet emelni részeket:
import matplotlib.pyplot as plt import numpy as np names = ['apple', 'orange', 'banana', 'cherry', 'lemon'] xpoints = np.array([1, 8, 4, 9, 3]) plt.pie(xpoints, labels = names, explode = [0.0, 0.0, 0.2, 0.0, 0.0]) plt.show()

Hisztogram
A hisztogram kinézetre hasonlít az oszlopdiagramra, célja viszont egészen más: azt illusztrálja, hogy egy-egy intervallumon belül milyen gyakorisággal fordulnak elő elemek. Ezzel tipikusan nagy elemszámú sokaságokat illusztrálunk.
Az alábbi példában generálunk 1000 normális eloszlású, 100-as várható értékű és 15-ös szórású bejegyzést (tehát mindha 1000 véletlenszerűen kiválasztott ember megírt volna egy szabályos IQ tesztet):
import matplotlib.pyplot as plt import numpy as np np.random.seed(2021) plt.hist(np.random.normal(100, 15, 1000), bins=50) plt.show()

A bins azt mondja meg, hogy hány egyenlő szélességű részre ossza az értékkészletet, azaz a legmagasabb és a legalacsonyabb szám közötti szakaszt. Az alapértelmezett érték 10, ami nem annyira látványos, emiatt emeltem fel a példában 50-re.
Több adat egy diagramon
Idáig csak egyetlen adatot jelenítettünk meg. Gyakran előfordul az, hogy ugyanazon a diagramon több adatot is meg szeretnénk jeleníteni, pl. több vonaldiagramot (pl. hogyan változott két, közel hasonló méretű ország lakosságszáma).
A Matplotlib egy egészen elegáns megoldást alkalmaz erre (és itt jön be a plt.show() értelme): akárhány utasítást adhatunk a show() előtt, azt "gyűjti", és a végén formázza meg úgy, hogy lehetőleg jó legyen. Példa:
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 8, 4, 9, 3]) ypoints = np.array([7, 6, 2, 7, 8]) plt.plot(xpoints) plt.plot(ypoints) plt.show()

Több diagram egy képen
Ha több diagramot szeretnénk megjeleníteni ugyanazon a képen, akkor a subplot() függvényt használhatjuk. Ott a paraméterek:
1. sorok száma,
2. oszlopok száma,
3. az adott diagram hányadik olvasási irányban.
import matplotlib.pyplot as plt import numpy as np names = ['apple', 'orange', 'banana', 'cherry', 'lemon'] xpoints = np.array([1, 8, 4, 9, 3]) plt.subplot(2, 2, 1) plt.plot(xpoints) plt.subplot(2, 2, 2) plt.scatter(names, xpoints) plt.subplot(2, 2, 3) plt.barh(names, xpoints) plt.subplot(2, 2, 4) plt.pie(xpoints, labels=names) plt.show()

A diagram extrái
Az alapértelmezett diagram esetenként túl kevés információt tartalmaz: jó lenne címet adni neki, megadni a koordinátákat, valamint a jobb áttekinthetőség érdekében négyzetrácsot létrehozni. Az alábbi példa ezeket a lehetőségeket villantja fel:
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 3, 4, 8, 9]) ypoints = np.array([3, 7, 6, 12, 16]) plt.plot(xpoints, ypoints) plt.title('Vonaldiagram', fontdict={'family':'serif','color':'blue','size':20}) plt.xlabel('x koordináta') plt.ylabel('y koordináta') plt.grid() plt.show()

Pandas diagramok rajzolása
A Pandas adatkereteknek közvetlenül van egy plot() függvénye, amivel szintén diagramokat rajzolhatunk. Itt kicsit más a filozófia: minden diagramot ezzel a függvénnyel rajzoljuk meg, a kind paraméterrel adjuk meg a diagram típusát, és a paraméterlista típusfüggő:
import pandas as pd import matplotlib.pyplot as plt my_fruits_df = pd.DataFrame({ 'name': ['apple', 'orange', 'banana', 'cherry', 'lemon'], 'value': [1, 8, 4, 9, 3], }) my_fruits_df.plot(kind='barh', x='name', y='value') plt.show()
