Matplotlib

Kategória: Python.
Alkategória: Python adatszerkezetek.

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:

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 shwo() függvény jeleníti meg, előtte ugyanis több műveletet is végrehajthatunk.

Az eredmény:

matplot_base.png

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()
matplot_line.png

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()
matplot_line_extra.png

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|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()
matplot_scatter.png

É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()
matplot_scatter_extra.png

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()
matplot_bar.png

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()
matplot_barh.png

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()
matplot_pie.png

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()
matplot_pie_explode.png

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()
matplot_hist.png

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()
matplot_multidata.png

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()
matplot_multidiagram.png

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()
matplot_pandas.png
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License