Obsah
1. Kombinace možností ggplot2 a Pythonu: knihovna Plotnine
2. Instalace knihovny Plotnine
3. Testovací data poskytovaná knihovnou Plotnine
5. Vykreslení grafu na obrazovku, uložení grafu do souboru
6. Forma zápisu složitějších grafů
7. Další dostupná testovací data – mtcars
8. Použití třetího datového sloupce v korelačním diagramu
9. Rozdělení grafu na menší grafy na základě třetí či čtvrté hodnoty
12. Graf pro větší množství sloupců v datovém rámci
13. Aproximace zobrazovaných křivkou
15. Kombinace Pythonu, Jupyter Notebooku a knihovny plotnine
16. Načtení testovací datové sady
17. Vykreslení grafů do plochy diáře
18. Repositář s demonstračními příklady
1. Kombinace možností ggplot2 a Pythonu: knihovna Plotnine
V předchozích dvou částech [1] [2] seriálu o programovacím jazyce R jsme si řekni základní informace o knihovně nazvané ggplot2. Tato knihovna slouží k tvorbě různých typů grafů, které se postupně skládají z několika objektů s využitím takzvané „grammar of graphics“. A právě díky tomu je knihovna ggplot2 velmi oblíbená a mnozí uživatelé přechází na jazyk R právě kvůli existenci této knihovny (i když jazyk R nabízí i mnoho dalších důležitých technologií).
Obrázek 1: Princip konstrukce grafů s využitím grammar of graphics.
Autor: Javier Luraschi, https://github.com/javierluraschi
Koncepty, na nichž je knihovna ggplot2 postavena, je však možné využít i v dalších programovacích jazycích. Velmi dobrým příkladem může být programovací jazyk Python, pro který vznikla podobně koncipovaná knihovna nazvaná plotnine. Tu lze do určité míry kombinovat s knihovnou Matplotlib. Kombinace Pythonu a nad ním postavených knihoven společně s plotnine může být velmi užitečná; proto se touto knihovnou budeme zabývat v dnešním článku (další články již opět budou věnovány programovacímu jazyku R). Navíc je nutné již na začátek poznamenat, že plotnine není solitérem v ekosystému Pythonu. Naopak, používá například Pandas pro datové rámce atd., takže integrace do stávajících systémů může být relativně snadná.
Obrázek 2: Mapování hodnot na vizuální vlastnosti (barva …).
Autor: Javier Luraschi, https://github.com/javierluraschi
2. Instalace knihovny Plotnine
Začněme nejdůležitější věcí – jak vlastně knihovnu Plotnine nainstalovat. Tato knihovna je dostupná na PyPi, takže její instalace je ve skutečnosti velmi snadná, protože si vystačíme s nástrojem pip/pip3 a popřípadě s virtuálním prostředím Pythonu (pokud ho ve svých projektech používáte). Instalaci lze provést pouze pro aktuálně přihlášeného uživatele s využitím přepínače –user:
$ pip install --user plotnine
Na systémech s instalací Pythonu 2 a současně i Pythonu 3 se ještě může specifikovat verze Pythonu použitím nástroje pip3:
$ pip3 install --user plotnine
Povšimněte si, že se při instalaci mj. nainstalují či upgradují i knihovny Matplotlib a Pandas, na kterých plotnine závisí:
Collecting plotnine Downloading https://files.pythonhosted.org/packages/a9/37/d8b7ca612ce3d16fe542ebb276238befc2b0b0ba97c31c7c839333c7e33f/blob/master/plotnine-0.7.1-py3-none-any.whl (4.4MB) Collecting statsmodels>=0.11.1 (from plotnine) Downloading https://files.pythonhosted.org/packages/be/4c/9e2435ca6645d6bafa2b51bb11f0a365b28934a2ffe9d6e339d67130926d/statsmodels-0.12.1-cp36-cp36m-manylinux1_x86_64.whl (9.5MB) Collecting matplotlib>=3.1.1 (from plotnine) Downloading https://files.pythonhosted.org/packages/cd/d6/8c4dfb23151d5a494c66ebbfdb5c8c433b44ec07fae52da5939fcda0943f/matplotlib-3.3.2-cp36-cp36m-manylinux1_x86_64.whl (11.6MB) Collecting scipy>=1.2.0 (from plotnine) Downloading https://files.pythonhosted.org/packages/c8/89/63171228d5ced148f5ced50305c89e8576ffc695a90b58fe5bb602b910c2/scipy-1.5.4-cp36-cp36m-manylinux1_x86_64.whl (25.9MB) Collecting descartes>=1.1.0 (from plotnine) Downloading https://files.pythonhosted.org/packages/e5/b6/1ed2eb03989ae574584664985367ba70cd9cf8b32ee8cad0e8aaeac819f3/descartes-1.1.0-py3-none-any.whl Collecting pandas>=1.1.0 (from plotnine) Downloading https://files.pythonhosted.org/packages/4d/51/bafcff417cd857bc6684336320863b5e5af280530213ef8f534b6042cfe6/pandas-1.1.4-cp36-cp36m-manylinux1_x86_64.whl (9.5MB) Collecting numpy>=1.16.0 (from plotnine) Downloading https://files.pythonhosted.org/packages/a6/fc/36e52d0ae2aa502b211f1bcd2fdeec72d343d58224eabcdddc1bcb052db1/numpy-1.19.4-cp36-cp36m-manylinux1_x86_64.whl (13.4MB) Collecting patsy>=0.5.1 (from plotnine) Downloading https://files.pythonhosted.org/packages/ea/0c/5f61f1a3d4385d6bf83b83ea495068857ff8dfb89e74824c6e9eb63286d8/patsy-0.5.1-py2.py3-none-any.whl (231kB) Collecting mizani>=0.7.1 (from plotnine) Downloading https://files.pythonhosted.org/packages/ef/02/2b0627d451734afc7c30be4a0f3b8ffb9499c00cb68b44e80dda22d1dc84/mizani-0.7.2-py3-none-any.whl (62kB) Requirement already satisfied: python-dateutil>=2.1 in ./.local/lib/python3.6/site-packages (from matplotlib>=3.1.1->plotnine) Collecting certifi>=2020.06.20 (from matplotlib>=3.1.1->plotnine) Downloading https://files.pythonhosted.org/packages/c1/6f/3d85f0850962279a7e4c622695d7b3171e95ac65308a57d3b29738b27149/certifi-2020.11.8-py2.py3-none-any.whl (155kB) Requirement already satisfied: cycler>=0.10 in ./.local/lib/python3.6/site-packages (from matplotlib>=3.1.1->plotnine) Collecting pillow>=6.2.0 (from matplotlib>=3.1.1->plotnine) Downloading https://files.pythonhosted.org/packages/5f/19/d4c25111d36163698396f93c363114cf1cddbacb24744f6612f25b6aa3d0/Pillow-8.0.1-cp36-cp36m-manylinux1_x86_64.whl (2.2MB) Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /usr/lib/python3.6/site-packages (from matplotlib>=3.1.1->plotnine) Requirement already satisfied: kiwisolver>=1.0.1 in ./.local/lib/python3.6/site-packages (from matplotlib>=3.1.1->plotnine) Requirement already satisfied: pytz>=2017.2 in /usr/lib/python3.6/site-packages (from pandas>=1.1.0->plotnine) Requirement already satisfied: six in ./.local/lib/python3.6/site-packages (from patsy>=0.5.1->plotnine) Collecting palettable (from mizani>=0.7.1->plotnine) Downloading https://files.pythonhosted.org/packages/ca/46/5198aa24e61bb7eef28d06cb69e56bfa1942f4b6807d95a0b5ce361fe09b/palettable-3.3.0-py2.py3-none-any.whl (111kB) Requirement already satisfied: setuptools in /usr/lib/python3.6/site-packages (from kiwisolver>=1.0.1->matplotlib>=3.1.1->plotnine) Installing collected packages: numpy, patsy, scipy, pandas, statsmodels, certifi, pillow, matplotlib, descartes, palettable, mizani, plotnine Found existing installation: numpy 1.14.2 Uninstalling numpy-1.14.2: Successfully uninstalled numpy-1.14.2 Found existing installation: matplotlib 2.2.2 Uninstalling matplotlib-2.2.2: Successfully uninstalled matplotlib-2.2.2 Successfully installed certifi-2020.11.8 descartes-1.1.0 matplotlib-3.3.2 mizani-0.7.2 numpy-1.19.4 palettable-3.3.0 pandas-1.1.4 patsy-0.5.1 pillow-8.0.1 plotnine-0.7.1 scipy-1.5.4 statsmodels-0.12.1
Obrázek 3: Ukázka možností grafického výstupu jazyka R.
3. Testovací data poskytovaná knihovnou Plotnine
Při ukázkách některých možností nabízených jazykem R jsme používali testovací data, která jsou součástí standardních balíčků. Podobnými daty disponuje i knihovna Plotnine, což je výhodné, minimálně při pokusech s tvorbou grafů. První grafy budeme vytvářet s využitím datového souboru nazvaného economics, který se importuje z balíčku plotnine.data:
from plotnine.data import economics print(economics)
Výsledkem předchozího triviálního skriptu by měl být tento výstup:
date pce pop psavert uempmed unemploy 0 1967-07-01 507.4 198712 12.5 4.5 2944 1 1967-08-01 510.5 198911 12.5 4.7 2945 2 1967-09-01 516.3 199113 11.7 4.6 2958 3 1967-10-01 512.9 199311 12.5 4.9 3143 4 1967-11-01 518.1 199498 12.5 4.7 3066 .. ... ... ... ... ... ... 569 2014-12-01 12122.0 320201 5.0 12.6 8688 570 2015-01-01 12080.8 320367 5.5 13.4 8979 571 2015-02-01 12095.9 320534 5.7 13.1 8705 572 2015-03-01 12161.5 320707 5.2 12.2 8575 573 2015-04-01 12158.9 320887 5.6 11.7 8549 [574 rows x 6 columns]
Vidíme, že datový soubor obsahuje celkem 574 záznamů. Z nich si můžeme zobrazit pouze určitou část, a to s využitím metody head:
from plotnine.data import economics print(economics.head())
S výsledkem:
date pce pop psavert uempmed unemploy 0 1967-07-01 507.4 198712 12.5 4.5 2944 1 1967-08-01 510.5 198911 12.5 4.7 2945 2 1967-09-01 516.3 199113 11.7 4.6 2958 3 1967-10-01 512.9 199311 12.5 4.9 3143 4 1967-11-01 518.1 199498 12.5 4.7 3066
Popř. lze specifikovat počet zobrazených záznamů:
from plotnine.data import economics print(economics.head(20))
Tentokrát se podle požadavku zobrazí dvacet záznamů:
date pce pop psavert uempmed unemploy 0 1967-07-01 507.4 198712 12.5 4.5 2944 1 1967-08-01 510.5 198911 12.5 4.7 2945 2 1967-09-01 516.3 199113 11.7 4.6 2958 3 1967-10-01 512.9 199311 12.5 4.9 3143 4 1967-11-01 518.1 199498 12.5 4.7 3066 5 1967-12-01 525.8 199657 12.1 4.8 3018 6 1968-01-01 531.5 199808 11.7 5.1 2878 7 1968-02-01 534.2 199920 12.2 4.5 3001 8 1968-03-01 544.9 200056 11.6 4.1 2877 9 1968-04-01 544.6 200208 12.2 4.6 2709 10 1968-05-01 550.4 200361 12.0 4.4 2740 11 1968-06-01 556.8 200536 11.6 4.4 2938 12 1968-07-01 563.8 200706 10.6 4.5 2883 13 1968-08-01 567.6 200898 10.4 4.2 2768 14 1968-09-01 568.8 201095 10.4 4.6 2686 15 1968-10-01 572.3 201290 10.6 4.8 2689 16 1968-11-01 577.4 201466 10.4 4.4 2715 17 1968-12-01 577.2 201621 10.9 4.4 2685 18 1969-01-01 584.2 201760 10.0 4.4 2718 19 1969-02-01 589.5 201881 9.4 4.9 2692
Zajímavé bude zjistit, jakým datovým typem je vlastně datový set tvořen:
from plotnine.data import economics print(type(economics))
Ze zobrazeného typu je patrné, že se jedná o klasický datový rámec z knihovny Pandas:
<class 'pandas.core.frame.DataFrame'>
To má své výhody, protože pro tento datový rámec je definováno mnoho metod. Užitečná je například metoda pro získání základních statistických informací:
from plotnine.data import economics print(economics.describe())
pce pop psavert uempmed unemploy count 574.000000 574.000000 574.000000 574.000000 574.000000 mean 4843.510453 257189.381533 7.936585 8.610105 7771.557491 std 3579.287206 36730.801593 3.124394 4.108112 2641.960571 min 507.400000 198712.000000 1.900000 4.000000 2685.000000 25% 1582.225000 224896.000000 5.500000 6.000000 6284.000000 50% 3953.550000 253060.000000 7.700000 7.500000 7494.000000 75% 7667.325000 290290.750000 10.500000 9.100000 8691.000000 max 12161.500000 320887.000000 17.000000 25.200000 15352.000000
4. Konstrukce grafu
Víme již, jak se s využitím knihovny ggplot2 vytváří grafy v jazyce R:
library(ggplot2) ggplot(mtcars) + aes(x = mpg, y = wt) + geom_point()
Postup v Pythonu je vlastně velmi podobný, což je ukázáno na dalším demonstračním příkladu, v němž se používají nám již známé koncepty, tedy specifikace zdroje dat, takzvané „estetiky“ (mapování dat na grafické entity) a vlastního vykreslení, v tomto případě s využitím lomené čáry:
from plotnine.data import economics from plotnine import ggplot, aes, geom_line ggplot(economics) + aes(x="date", y="pop") + geom_line()
5. Vykreslení grafu na obrazovku, uložení grafu do souboru
Předchozí demonstrační příklad možná poněkud překvapivě graf nevykreslil, resp. přesněji řečeno vykreslil, ale pouze tehdy, pokud byly příkazy zadány do interaktivního prostředí Pythonu (a nikoli spuštěny ze skriptu). Důvod je jednoduchý – objekt představující graf musíme „vypsat“, a to běžnou standardní funkcí print:
from plotnine.data import economics from plotnine import ggplot, aes, geom_line g = ggplot(economics) + aes(x="date", y="pop") + geom_line() print(g)
Obrázek 4: Výsledek běhu předchozího příkladu.
Můžeme si vyzkoušet i složitější graf se specifikací popisu obou os grafu:
from plotnine.data import economics from plotnine import ggplot, aes, geom_line, labs g = ggplot(economics) + aes(x="date", y="uempmed") + geom_line() + labs(x="date", y="median duration of unemployment") print(g)
Obrázek 5: Popis os grafu (navíc zobrazujeme odlišný sloupec z datového rámce).
Alternativně je možné graf uložit do souboru, například ve formě rastrového obrázku ve formátu PNG. Pro tento účel se použije metoda save:
from plotnine.data import economics from plotnine import ggplot, aes, geom_line g = ggplot(economics) + aes(x="date", y="pop") + geom_line() g.save("04.png")
Obrázek 6: Soubor s obrázkem vytvořený předchozím příkladem.
6. Forma zápisu složitějších grafů
S využitím „grammar of graphics“ se grafy skládají z několika objektů (ve smyslu jazyka Python). Proto se často používá zápis konstrukce grafů rozepsaný na více řádků. Méně často používaný způsob vyžaduje na konci jednotlivých řádků použít zpětná lomítka:
from plotnine.data import economics from plotnine import ggplot, aes, geom_line, labs g = ggplot(economics) + \ aes(x="date", y="uempmed") + \ geom_line() + \ labs(x="date", y="median duration of unemployment") print(g)
Častěji se však setkáme s tím, že se celá konstrukce grafu uzavře do kulatých závorek, takže interpret již v tomto případě nevyžaduje zpětná lomítka:
from plotnine.data import economics from plotnine import ggplot, aes, geom_line, labs g = (ggplot(economics) + aes(x="date", y="uempmed") + geom_line() + labs(x="date", y="median duration of unemployment")) print(g)
7. Další dostupná testovací data – mtcars
Další datový set, který můžeme použít při tvorbě grafů, již velmi dobře známe z jazyka R. Jedná se o soubor údajů o 32 typech automobilů a datový set se nazývá mtcars:
from plotnine.data import mtcars print(mtcars)
Příslušný datový rámec vypadá následovně:
name mpg cyl disp hp drat wt qsec vs am gear carb 0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 5 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 6 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 7 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 8 Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 9 Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 10 Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 11 Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 12 Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 13 Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 14 Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 15 Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 16 Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 17 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 18 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 19 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 20 Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 21 Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 22 AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 23 Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 24 Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 25 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 26 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 27 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 28 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 29 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 30 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 31 Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Zobrazit si můžeme i statistické informace o tomto datovém rámci:
from plotnine.data import mtcars print(mtcars.describe())
S výsledky:
mpg cyl disp ... am gear carb count 32.000000 32.000000 32.000000 ... 32.000000 32.000000 32.0000 mean 20.090625 6.187500 230.721875 ... 0.406250 3.687500 2.8125 std 6.026948 1.785922 123.938694 ... 0.498991 0.737804 1.6152 min 10.400000 4.000000 71.100000 ... 0.000000 3.000000 1.0000 25% 15.425000 4.000000 120.825000 ... 0.000000 3.000000 2.0000 50% 19.200000 6.000000 196.300000 ... 0.000000 4.000000 2.0000 75% 22.800000 8.000000 326.000000 ... 1.000000 4.000000 4.0000 max 33.900000 8.000000 472.000000 ... 1.000000 5.000000 8.0000 [8 rows x 11 columns]
mtcars mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
8. Použití třetího datového sloupce v korelačním diagramu
V grafu lze zvýraznit i hodnoty ze třetího (čtvrtého atd.) sloupce, a to například změnou barvy vykreslovaných bodů. Pro zajímavost jsou do grafu přidány i regresní přímky, které budou použity i v některých navazujících demonstračních příkladech:
from plotnine import ggplot, geom_point, aes, stat_smooth, facet_wrap from plotnine.data import mtcars print(ggplot(mtcars, aes('wt', 'mpg', color='factor(gear)')) + geom_point() + stat_smooth(method='lm'))
Obrázek 7: Třetí sloupec ovlivňuje barvu bodů; přidány jsou i regresní přímky.
9. Rozdělení grafu na menší grafy na základě třetí či čtvrté hodnoty
Asi nás již nepřekvapí, že graf lze rozdělit do mřížky (grid/lattice) na základě třetí popř. čtvrté hodnoty, což je v praxi velmi užitečné:
from plotnine import ggplot, geom_point, aes, stat_smooth, facet_wrap from plotnine.data import mtcars print(ggplot(mtcars, aes('wt', 'mpg', color='factor(gear)')) + geom_point() + stat_smooth(method='lm') + facet_wrap('~gear'))
Obrázek 8: Rozdělení grafu na menší grafy na základě třetí hodnoty (počtu rychlostních stupňů).
10. Sloupcové diagramy
Snadno lze vykreslit i sloupcový diagram s využitím funkce geom_bar namísto geom_point či geom_line. Zobrazme například třídu vozů, resp. přesněji řečeno kolik vozů spadá do dané třídy:
from plotnine.data import mpg from plotnine import ggplot, aes, geom_bar print(ggplot(mpg) + aes(x="class") + geom_bar())
Obrázek 9: Sloupcový diagram.
V jiném sloupcovém diagramu zobrazíme, kolik typů vozů obsahuje motor se čtyřmi, pěti, šesti či osmi válci:
from plotnine.data import mpg from plotnine import ggplot, aes, geom_bar print(ggplot(mpg) + aes(x="cyl") + geom_bar())
Obrázek 10: Další forma sloupcového diagramu.
11. Histogramy
Předchozí dva sloupcové grafy představovaly nejjednodušší formu histogramu. Histogram ovšem můžeme zobrazit i pro reálné hodnoty (z určitého rozsahu); pouze je nutné zvolit počet intervalů, které určují i počet sloupců histogramu. Použijeme funkci stat_bins, která zásadně ovlivní vzhled grafu:
from plotnine.data import mtcars from plotnine import ggplot, aes, geom_bar, stat_bin print(ggplot(mtcars) + aes(x="hp") + stat_bin(bins=12) + geom_bar())
Obrázek 11: Histogram s výkony motorů.
Histogram pro datový set s větším počtem hodnot, hodnoty jsou rozděleny do dvaceti intervalů (tříd):
from plotnine.data import economics from plotnine import ggplot, aes, geom_bar, stat_bin print(ggplot(economics) + aes(x="uempmed") + stat_bin(bins=20) + geom_bar())
Obrázek 12: Histogram, který ukazuje dobu pobírání příspěvků v nezaměstnanosti (v USA).
12. Graf pro větší množství sloupců v datovém rámci
Ukažme si ještě další příklady rozdělení původního grafu do menších grafů na základě třetí popř. čtvrté zobrazované hodnoty. Povšimněte si způsobu zápisu sloupců, podle jejichž hodnoty se má graf rozdělit – zápis odpovídá jazyku R, ovšem v Pythonu operátor ~ (tilda) nelze použít, takže se musí parametr uložit do řetězce. Prakticky žádné další rozdíly oproti R zde nenalezneme:
from plotnine.data import mpg from plotnine import ggplot, aes, facet_grid, labs, geom_point, stat_smooth print(ggplot(mpg) + facet_grid(facets="year~class") + aes(x="displ", y="hwy") + labs( x="Engine Size", y="Miles per Gallon", title="Miles per Gallon for Each Year and Vehicle Class") + geom_point())
Obrázek 13: Graf rozdělený podle sloupců year a class.
Opět nám nic nebrání v proložení bodů regresní přímkou:
from plotnine.data import mpg from plotnine import ggplot, aes, facet_grid, labs, geom_point, stat_smooth print(ggplot(mpg) + facet_grid(facets="year~class") + aes(x="displ", y="hwy") + labs( x="Engine Size", y="Miles per Gallon", title="Miles per Gallon for Each Year and Vehicle Class") + geom_point() + stat_smooth(method='lm'))
Obrázek 14: Kombinace předchozího grafu a použití regresních přímek pro lepší pochopení významu zobrazovaných dat.
13. Aproximace zobrazovaných křivkou
Zobrazovaná data lze aproximovat křivkou, k čemuž se používá funkce geom_smooth. Tu již známe z programovacího jazyka R a knihovny ggplot2, takže si jen připomeňme, že tato funkce do grafu vkládá další grafický objekt, u nějž můžeme specifikovat jeho vizuální styl (v našem případě barvu):
from plotnine.data import economics from plotnine import ggplot, aes, facet_grid, labs, geom_point, geom_smooth, xlab, ylab print(ggplot(economics) + aes(x="date", y="uempmed") + geom_point() + geom_smooth(color="red") + xlab("date (year)") + ylab("unemploynment"))
Obrázek 15: Aproximace zobrazovaných dat křivkou.
Volit lze rozsah hodnot použitých pro výpočet bodů na křivce. Čím je rozsah menší, tím více se křivka přimyká k datům; na druhou stranu se ovšem projeví i krátkodobé výkyvy:
from plotnine.data import economics from plotnine import ggplot, aes, facet_grid, labs, geom_point, geom_smooth, xlab, ylab print(ggplot(economics) + aes(x="date", y="uempmed") + geom_point() + geom_smooth(color="red", span=0.5) + xlab("date (year)") + ylab("unemploynment"))
Obrázek 16: Aproximace zobrazovaných dat křivkou s parametrem span=0,5.
Další zmenšení parametru span, tedy intervalu hodnot pro výpočet aproximační křivky:
from plotnine.data import economics from plotnine import ggplot, aes, facet_grid, labs, geom_point, geom_smooth, xlab, ylab print(ggplot(economics) + aes(x="date", y="uempmed") + geom_point() + geom_smooth(color="red", span=0.1) + xlab("date (year)") + ylab("unemploynment"))
Obrázek 17: Aproximace zobrazovaných dat křivkou s parametrem span=0,1.
14. Lineární regrese
Velmi užitečnou pomůckou jsou regresní přímky, které jsme si opět ukázali již při popisu knihoven programovacího jazyka R. Takže jen krátce – regresní přímka se do grafu vloží funkcí geom_smooth, u níž ovšem musíme specifikovat nepovinný (pojmenovaný) parametr method=„lm“. Současně se do grafu vloží i šedá plocha zobrazující odchylky (tuto plochu lze v případě potřeby zakázat):
from plotnine.data import economics from plotnine import ggplot, aes, facet_grid, labs, geom_point, geom_smooth, xlab, ylab print(ggplot(economics) + aes(x="date", y="uempmed") + geom_point() + geom_smooth(color="red", method="lm") + xlab("date (year)") + ylab("unemploynment"))
Obrázek 18: Regresní přímka vložená do grafu.
15. Kombinace Pythonu, Jupyter Notebooku a knihovny plotnine
Z praktického hlediska je velmi dobrou kombinací programovací jazyk Python, interaktivní prostředí nazvané Jupyter Notebook a právě knihovna plotnine, která dokáže vykreslovat grafy přímo na plochu diářů (notebook). Jupyter Notebook vznikl z neméně známého a používaného projektu IPython Notebook(s). Toto interaktivní prostředí, které se zobrazuje přímo ve webovém prohlížeči, obsahuje klasickou smyčku REPL (Read–Eval–Print–Loop), což mj. znamená, že se jednotlivé výrazy zapsané uživatelem mohou ihned vyhodnocovat s prakticky okamžitou zpětnou vazbou. Navíc však nástroj Jupyter Notebook dokáže do okna prohlížeče vykreslovat tabulky, grafy či různé obrázky, a to jak s přímým využitím předaných dat (vektory či sekvence čísel), tak i při specifikaci funkce, jejíž průběh se má vykreslit (existují zde ovšem některá omezení, kterými se budu zabývat v navazujících kapitolách). Třešničkou na dortu je podpora pro práci se vzorci psanými v TeXu či LaTeXu, tvorba slajdů, sdílení „živého“ zdrojového kódu atd.
Obrázek 19: Klasický IPython notebook – jedná se o nástroj, který umožňoval interaktivní ovládání interpretru Pythonu z GUI, nabízel všechny možnosti konzolového IPythonu a navíc i podporoval práci s grafickými objekty (rastrové obrázky, grafy, diagramy atd.).
Celé grafické uživatelské rozhraní Jupyter Notebooku napodobuje diář (notebook), do kterého se zapisují jak poznámky, tak i případný programový kód a jeho výsledek, takže se tento systém může hodit i pro tvorbu (interaktivních) prezentací, použití sdílené pracovní plochy, zápis postupů, na nichž jsou jednotlivé výpočty založeny atd. Ostatně v tomto ohledu není přístup zvolený autory nijak nový ani přelomový, protože například i populární Matlab používá podobnou technologii (i když založenou na jiném programovacím jazyku).
Obrázek 20: Použití Pythonu v Jupyteru při výpočtu fraktálů. Složitější numerické výpočty jsou jednou z oblastí, v níž by bylo výhodnější použít jiný programovací jazyk, resp. přesněji jeho jádro propojené s Jupyterem (Julia, Go, C/C++).
Zdroj
Samotným Jupyter Notebookem jsme se již na stránkách Roota zabývali, takže si v navazujících kapitolách ukážeme pouze kooperaci s knihovnou plotnine.
16. Načtení testovací datové sady
Interaktivní prostředí Jupyter Notebooku je nejlepší popsat přímo s využitím screenshotů:
Obrázek 21: Načtení testovací datové sady.
Obrázek 22: Zobrazení statistických informací o datové sadě.
17. Vykreslení grafů do plochy diáře
Obrázek 23: Zobrazení jednoduchého grafu.
Obrázek 24: Aproximace hodnot křivkou (povšimněte si, že ne všechny vlastnosti ggplot2 jsou již nyní dostupné).
Obrázek 25: Aproximace více křivkami, změna velikosti vykreslených bodů atd.
18. Repositář s demonstračními příklady
Zdrojové kódy všech dnes použitých demonstračních příkladů byly uloženy do nového Git repositáře, který je dostupný na adrese https://github.com/tisnik/most-popular-python-libs V případě, že z nějakého důvodu nebudete chtít klonovat celý repositář (ten je ovšem – alespoň prozatím – velmi malý, dnes má stále jen jednotky kilobajtů), můžete namísto toho použít odkazy na jednotlivé demonstrační příklady, které naleznete v následující tabulce:
Většina předchozích demonstračních příkladů zobrazila graf s samostatném okně s možností manipulace s tímto grafem. Další příklady vytvoří naprosto stejné grafy, ovšem uloží je do souboru ve formátu PNG (jedná se tedy o rastrový obrázek použitelný například na webových stránkách atd., viz odkazy uvedené na samotném konci článku):
19. Odkazy na Internetu
- Using ggplot in Python: Visualizing Data With plotnine
https://realpython.com/ggplot-python/ - A Grammar of Graphics for Python
https://plotnine.readthedocs.io/en/stable/ - Plotnine gallery
https://plotnine.readthedocs.io/en/latest/gallery.html - plotnine 0.7.1 na PyPi
https://pypi.org/project/plotnine/ - plotnine-examples 0.0.4 na PyPi
https://pypi.org/project/plotnine-examples/ - plotnine examples repository
https://github.com/has2k1/plotnine-examples - Data visualization in R: cheat sheet
https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf - The R Project for Statistical Computing
https://www.r-project.org/ - An Introduction to R
https://cran.r-project.org/doc/manuals/r-release/R-intro.pdf - R (programming language)
https://en.wikipedia.org/wiki/R_(programming_language) - The R Programming Language
https://www.tiobe.com/tiobe-index/r/ - R Graphics Second Edition
https://www.stat.auckland.ac.nz/~paul/RG2e/ - ggplot2 – Introduction
https://www.tutorialspoint.com/ggplot2/ggplot2_introduction.htm - ggplot2: Elegant Graphics for Data Analysis
https://ggplot2-book.org/index.html - Create Elegant Data Visualisations Using the Grammar of Graphics
https://www.rdocumentation.org/packages/ggplot2/versions/3.3.2 - Grid
https://www.stat.auckland.ac.nz/~paul/grid/grid.html - Interactive Course: Data Visualization with lattice in R
https://www.datacamp.com/courses/data-visualization-in-r-with-lattice - Lattice: trellis graphics for R
https://lattice.r-forge.r-project.org/ - Lattice: Multivariate Data Visualization with R
http://lmdvr.r-forge.r-project.org/figures/figures.html - Getting Started with Lattice Graphics
https://lattice.r-forge.r-project.org/Vignettes/src/lattice-intro/lattice-intro.pdf - Using lattice’s xyplot()
https://homerhanumat.github.io/tigerstats/xyplot.html - ggplot2 Tutorial
https://www.tutorialspoint.com/ggplot2/index.htm - Lattice Package in R with Functions and Graphs
https://techvidvan.com/tutorials/lattice-package-in-r/ - The R Graph Gallery
https://www.r-graph-gallery.com/index.html - Lattice Graphs
https://www.statmethods.net/advgraphs/trellis.html - ggplot2 (Graph gallery)
https://www.r-graph-gallery.com/ggplot2-package.html - R Markdown
https://rmarkdown.rstudio.com/ - R Markdown: The Definitive Guide
https://bookdown.org/yihui/rmarkdown/ - R Markdown Cheat Sheet
https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf - Introduction to R Markdown
https://rmarkdown.rstudio.com/articles_intro.html - R Cheat Sheets
https://blog.sergiouri.be/2016/07/r-cheat-sheets.html - R Cheat Sheet
https://s3.amazonaws.com/quandl-static-content/Documents/Quandl±+R+Cheat+Sheet.pdf - Base R Cheat Sheet
https://rstudio.com/wp-content/uploads/2016/06/r-cheat-sheet.pdf - PYPL PopularitY of Programming Language
https://pypl.github.io/PYPL.html - Tiobe index
https://www.tiobe.com/tiobe-index/ - Stack Overflow: Most Loved, Dreaded & Wanted Programming Languages In 2020
https://fossbytes.com/stack-overflow-most-loved-dreaded-wanted-programming-languages-in-2020/ - How to Install and Use R on Ubuntu
https://itsfoss.com/install-r-ubuntu/ - R programming for beginners – Why you should use R
https://www.youtube.com/watch?v=9kYUGMg_14s - GOTO 2012 • The R Language The Good The Bad & The Ugly
https://www.youtube.com/watch?v=6S9r_YbqHy8 - Intro to Data Visualization with R & ggplot2
https://www.youtube.com/watch?v=49fADBfcDD4 - Plotting with ggplot2: Part 1
https://www.youtube.com/watch?v=HeqHMM4ziXA - Plotting with ggplot2: Part 2
https://www.youtube.com/watch?v=n8kYa9vu1l8 - R vs Python – What should I learn in 2020? | R and Python Comparison
https://www.youtube.com/watch?v=eRP_J2yLjSU - R Programming 101
https://www.youtube.com/c/rprogramming101 - Seriál Tvorba grafů pomocí programu „R“
https://www.root.cz/serialy/tvorba-grafu-pomoci-programu-r/ - Tvorba grafů pomocí programu „R“: úvod
https://www.root.cz/clanky/tvorba-grafu-pomoci-programu-r-1/ - Tvorba grafů pomocí programu „R“: pokročilé funkce
https://www.root.cz/clanky/tvorba-grafu-pomoci-programu-r-pokrocile-funkce/ - Tvorba grafů pomocí programu „R“: vkládání textu, čeština
https://www.root.cz/clanky/grafy-pomoci-programu-r-vkladani-textu-cestina/ - Cesta erka: Krok nultý – instalace & nastavení – prostředí, projekty, package
https://www.jla-data.net/r4su/r4su-environment-setup/ - Cesta erka: Krok první – operace a struktury – proměnné, rovnítka a dolary
https://www.jla-data.net/r4su/r4su-data-structures/ - Cesta erka: Krok druhý – načtení externích dat – csvčka, excely a databáze
https://www.jla-data.net/r4su/r4su-read-data/ - Cesta erka: Krok třetí – manipulace s daty – dplyr, slovesa a pajpy
https://www.jla-data.net/r4su/r4su-manipulate-data/ - Cesta erka: Krok čtvrtý – podání výsledků – ggplot, geomy a estetiky
https://www.jla-data.net/r4su/r4su-report-results/ - Cesta erka: Krok pátý – case study – případ piva v Praze
https://www.jla-data.net/r4su/r4su-case-study-beer/ - V indexu popularity programovacích jazyků TIOBE překvapilo R, Go, Perl, Scratch a Rust
https://www.root.cz/zpravicky/v-indexu-popularity-programovacich-jazyku-tiobe-prekvapilo-r-go-perl-scratch-a-rust/ - Is R Programming SURGING in Popularity in 2020?
https://www.youtube.com/watch?v=Duwn-vImyXE - Using the R programming language in Jupyter Notebook
https://docs.anaconda.com/anaconda/navigator/tutorials/r-lang/ - Using R on Jupyter Notebook
https://dzone.com/articles/using-r-on-jupyternbspnotebook - Graphics, ggplot2
http://r4stats.com/examples/graphics-ggplot2/ - A Practice Data Set
https://r4stats.wordpress.com/examples/mydata/ - Shiny – galerie projektů
https://shiny.rstudio.com/gallery/ - Seriál Programovací jazyk Julia
https://www.root.cz/serialy/programovaci-jazyk-julia/ - Julia (front page)
http://julialang.org/ - Julia – repositář na GitHubu
https://github.com/JuliaLang/julia - Julia (programming language)
https://en.wikipedia.org/wiki/Julia_%28programming_language%29 - IJulia
https://github.com/JuliaLang/IJulia.jl - Introducing Julia
https://en.wikibooks.org/wiki/Introducing_Julia - Julia: the REPL
https://en.wikibooks.org/wiki/Introducing_Julia/The_REPL - Introducing Julia/Metaprogramming
https://en.wikibooks.org/wiki/Introducing_Julia/Metaprogramming - Month of Julia
https://github.com/DataWookie/MonthOfJulia - Learn X in Y minutes (where X=Julia)
https://learnxinyminutes.com/docs/julia/ - New Julia language seeks to be the C for scientists
http://www.infoworld.com/article/2616709/application-development/new-julia-language-seeks-to-be-the-c-for-scientists.html - Julia: A Fast Dynamic Language for Technical Computing
http://karpinski.org/publications/2012/julia-a-fast-dynamic-language - The LLVM Compiler Infrastructure
http://llvm.org/ - Julia: benchmarks
http://julialang.org/benchmarks/ - R Vector
https://www.datamentor.io/r-programming/vector/ - .R File Extension
https://fileinfo.com/extension/r - Lineární regrese
https://cs.wikipedia.org/wiki/Line%C3%A1rn%C3%AD_regrese - lm (funkce)
https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/lm - quit (funkce)
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/quit - c (funkce)
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/c - help (funkce)
https://www.rdocumentation.org/packages/utils/versions/3.6.2/topics/help - Shiny: Introduction to interactive documents
https://shiny.rstudio.com/articles/interactive-docs.html - R Release History 1997–2013
http://timelyportfolio.github.io/rCharts_timeline_r/ - R: atomic vectors
https://renenyffenegger.ch/notes/development/languages/R/data-structures/vector/ - 11 Best R Programming IDE and editors
https://www.dunebook.com/best-r-programming-ide/ - CRAN – The Comprehensive R Archive Network
https://cran.r-project.org/ - R – Arrays
https://www.tutorialspoint.com/r/r_arrays.htm - Array vs Matrix in R Programming
https://www.geeksforgeeks.org/array-vs-matrix-in-r-programming/?ref=rp - Online R Language IDE
https://www.jdoodle.com/execute-r-online/ - Execute R Online (R v3.4.1)
https://www.tutorialspoint.com/execute_r_online.php - Snippets: Run any R code you like. There are over twelve thousand R packages preloaded
https://rdrr.io/snippets/ - R Package Documentation
https://rdrr.io/ - Data Reshaping in R – Popular Functions to Organise Data
https://techvidvan.com/tutorials/data-reshaping-in-r/ - What is an R Data Frame?
https://magoosh.com/data-science/what-is-an-r-data-frame/ - What's a data frame?
https://campus.datacamp.com/courses/free-introduction-to-r/chapter-5-data-frames?ex=1 - data.frame
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/data.frame - as.data.frame
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/as.data.frame - table
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/table - Python Pandas – DataFrame
https://www.tutorialspoint.com/python_pandas/python_pandas_dataframe.htm - The Pandas DataFrame: Make Working With Data Delightful
https://realpython.com/pandas-dataframe/ - Python | Pandas DataFrame
https://www.geeksforgeeks.org/python-pandas-dataframe/ - R – Factors
https://www.tutorialspoint.com/r/r_factors.htm - R – Scatterplots
https://www.tutorialspoint.com/r/r_scatterplots.htm - Quick guide to line types (lty) in R
https://www.benjaminbell.co.uk/2018/02/quick-guide-to-line-types-lty-in-r.html - Lattice C (Wikipedia)
https://en.wikipedia.org/wiki/Lattice_C - Lorenz Attractor in R
https://www.sixhat.net/lorenz-attractor-in-r.html - Small multiple
https://en.wikipedia.org/wiki/Small_multiple - Category:Infographics (infografika)
https://en.wikipedia.org/wiki/Category:Infographics - Trellis plots (pro Python)
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781784390150/4/ch04lvl1sec41/trellis-plots - Trellis (architecture)
https://en.wikipedia.org/wiki/Trellis_(architecture) - Izobara (meteorologie)
https://cs.wikipedia.org/wiki/Izobara_(meteorologie) - How to Create a Lattice Plot in R
https://www.dummies.com/programming/r/how-to-create-a-lattice-plot-in-r/ - Density estimation
https://en.wikipedia.org/wiki/Density_estimation - Sedm smrtelných statistických hříchů
http://dfens-cz.com/sedm-smrtelnych-statistickych-hrichu/ - Spurious correlations
https://tylervigen.com/spurious-correlations - R programming
https://www.slideshare.net/shantanupatil104/r-programming-44637606 - R language tutorial
https://www.slideshare.net/ChiuYW/r-language-tutorial - An Interactive Introduction To R (Programming Language For Statistics)
https://www.slideshare.net/dataspora/an-interactive-introduction-to-r-programming-language-for-statistics - Notebook interface
https://en.wikipedia.org/wiki/Notebook_interface - Jypyter: open source, interactive data science and scientific computing across over 40 programming languages
https://jupyter.org/ - nbviewer: a simple way to share Jupyter Notebooks
https://nbviewer.jupyter.org/ - Video streaming in the Jupyter Notebook
https://towardsdatascience.com/video-streaming-in-the-jupyter-notebook-635bc5809e85 - How IPython and Jupyter Notebook work
https://jupyter.readthedocs.io/en/latest/architecture/how_jupyter_ipython_work.html - Jupyter kernels
https://github.com/jupyter/jupyter/wiki/Jupyter-kernels - PNG is Not GIF
https://www.root.cz/clanky/png-is-not-gif/ - Anatomie grafického formátu PNG
https://www.root.cz/clanky/anatomie-grafickeho-formatu-png/ - PNG – bity, byty, chunky
https://www.root.cz/clanky/png-bity-byty-chunky/ - Řádkové filtry v PNG
https://www.root.cz/clanky/radkove-filtry-v-png/ - Nepovinné chunky v PNG a kontrola pomocí CRC
https://www.root.cz/clanky/nepovinne-chunky-v-png-a-kontrola-pomoci-crc/