Matplotlib

Programování v GIS 2

Jan Caha

2025-04-28

Matplotlib

Matplotlib

  • v Pythonu v podstatě standard na tvorbu vizualizací a grafů
  • napsáno v Pythonu + optimalizace náročných části v C/C++
  • odděluje 3 hlavní složky
    • interní model grafu
    • API pro programátory
    • vykreslovací backend
  • rozdělení umožňuje snadnou rozšiřitelnost
  • pracuje dobře s numpy i pandas

Komponenty

  • Artist - základní třída, všechno co je vidět se od ní odvozuje
  • Figure - celý obrázek grafu
  • Axes - samotný graf (něco co má osy)
  • jeden Figure může obsahovat vícero Axes - např. dva grafy vedle sebe

Backend

  • interaktivní - třeba pro programy s GUI, nebo i z python skriptů (trochu nešťastné, protože skript se neukončí dokud se obrázek nezavře)
  • statický - tvorba obrázků v různých formátech
  • Qt5Agg, TkAgg, WebAgg Agg, PDF, SVG, PS
import matplotlib

matplotlib.use("Agg")

Stylování a konfigurace

  • buď přímo součást kódu (může být zdlouhavé a opakující se)
  • použití globálního stylu v souboru matplotlibrc - soubor se hledá buď v aktuální projektu nebo v uživatelském adresáři
  • předpřipravené styly
import matplotlib

matplotlib.style.use("ggplot")

Dva způsoby použití

  • submodul matplotlib.pyplot kde pracujeme s jedním grafem
    • všechny volané funkce pak modifikují jeden graf
    • vhodné pro menší skripty a základní ukázky
  • objektový přístup - tvorba Figure a Axes a jejich modifikace
    • vhodné pro komplexnější grafy, či situace kdy tvoříme vícero grafů v rámci skriptu
import matplotlib as mpl

# obrázek s 2 grafy - 1 řádek, 2 sloupce
# velikost obrázku je v palcích
fig, axs = mpl.pyplot.subplots(1, 2, figsize=(16, 8))
  • prvek axs je ve skutečnosti pole, jednotlivých prvků s osami, takže přistupujeme jako axs[0] atd.

Objektový přístup

  • jednotlivé modifikace voláme přímo jako metody prvků Figure a Axes
  • přehlednější a lépe přenositelné
  • metody Axes např. set_xlabel(), set_ylabel(), grid(), legend() či bar(), scatter(), plot()
  • metody Figure např. show(), savefig(), suptitle()

Ukázky

  • galerie na webu projektu obsahuje i kód
  • vyhledávání na githubu pomocí importu knihovny
  • hodně pomůže i Copilot s dobrou specifikací dotazu

Rozšíření

  • existují další knihovny postavené nad Matplotlib
  • obvykle úprava API do nějakého “vhodnějšího” formátu

Plotnine

plotnine - co to je

  • knihovna pro Python inspirovaná ggplot2 z R
  • používá koncept Grammar of Graphics
  • graf se skládá z vrstev pomocí operátoru +
  • vhodné zejména pro rychlou analytickou vizualizaci z pandas DataFrame
  • renderuje přes Matplotlib backend

Jak funguje systém (Grammar of Graphics)

  • systém je založen na skládání několika částí grafu
  • data tabulka, ze které čteme hodnoty
  • aes(...) mapování sloupců na vizuální vlastnosti (x, y, color, …)
  • geom_* jaký typ značek se vykreslí (geom_point, geom_line, geom_col)
  • stat_* volitelné statistické transformace
  • facet_*, theme_*, labs(...) rozdělení do panelů, vzhled, popisky

Mentální model tvorby grafu

    1. vyberu datový rámec
    1. namapuji proměnné přes aes(...)
    1. přidám geometrii (geom_*)
    1. doplním měřítka, popisky a téma
    1. volitelně rozdělím graf na panely (facet_wrap, facet_grid)
from plotnine import aes, geom_point, ggplot, labs, theme_minimal

p = (
    ggplot(df, aes(x="delay", y="distance", color="carrier"))
    + geom_point(alpha=0.6)
    + labs(
        title="Delay vs distance",
        x="Delay (min)",
        y="Distance (km)",
        color="Carrier",
    )
    + theme_minimal()
)

p

plotnine vs Matplotlib (kdy použít co)

  • plotnine: deklarativní zápis, rychlé skládání běžných analytických grafů
  • Matplotlib: detailní kontrola každého prvku a komplexní customizace
  • častý postup v praxi:
    • explorace dat a standardní grafy v plotnine
    • speciální finální vizualizace v Matplotlib

Dotazy?