Zobrazování dat s knihovnou Matplolib

Matplotlib je knihovna napsaná v Pythonu pro vizualizování dat různými způsoby. Jedná se o nejpoužívanější knihovnu v Pythonu pro zobrazování dat. Knihovny umožňuje export obrázků v různých formátech (png, eps, pdf, ...) v kvalitě vhodné pro vědecké publikace.

Následuje import knihovny a její nastavení pro Jupyter (kreslení inline obrázků). Knihovna Numpy je importována také, pro snadné generování syntetických (umělých) dat.


In [1]:
# inline plots 
%matplotlib inline 
# import matplotlib as plt acronym
import matplotlib.pylab as plt
# import numpy as np acronym
import numpy as np

Kreslení bodů a řad

Nejčastější případ zobrazování dat v technických aplikacích je asi spojnicový a bodový (scatter) graf.

Minimální příklady

Následují dva minimalistické příklady, pro pochopení jak používat Matplotlib. V těchto příkladech schválně není nic navíc, aby bylo evidentní jaké příkazy slouží k samotnému kreslení dat.


In [2]:
# synthetic data
x = np.linspace(-10, 10, 100)**3

# plotting
plt.plot(x)
plt.show()



In [3]:
# synthetic data
x = np.random.normal(0, 2, 20)
y = np.random.normal(0, 2, 20)

# plotting
plt.plot(x, y, "o")
plt.show()


Popisky, legenda, titulek, velikost, rozsah, mřížka

Následuje komplexní příklad, v kterém je demonstrováno jak nastavit/doplnit do grafu všechny podstatné náležitosti.


In [4]:
# synthetic data
x = np.linspace(-10, 10, 100)
y1 = x**3
y2 = x**2

# plotting
plt.figure(figsize=(12,5)) # create figure with size in inches
plt.plot(x, y1, label="$y=x^3$") # plot y1
plt.plot(x, y2, label="$y=x^3$") # plot y2
plt.title("$y=f(x)$") # main title
plt.xlabel("x [-]") # x axis label
plt.ylabel("y [-]") # y axis label
plt.xlim(-7.5, 10) # limits of x axis
plt.ylim(-750, 750) # limits of y axis
plt.grid() # show grid
plt.legend() # show legend
plt.show()


Styl značek, spojnic

Další příklad demonstruje jak nastavovat vzhled značkek a spojnic. Všimněte si zadávání barvy a tvaru markeru:

  • 'ro' - červená (red), kulatý marker (tvar o).
  • 'b^-' - modrá (blue), horní trojůhelník (tvar ^), plná čára (značka -)
  • 'k:' - černá (black), tečkovaná čára (značka :)

In [5]:
# synthetic data
x = np.linspace(-10, 10, 25)
y1 = x**3
y2 = x**2
y3 = x**4 / 5

# plotting
plt.figure(figsize=(12,7)) # set size
plt.plot(x, y1, "ro", label="$y=x^3$") # plot y1
plt.plot(x, y2, "b^-", linewidth=6, markersize=15, label="$y=x^3$") # plot y2
plt.plot(x, y3, "k:", linewidth=5, label="$y=x^4/5$") # plot y3
plt.legend() # show legend
plt.show()



Ostatní druhy grafů

Mimo spojnicových a bodových grafů existují ještě různé další způsoby zobrazení dat. Několik populárních způsobů je ukázáno na následujících příkladech.

Sloupcový graf

Následuje příklad sloupcového grafu.


In [6]:
# synthetic data
values = [121, 56, 41, 31] # values of bars
years = [2015, 2016, 2017, 2018] # position of bars

# plotting
plt.bar(years, values, align='center')
plt.xticks(years, years)
plt.show()


Histogram

Histogram je sloupcový graf, který zobrazuje četnost výskytu nějaké hodnoty v datech. Je to velice častý způsob analýzy dat. Z tohoto důvodu je v Matplotlibu připravena vlastní funkce, která rovnou kreslí výsledek analýzy.


In [7]:
# synthetic data with normal distribution
x = np.random.normal(0, 2, 1000)

# create and plot histogram
plt.hist(x, bins=20)
plt.show()


Boxplot

Boxplot - krabicový graf je nástroj pro zjednodušené zobrazení rozložení hodnot v nějakém výběru. Jeden box představuje jednu sadu dat (skupinu, vzorek). Následuje příklad - srovnání dvou skupin - x, y.


In [8]:
# synthetic data with normal distribution
x = np.random.normal(0, 2, 1000)
y = np.random.normal(1, 1, 1000)

# basic plot
plt.boxplot([x,y], labels=["x", "y"])
plt.show()


Koláčový graf

Koláčové grafy jsou tak známé, že je není třeba více představovat. Následuje příklad.


In [9]:
labels = ['apples', 'oranges', 'pears'] # classes
values = [121, 56, 41] # values for classes
plt.pie(values, labels=labels) # pie chart
plt.legend() 
plt.axis('equal') # unscale to 1:1
plt.show()



Více grafů v jednom okně

Často je požadavek na zobrazení více grafů pohromadě ve skupině. Aby uživatel nemusel obrázky skládat ručně, Matplotlib dokáže grafy uspořádat sám podle instrukcí.

Pozice do které se má kreslit (subplot) v sestavě grafů je určena třemi čísly. První číslo představuje počet řádků v sestavě, durhé číslo představuje počet sloupců v sestavě a poslední číslo pořadí dané pozici v sestavě.

Následuje jednoduchý příklad - dva sloupce, jeden řádek.


In [10]:
# synthetic data
x = np.random.normal(0, 2, 20)
y = np.random.normal(0, 2, 20)

plt.figure(figsize=(8,5)) # set size

# plotting
plt.subplot(121)
plt.plot(x, y, "ob")

plt.subplot(122)
plt.plot(y, x, "or")

plt.show()


Následuje příklad, který využívá postupné změny počtu řádků a sloupců k tomu aby vytvořil složitější sestavu.


In [11]:
# synthetic data
xb = np.random.normal(0, 2, 1000)
yb = np.random.normal(1, 1, 1000)
x0 = np.random.normal(0, 2, 20)
y0 = np.random.normal(0, 2, 20)



plt.figure(figsize=(10,10)) # set size

# first row
plt.subplot(311)
plt.plot(x0, "-xk")
plt.xlabel("x [-]")
plt.ylabel("y [-]")

# second row
plt.subplot(323)
plt.hist(xb, bins=20, color="b")
plt.xlabel("x [-]")
plt.ylabel("y [-]")
plt.subplot(324)
plt.hist(yb, bins=20, color="r")
plt.xlabel("x [-]")
plt.ylabel("y [-]")

# third row
plt.subplot(337)
plt.pie(values, autopct='%1.1f%%', 
        shadow=True,startangle=140)
plt.subplot(338)
plt.boxplot([x,y], labels=["x", "y"])
plt.subplot(339)
plt.pie(values, labels=labels)

# adjust plot placement to make it nicer
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
plt.show()


Poznámka: Pří skládání grafů dohromady může někdy dojít k překrývání pospisků os a tilků grafů navzájem. Tento problém je možné ošetřit ručním přizpůsobením mezer mezi grafy (viz předposlední řádek v posledním příkladě). Někdy je možné vylepšit rozložení grafu jen pomocí zavolání příkazu plt.tight_layout() před příkazem plt.show().


Grafické styly

Matplotlib umožňuje používat grafické styly, které mění nastavení celých grafů. Následuje ukázka jednoho populárního stylu.


In [12]:
# set style ggplot
plt.style.use('ggplot')

# syntetic data
x = np.linspace(-10, 10, 100)
y1 = x**3
y2 = x**2

# plotting
plt.figure(figsize=(12,5)) # create figure with size in inches
plt.plot(x, y1, label="$y=x^3$") # plot y1
plt.plot(x, y2, label="$y=x^3$") # plot y2
plt.title("$y=f(x)$") # main title
plt.xlabel("x [-]") # x axis label
plt.ylabel("y [-]") # y axis label
plt.xlim(-7.5, 10) # limits of x axis
plt.ylim(-750, 750) # limits of y axis
plt.legend() # show legend
plt.show()