Zopakuji poznámku z minulého dílu a doplním nové informace.
Když už se využívá Jupyter notebook, tak bych určitě použil nějaké notebookové nastavení (alternativa k inline)
%matplotlib nbagg (notebook nebo widget)
dále se mluví o interaktivitě - zde se dá využít spojení s ipywidgets:
https://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html?highlight=matplotlib#Flickering-and-jumping-output
V obou dílech se různě prolínají dva způsoby tvorby grafů - Matlabovský a objektový, což nikde není zmíněno. Z mých zkušeností to může být pro někoho (začátečníka) mírně matoucí (proč to je plt.plot() vs. ax.plot() nebo lépe plt.title() vs. ax.set_title()?). Já preferuji objektový způsob a nemíchání jich vzájemně.
U 3D grafů je dobré zmínit, že to není plnohodnotné 3D a není to tedy vhodné na složitější věci (předejde se tím zklamání). Při kombinaci více objektů nelze očekávat jejich správnou viditelnost.
Dále už jen výpis toho co mě napadá: více grafů v jednom obrázku, ukládání obrázků do souboru (vektorové i rastrové), i finalizace grafů může být zajímavé téma a určitě další.
Toto téma by si určitě zasloužilo více dílů a pečlivější zpracování pro začátečníky. Myslím, že tu je nevyužitý potenciál. V tuto chvíli je to takový nemastný neslaný úvod, který bych jako startovací materiál nedoporučil (částečně je to také tím, že zde převládá mnou nepreferovaný způsob plt).
Ten objektový způsob je podle mě bezpečnější a proč se učit 2 způsoby místo jednoho.
Podle mě to je nutné jakmile člověk potřebuje něco složitějšího - více obrázků v jednom, zakomponovat to do nějakého programu nebo využít např. zmíněný %matplotlib notebook
a ipywidgets pro vytvoření jednoduchého klikacího rozhraní v notebooku.
Příklad takové směsky (podle mě to je náchylné na chyby při různých úpravách):
plt.figure() def add_two_lines(ax): ax.plot([1,3], [2, 3]) plt.plot([1, 3], [2, 2], 'm--') ax_l = plt.subplot(1, 2, 1) plt.plot([1, 2], [1, 2]) ax_r = plt.subplot(1, 2, 2) ax_r.plot([1, 2], [1, 2]) add_two_lines(ax_l) # magentová čára v pravém obrázku?
Přikreslování do grafu v notebooku - taková "animace" bez tvorby videa:
import time %matplotlib notebook # obvykle umísťuji do samostatné 2. buňky na začátku notebooku (1. buňka importy) fig, ax = plt.subplots() for i in range(10): ax.plot([0, 1], [0, i]) time.sleep(1) fig.canvas.draw()
Dva obrázky vedle sebe s použitím Dataframe.plot, kterému pošlu objekt os pro vykreslení:
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(6, 3), sharey=True, tight_layout=True) (ax_l, ax_r) = axes df = pd.DataFrame({'x': [1, 2, 5], 'y1': [1, 2, 2], 'y2': [2, 3, 5]}) # do levého obrázku df.plot('x', 'y1', ax=ax_l, legend=False) # do pravého obrázku df.plot('x', 'y2', ax=ax_r, legend=False) # do obou obrázku přidáme lineární čáru for ax in axes: ax.plot([1, 5], [1, 5], 'k--', label='linear') ax.legend() ax_l.set_ylabel('y')
Díky za zpětnou vazbu. K těm tématům - ono by to pro úplný článek v mém obvyklém rozsahu :-) chtělo ještě něco navíc, zkusím zapřemýšlet, aby to bylo k věci (a ne například něco orientovaného spíš na Numpy).
Jen mě napadlo a poprosil bych o poslání někam, pokud je to blbost:
- co takhle udělat celý ten článek formou diáře s využitím literate programming? Nevím, jak to jde na Rootu technicky, spíše ne, takže by to byl samostatný článek/seriál. Protože zrovna u psaní tohoto článku mi vlastně začalo vadit to přeskakování mezi textem, screenshoty grafů a screenshoty diáře, když by se to mohlo udělat interaktivně a v jednom vrzu. Co vy na to?
Jo, přesně tak. https://nbconvert.readthedocs.io/en/latest/customizing.html
Kombinace Jinja a Pandas asi vyřeší každý problém. Mi to teď začínáme používat pro reporting -- jako práce s tím je, ale cesta Notebook->LaTeX->PDF vede ke slušným výsledkům.
Sorry za kritiku, asi jsem měl přílišná očekávání.
Vím, že napsat článek dá velmi hodně práce. Obvykle to vyžaduje hodně (toho čeho není nikdy dost) času, aby článek vyzrál. Proto bych to nemohl dělat já, protože bych nikdy nebyl dostatečně spokojený s výsledkem (v lepším případě by mně to zabralo více času než se vyplatí).
To jsem chtěl také zmínit, že to stálé opakování - printscreen notebooku, výsledný obrázek a kód - u téměř každé varianty, poměrně rozbíjí ten text. Pro ukázku toho, jak to vypadá v notebooku stačí v podstatě jeden obrázek pro všechny případy. Bohužel to vypadá, že redakční systém neumí zvýrazňovat syntaxi, čímž jsou ty kódy v textu takové nijaké a pro rychlejší orientaci nakonec rozkliknu ten printscreen.
Hlavně to musí být děsná piplačka připravit všechny ty obrázky.
Literate programming slyším poprvé a musel jsem se podívat co si pod tím představit. Notebook je na toto myslím ideální a často to v tímto způsobem používám.
To je v pohode, ja to puvodne nemyslel jako navod ciste na Matplotlib, ale jako ukazku, co +- umi (a hlavne - co se da relativne snadno pripravit do rekneme 20-30 radku, protoze v galerii Matplotlibu jsou nekdy naproste silenosti, ktere podle meho nazoru dokaze znovu napsat jen par lidi).
Syntaxi zobrazit primo nejde, takze se to aspon snazim resit kurzivou a tucnym pismem, kdyz uz ne jinak.
Napada me otazka pro koho je vlastne takto psany clanek urcen. Pokud se clovek s Matplotlibem nekdy setkal, uvedeny clanek je vpodstate ukazka nekolika prikladu, kterych je na netu spousta, tudiz se zrejmne nic noveho nedozvi. Pokud ho nezna, je to pekne pro ukazku toho, co umi, ale jak to poradne funguje tu poradne nedocte - viz prispevek vyse.
Jako cloveka, co pouziva Matplotlib pomerne hodne, ale stale tape v nekterych zasadnich vecech (napr. rozdil mezi ax.plot vs plt.plot viz. vyse) by me hlavne zajimalo nejake strucne vysvetleni principu jak Matplotlib funguje (za link na dobry zdroj budu vdecny :-) ). Moje zkusenost je, ze pomerne rychle dosahnu grafu, ktery zhruba vypada jak chci, ale pak 90% casu ladim drobne nuance, abych dostal svuj finalni vysledek z duvodu, ze jsem asi moc pohodlny (nebo taky hloupy) pochopit princip, pripadne nejaky systematicky postup, jake komponenty graf obsahuje a jak jsou skladany dohromady - nastesti lze vetsinu reseni vygooglit, ale casto to byva tupe copy-paste zkouseni, ktere musim pokazde opakovat znova :-(