Linux E X P R E S

Facebook

Matplotlib & Python: Profesionální software pro vytváření grafů v matematice

matplotlib.jpg

Knihovna Matplotlib umožňuje vytvářet přehledné grafy pomocí jednoduchých skriptů v Pythonu. Matplotlib nabízí nejrůznější funkcionalitu a typy grafů. Celkově se však zaměřuje především na oblast techniky a přírodních věd.


Pod označením "Python" článek vždy míní standardní implementaci CPython, aniž by se zabýval kompatibilitou Matplotlibu s alternativními implementacemi (např. Jython, IronPython, PyPy, Unladen Swallow).

Svět Pythonu, kam spadá i Matplolib, se v určitých ohledech naprosto vymyká konvencím jazyků navazujících na tradici C++, proto někteří programátoři budou hodnotit Python až jako výstřední projekt. Ze svérázu Pythonu vyplývají různé jeho přednosti a nedostatky a ty se přenášejí i na Matplotlib. Recenzi knihovny tedy započněme představením samotného Pythonu a objasněním přínosu vzájemné spolupráce mezi matematickým open sourcem.

Open source versus dinosauři

Postupně vzniklo velké množství hodnotného open-source matematického softwaru. Často se však jedná o jednoúčelová řešení, která jsou ušita na míru potřebám svého autora. Naproti tomu existují dobře zavedená komerční řešení, například mamutí prostředí Mathematica zdokonalované již přes dvacet pět let. Společnosti stojící za podobnými proprietárními projekty dbají nejrůznějších myslitelných potřeb potencionálních zákazníků, aby dosáhly co největších tržeb z prodeje licencí. Mají-li se malé dravé open-source projekty utkat s "dinosaury", musejí pochopitelně spojit síly. Zdarma dostupný konglomerát Sage svým záběrem dokáže konkurovat i Mathematice, protože skrývá pod kapotou doslova desítky dílčích open-source balíčků. Třeba při vykreslovaní grafů se Sage spoléhá na Matplotlib, při ukládání dat na SQLite a Zope Object database, ve statistice na R, při symbolických výpočtech na Maximu... Systémovou integraci u Sage zajišťuje platforma Python.

Právě Python svým duchem, jehož výhody zmiňuje následující seznam, vyhovuje účelu systémové integraci a psaní uživatelských skriptů.

  • Python nabízí velmi úsporné zápisy, jinými slovy zlepšuje produktivitu při kódování. Například odpadají "zbytečnosti" jako deklarace typu proměnných, složené datové typy se zadávají pouhými závorkami a místo separátorů příkazů stačí odřádkovat.
  • Tvorba balíčků podléhá užitečným konvencím. I bez znalostí knihovny Matplotlib vím, že print(matplotlib.__doc__) mi vypíše vestavěnou dokumentaci knihovny, dir(matplotlib) obsah knihovny, print(matplotlib.__path__) umístění knihovny a podobně.
  • Norma Pythonu vyniká svým rozsahem a komplexností. Například již návrh jazyka zavádí složené datové typy (např. slovník, posloupnost, množina), možnost funkcionálního i objektového programování, řeší problematiku reflexe... Objekty v Pythonu disponují dostatkem předpřipravených funkcí. Vše je navíc v dokumentaci skvěle objasněno.

Dokumentační řetězec Matplotlib: matplotlib.__doc__, útroby knihovny NumPy: dir(Numpy) Dokumentační řetězec Matplotlib: matplotlib.__doc__, útroby knihovny NumPy: dir(Numpy)

  • Python nepředpokládá konkrétní programátorské postupy. Není nutno ovládat Python v celé jeho šíři. Díky triviální syntaxi mohou skriptovat i laici "neprogramátoři".
  • Odpadá nutnost kompilace.
  • Často velmi krátký úsek kódu spotřebovává většina procesorového času. Tyto výkonostně kritické části se dají díky rozhraní C Api snadno přepsat do kódu v "rychlém" jazyce C.
  • K aplikaci se snadno připojí interpret Pythonu coby skriptovací nástroj pro zadávání uživatelem definovaných funkcí. Python je multiplatformní.
  • Python a navazující produkty preferují licence typu BSD, které v podstatě neobsahují žádné restrikce.

Důrazně ve prospěch Pythonu hovoří i jeho silné postavení na trhu. Průzkum společnosti Tiobe přisuzuje Pythonu pozici celkově osmého nejpopulárnějšího programovacího jazyku a po PHP druhého nejpopulárnějšího interpretovaného jazyka. Očividně dosáhl postavení hlavního skriptovacího jazyka u vědeckých aplikací. Python si výborně rozumí s nejrůznějším softwarem. Matplotlib se tak opírá o bytelnou základnu dostupného open-source softwaru.

Python se často doporučuje novopečeným programátorům. Lze ale namítnout, že kvůli své "pružnost" může utužovat začátečnické zlozvyky. Python svádí k vytváření hutného sofistikovaného kódu, kterému pisatel přestává rozumět a není s to jej udržovat. Příliš kondenzovaná vyjadřování znečitelňují zdrojový kód. Stručnost syntaxe rovněž připouští nesmyslné, byť formálně bezvadné konstrukce, a to zvyšuje riziko vzniku záludných chyb. Ledabylý programátor nechtě číslo přetypuje na řetězec a pak se diví, že mu součin čtyř krát šest vychází 6666. U jazyka s typovou kontrolou a bez ortogonálních operátorů by se nedopatření odhalilo při překladu.

S čím si Matplolib skvěle rozumí?

IPython je populární interaktivní pythoní shell, jenž se pyšní rozličnými funkcemi usnadňujícími a zpřehledňujícími práci. IPythonem se matplotlib neblokuje, grafy se dají vytvářet postupně příkaz po příkazu, nikoli jen naráz.

Balíček Numpy zavádí operace nad poli a maticemi, přičemž vlastní algoritmy jsou napsány přímo v C. Výkonnostně snese Numpy srovnání s Fortranem, C a ostatními kompilovanými jazyky. Díky tomu se hodí i pro intenzivní numerické výpočty.

Absence pokročilé matematiky frustruje, když třeba nutně potřebujete znázornit teoretickou závislost definovanou "exotickou" funkcí. Díky mnoha dostupným knihovnám tato situace u Matplolibu nehrozí.

Každý, kdo blíže přičichl k matematice, zná LaTeX a má nainstalovanou některou z jeho distribucí, pravděpodobně TeX Live. Matplotlib výborně kooperuje s LaTeXem.

Python nepřináší žádné vlastní grafické uživatelské rozhraní, nýbrž přichází s kvalitních podporou nejpoužívanějších frameworků a toolkitů. Vývojář si musí obstarat vhodný backend, například PyGTK při vývoji v GTK.

Praktický příklad

  1. Spustím shell Bash a spustím příkazem python jeho interpret.
  2. Zadám import numpy, čímž importuji knihovnu numpy pod názvem numpy. Přidáním klíčového slova as bych přejmenoval importovanou knihovnu, konkrétně import numpy as np ji importuje pod symbol np.
  3. Zadám import matplotlib.pyplot, čímž importuji modul pyplot knihovny matplotlib. Modul pyplot poskytuje rozhraní inspirované prostředím MATLAB.
  4. Zadám x = numpy.linspace(0,1), čímž definuji rozsah hodnot.
  5. Zadám line = matplotlib.pyplot.plot(x, 0.5 * numpy.sin(x * 2 * numpy.pi) * numpy.sin(x * 2 * numpy.pi)), čímž přidám řadu definovanou funkcí půl čtverce sinu s jednotkovou periodou. Další řady nebudu přidávat.
  6. Zadám matplotlib.pyplot.title(r'Funkce $\frac{1}{2} \mathrm{sin}^{2}(2 \pi x )$'), čímž určím nadpis grafu. Jak vidět, matplotlib podporuje fundamenty jazyka LaTeX. Knihovna umí i přenechat sazbu přímo vaší instalaci Latexu, záleží na nastavení konfiguračních souborů. Nutnost popsat osy budeme v této elementární ukázce ignorovat.
  7. Zadám matplotlib.pyplot.show() a dostanu okno s grafem. Tlačítka v okně dole ukládají obrázek, upravují jeho rozměry a zoomují.

Výsledek příkladu Výsledek příkladu

Obtíže při přímém psaní nepřehledného LaTeXového kódu překonávají specializované editory. O některých informují články Editory pro TeX: Aplikace s grafickým rozhraním, Editory pro TeX: staří mazáci a Latexila vs Gummi.

Grafy v Matplotlibu

Vynášet lze body, sloupce, kruhové výseče (kruhový graf), symboly reprezentující více bodů (např. krabicový graf), četnost jevů (histogram), křivky procházející danými body, šipky zachycující průběh siločar a izolinie... Vymezení intenzity a kvality jevu se provádí symbolem, velikostí symbolu, barvou, barevným přechodem, orientací šipky... Do jednoho výstupu lze seskládat různé grafy. Zkrátka dovednosti Matplotlibu se vypořádávají se všemi problémy běžné technické praxe.

Ilustrace pocházejí z rozsáhlé galerie na webu Matplotlibu. Odkazy z popisků obrázků směřují na příslušnou sekci Matplotlibu, kde se nacházejí u každého příkladu kompletní komentované zdrojové kódy a klíčová slova.

<a href= Krabicový graf

Projekce bodů do histogramů Projekce bodů do histogramů

Proudění Proudění

Výstup s čtveřicí polárních grafů Výstup s čtveřicí polárních grafů

Svícový graf Svícový graf

Rozšíření Mplot3d přidává do světa Matplolibu třetí rozměr. Rozšíření Carthopy a Basemap přidávají kartografické funkce, tedy především vykreslení mapových podkladů ve zvolené kartografické projekci a vypočítávání spojnic (např. ortodromy).

Lorenzův atraktor Slavný Lorenzův atraktor

Projekce plochy Projekce plochy

Táž oblast ve dvou zobrazeních Táž oblast ve dvou zobrazeních

Naopak chybějí znázornění vhodná výhradně pro "business" typu Ganntův diagram. Rovněž v Matplotlibu nenaleznete hojnost různých zkrášlovacích a ozvláštňujících vizuálních efektů známých z programů pro přípravu prezentací, tabulkových editorů a jiného "businessového" softwaru, což však příliš nevadí. V odborné publikaci by stejně tyto libůstky působily nepatřičně, ba až dětinsky.

Uživatel Matplotlibu si může přímo "sáhnout" na plátno grafu a na přesně určené místo vložit bod, spline, elipsa, obrázek ze souboru a další grafická primitiva. Dále se dají vložit i různé šipky, popisky, texty a další vysokoúrovňové objekty, u kterých Matplotlib vhodně zvolí font, zarovnání a různá další formátování.

Text  vložený do grafu Text vložený do grafu

Tyto pokročilé funkce de facto dělají z Matplotlibu knihovnu pro tvorbu vektorové grafiky, kterou si tvoříme diagramy podle svého gusta. Dokumentace předvádí elegantní schéma toků energie v tepelném stroji.

Schéma  tepelného stroje Schéma tepelného stroje

Problematika zpracování grafu a jeho přizpůsobení specifikům výstupního zařízení Matplotlib hezky vyřešil jak z hlediska ztvárnění grafu, tak z hlediska vlastní typografie. Například možnost ztvárnění ploch v grafu šrafováním oceníte v situaci, kdy vzhledem k černobílému tisku požadujete nebarevné výplně. V oblasti typografie je volitelné rozlišení dpi, fonty, velikost písma, tloušťka čar, nastavení barevného profilu... Výchozí typografická pravidla určuje konfigurační soubor matplotlibrc, jenž definuje základní chování Matplolibu. Obsah souboru je exportován v poli matplolib.rcParams, jehož změnami se provede přenastavení veličin. Například použití LaTeXu nastaví příkaz matplotlib.rcParams['text.usetex']=True a příkaz matplotlib.rcParams['text.latex.unicode']=True mu určí kódování.

Knihovna podporuje rendery Cairo (různé vektorové formáty), GDK (různé bitmapové formáty), AGG (png), PS (ps, eps), PDF, SVG a backendy GTKAgg/GTK3Agg (GTK 2.x a 3.x), GTK (přes GDK), GTKCairo/GTK3Cairo, WXAgg (WxWidgety), TkAgg (TkInter), Qt4Agg (Qt4) a macosx (Cocoa). Podrobnosti uvádí stránka Faq usage.

Špičkový produkt

Ve své kategorii se jedná bezesporu o špičkový produkt. Nemyslím si, že by trpěl nějakými zásadními neduhy. Na Matplotlibu oceňuji především rozsah funkcí, podporu LaTeXu, přehlednou a věcnou dokumentaci, přívětivost k začátečníkům, jeho typografické schopnosti a že dokumentace ukazuje návody jakoby ze života, nikoli zjednodušující schematizované příklady.

Bližší informace naleznete na oficiálních stránkách, v anglické dokumentace na oficiálních stránkách a v částečném českém překladě oficiálního průvodce.

Diskuze (3) Nahoru