Základy tvorby grafů v programovacím jazyku R: typy grafů v knihovně lattice

6. 10. 2020
Doba čtení: 29 minut

Sdílet

 Autor: R Core Team
Osmá část seriálu o jazyku R je věnována popisu některých typů grafů podporovaných v knihovně lattice, která rozšiřuje možnosti standardní knihovny. Lattice představuje zajímavou alternativu ke známější knihovně ggplot2.

Obsah

1. Základy tvorby grafů v programovacím jazyku R: knihovna lattice

2. Typy grafů podporovaných knihovnou lattice

3. Výrazy používané u různých typů grafů

4. Import knihovny lattice

5. Graf vykreslený funkcí xyplot

6. Zobrazení závislosti tlaku na teplotě i inverzního grafu

7. Rozdělení hodnot podle zvolené vlastnosti

8. Vylepšení popisků grafu

9. Regresní přímky a interpolace hodnotami

10. Mřížka v grafech, regresní přímky či interpolace při rozdělení hodnot do skupin

11. Samostatné grafy řízené třetí veličinou

12. Kombinace předchozích možností

13. Trojrozměrný korelační graf

14. Ukázky použití grafu typu cloud

15. Histogramy

16. Zobecnění histogramů – distribuce dat přes spojitý interval

17. Další příklady použití funkce densityplot

18. Obsah následující části seriálu

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Základy tvorby grafů v programovacím jazyku R: knihovna lattice

Při analýze dat nebo i při tvorbě infografiky se poměrně často setkáme s požadavkem na zobrazení průběhů funkcí, popř. naměřených nebo vypočtených bodů ve vícedimenzionálním prostoru. Tento požadavek je pochopitelně obtížné splnit v jediném grafu, i když se použije 3D zobrazení, několik barevných škál, popř. různé styly vykreslování. Jedno z možných a často používaných řešení spočívá v tom, že se namísto jediného grafu zobrazí větší množství dvojdimenzionálních grafů umístěných do pravidelné mřížky. Pokud se přitom zachovají měřítka na souřadných osách, lze z vykreslených grafů poměrně dobře odvodit vlastnosti měřeného nebo počítaného systému (popř. modelu), což je velká přednost, například i v porovnání s běžnými typy 3D grafů. K tvorbě podobných grafů, které se někdy nazývají trellis plots, protože do jisté míry připomínají pnoucí se květiny rostoucí v zahradních mřížích. Můžeme se ovšem setkat i s dalšími označeními, například trellis chart, alternativně i grid chart, panel chart, popř. lattice chart (ostatně z tohoto názvu je odvozeno jméno dnes popisované knihovny).

Obrázek 1: Příkladem jednoduchého lattice grafu je korelační diagram, s nímž jsme se seznámili v předchozím článku v souvislosti se standardní knihovnou jazyka R určenou pro tvorbu grafů a diagramů.

Tyto typy grafů je možné v programovacím jazyku R vytvářet hned několika způsoby. Základ tvoří balíček pojmenovaný grid, jenž zajišťuje nízkoúrovňový přístup, což znamená nutnost provádění poměrně velkého množství práce i při tvorbě relativně jednoduchého diagramu. Ostatně právě z tohoto důvodu se prozatím tímto balíčkem zabývat nebudeme, protože jeho znalost většinou není v praxi nutně vyžadována. Pro vysokoúrovňový přístup k tvorbě grafů a diagramů jsou naopak určeny knihovny postavené přímo či nepřímo nad gridem. V současnosti se jedná o knihovny nazvané ggplot2 a lattice. V dnešním článku se seznámíme s některými možnostmi nabízenými knihovnou lattice; knihovně ggplot2 budou věnovány navazující části tohoto seriálu (bude jich větší množství, a to z toho prostého důvodu, že ggplot2 je velmi flexibilní a umožňuje vykreslení a úpravu mnoha typů grafů).

Připomeňme si koncept nejpoužívanějších knihoven pro tvorbu grafů v jazyku R, který byl již uveden v předchozím článku:

  • Nízkoúrovňový přístup:
    • Funkce ze základní knihovny jazyka R
    • Balíček grid
  • Vysokoúrovňový přístup:
    • Balíček lattice
    • Balíček ggplot

Myšlenky, které jsou realizovány v knihovně Lattice, vznikly ve starší knihovně nazvané Trellis Graphics, která byla určena pro systém S a S-PLUS. Za vývojem této knihovny stál především R. A. Becker a W. S. Cleveland. Koncepty, které byly v knihovně Trellis Graphics implementovány, byly použity a ukázány i v Clevelandově knize Visualizing Data, která byla poprvé vydána již v roce 1993. Ovšem Lattice není pouhým přepisem Trellis Graphics; při přechodu ze systému S na R došlo k mnoha vylepšením a taktéž k úpravám API.

Obrázek 2: Přebal Clevelandovy knihy „Visualizing Data“.

Poznámka: s názvem „lattice“ jsme se mohli v IT setkat na několika místech, nejedná se tedy pouze o jméno knihovny pro jazyk R. Asi nejznámější využití tohoto slova nalezneme v překladači céčka Lattice C. Lattice C byl pravděpodobně prvním překladačem céčka dostupným od roku 1982 pro platformu IBM PC. Později byl převeden i na Amigu, Atari ST s TOSem, dále se rozšířil i na minipočítače a mainframy společnosti IBM (právě z Amigy a Atari ST mohou tento překladač znát i čtenáři tohoto článku). Zajímavé bylo, že firma Microsoft překladač Lattice C nabízela pod svým názvem MSC (Microsoft C) a teprve verze MSC 4.0 byla skutečně vytvořena přímo programátory z Microsoftu. Lattice C byl používán i při portaci aplikací z operačního systému CP/M na DOS (dnes je však možné pouze odhadnout, kolik kódu bylo skutečně napsáno v céčku a kolik kódu vzniklo transformací assembleru).
Lattice_C

Obrázek 3: Logo překladače Lattice C.

2. Typy grafů podporovaných knihovnou lattice

Zaměřme se nyní na popis možností balíčku či možná lépe řečeno knihovny lattice. V této knihovně je podporována tvorba relativně velkého množství standardních grafů, které je možné skládat do výše zmíněných mřížek. Především se jedná o grafy určené pro vykreslení jednodimenzionální veličiny (jedné proměnné):

# Jméno funkce pro vykreslení Stručný popis
1 barchart sloupcový graf
2 histogram klasický histogram
3 densityplot zobrazení distribuce dat přes spojitý interval (zobecnění histogramů)
4 bwplot takzvané krabicové grafy (hodnota + rozptyl atd.)
5 dotplot bodový graf
6 qqmath grafy kvantilu proti matematickým rozložením
7 stripplot korelační diagram, ovšem pouze jednodimenzionální

Obrázek 4: Příklad grafu vytvořeného funkcí barchart (sloupcový graf) poskytované knihovnou lattice.

K dispozici jsou i funkce pro vykreslení grafů o dvou proměnných, tedy x-y grafy:

# Jméno funkce pro vykreslení Stručný popis
1 xyplot bodový vícedimenzionální graf
2 qq porovnání dvou rozložení

Obrázek 5: Příklad grafu vytvořeného funkcí levelplot (zakódování výšky barvou) poskytované knihovnou lattice.

V případě, že je zapotřebí zobrazit funkce typu z=f(x,y), hodnoty matic atd., lze pro tento účel použít následující funkce:

# Jméno funkce pro vykreslení Stručný popis
1 cloud bodový graf v trojrozměrném prostoru
2 contourplot zobrazení kontur (vrstevnice, popř. izobary na mapě atd.)
3 wireframe zobrazení průběhu, popř. naměřených hodnot ve formě 3D povrchu (drátový model)
4 levelplot zakódování výšky formou barevné informace

Podporovány jsou i další funkce, například splom, parallel, rfs či tmd, jejichž význam si vysvětlíme později.

Obrázek 6: Příklad grafu vytvořeného funkcí wireframe (drátový model, vyplněné plošky) poskytované knihovnou lattice.

3. Výrazy používané u různých typů grafů

Funkcím určeným pro vykreslení grafů je pochopitelně nutné předat data pro vykreslení v očekávaném formátu. Způsob specifikace těchto dat může být zpočátku matoucí. Z tohoto důvodu je v následující tabulce ukázán typický způsob zápisu dat. Podrobnosti budou pochopitelně ukázány v konkrétních demonstračních příkladech:

# Typ grafu Výraz (příklad)
1 barchart x~A nebo A~x
2 bwplot x~A nebo A~x
3 cloud z~x*y|A (vytvoření většího množství grafů podle A)
4 contourplot z~x*y
5 densityplot ~x|A*B
6 dotplot ~x|A
7 histogram ~x
8 levelplot z~y*x
9 parallel datový rámec
10 splom datový rámec
11 stripplot A~x nebo x~A
12 xyplot y~x|A
13 wireframe z~y*x

Obrázek 7: Příklad grafu vytvořeného funkcí contourplot (kontury, vrstevnice, izobary) poskytované knihovnou lattice.

Mnoho z výše uvedených výrazů bude použito v dnešních demonstračních příkladech.

Poznámka: všechny dále uvedené demonstrační příklady, které využívají knihovnu lattice, jsou spustitelné v online prostředích připravených pro běh skriptů napsaných v programovacím jazyku R. Použít lze například odzkoušený Coding Ground.

4. Import knihovny lattice

Knihovnu lattice je nutné před použitím jejich funkcí naimportovat. K tomu lze použít příkaz library:

library(package = "lattice")

Alternativně je možné přímo specifikovat jméno knihovny bez explicitního pojmenování parametru:

library(lattice)

Následně se můžeme přesvědčit, že k importu knihovny skutečně došlo, a to například tak, že si necháme zobrazit nápovědu dodávanou společně s knihovnou lattice:

help(lattice)

S výsledkem (pochopitelně zkráceným):

A_01_Lattice              package:lattice              R Documentation
 
Lattice Graphics
 
Description:
 
     The ‘lattice’ add-on package is an implementation of Trellis
     graphics for R.  It is a powerful and elegant high-level data
     visualization system with an emphasis on multivariate data.  It is
     designed to meet most typical graphics needs with minimal tuning,
     but can also be easily extended to handle most nonstandard
     requirements.
 
Details:
 
     Trellis Graphics, originally developed for S and S-PLUS at the
     Bell Labs, is a framework for data visualization developed by R.
     A. Becker, W. S. Cleveland, et al, extending ideas presented in
     Cleveland's 1993 book _Visualizing Data_.  The Lattice API is
     based on the original design in S, but extends it in many ways.
 
     The Lattice user interface primarily consists of several
     ‘high-level’ generic functions (listed below in the “See Also”
     section), each designed to create a particular type of display by
     default.  Although the functions produce different output, they
     share many common features, reflected in several common arguments
     that affect the resulting displays in similar ways.  These
     arguments are extensively (sometimes only) documented in the help
     page for ‘xyplot’, which also includes a discussion of the
     important topics of _conditioning_ and control of the Trellis
     layout.  Features specific to other high-level functions are
     documented in their respective help pages.
     ...
     ...
     ...

5. Graf vykreslený funkcí xyplot

Nejprve si ukažme základní způsob použití jednoho z nejjednodušších typů grafů podporovaných knihovnou lattice. Jedná se o bodový graf vykreslený funkcí nazvanou xyplot. Tato funkce se v některých ohledech podobá klasické funkci plot, což je ostatně patrné i při pohledu na dnešní první demonstrační příklad, jenž vypadá následovně:

library(lattice)
 
input <- mtcars[,c('wt','mpg')]
 
xyplot(input$wt~input$mpg)
Poznámka: povšimněte si způsobu zápisu výrazu definujícího x-ové a y-ové souřadnice bodů (resp. přesněji řečeno závislost y na x), které se mají v grafu zobrazit. V našem případě se jedná o souřadnice získané přímo z datového rámce a mají formu vektorů.

Po spuštění tohoto demonstračního příkladu by se měl zobrazit graf, který ukazuje základní vztah mezi spotřebou a hmotností automobilů z databáze (resp. přesněji řečeno datového rámce), který je součástí základní knihovny programovacího jazyka R:

Obrázek 8: Základní graf vykreslený funkcí xyplot.

Existuje i jednodušší způsob zápisu, v němž se v pojmenovaném parametru data deklaruje vstupní datový rámec. V tomto případě se ve výrazu y~x nemusí uvádět plné jméno vektoru vzniklé spojením jména rámce a vektoru s využitím $. Současně se změní i popisky os:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input)

Obrázek 9: Základní graf vykreslený funkcí xyplot, změna popisků os.

Ve skutečnosti nemusí být druhý parametr pojmenovaný, takže zápis lze ještě více zkrátit tak, jak je to ukázáno v další variantě:

library(lattice)
 
input <- mtcars[,c('wt','mpg')]
 
xyplot(wt~mpg, input)

Obrázek 10: Základní graf vykreslený funkcí xyplot, změna popisků os.

6. Zobrazení závislosti tlaku na teplotě i inverzního grafu

Uveďme si ještě dva doplňkové demonstrační příklady, které jsou tentokrát založeny na vizualizaci dat uložených do datového rámce pojmenovaného pressure, jenž je opět součástí standardní instalace programovacího jazyka R a jeho knihoven:

print(pressure)
 
   temperature pressure
1            0   0.0002
2           20   0.0012
3           40   0.0060
4           60   0.0300
5           80   0.0900
6          100   0.2700
7          120   0.7500
8          140   1.8500
9          160   4.2000
10         180   8.8000
11         200  17.3000
12         220  32.1000
13         240  57.0000
14         260  96.0000
15         280 157.0000
16         300 247.0000
17         320 376.0000
18         340 558.0000
19         360 806.0000

Zobrazení závislosti tlaku na teplotě, tj. závislé veličiny na veličině nezávislé, se provede snadno:

library(lattice)
 
xyplot(pressure ~ temperature, pressure)

S tímto výsledkem:

Obrázek 11: Závislost tlaku na teplotě.

Nikdo nám ovšem nebrání otočit obě osy a vykreslit tak závislost teploty na tlaku:

library(lattice)
 
xyplot(temperature ~ pressure, pressure)

Nyní bude (podle očekávání) graf odlišný:

Obrázek 12: Závislost teploty na tlaku (tedy prohození os).

7. Rozdělení hodnot podle zvolené vlastnosti

V případě, že je nutné zobrazované hodnoty rozdělit podle další (třetí) vlastnosti, použije se specifikátor group tak, jak je to naznačené v dalším demonstračním příkladu:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       group=gear)

Pokud tento specifikátor použijeme, nezobrazí se pouze jediná množina bodů, ale body jsou rozděleny podle toho, do jaké kategorie představované třetí veličinou spadají. Je tedy vhodné, aby byl tento třetí sloupec v datovém rámci reprezentován buď formou faktoru nebo obsahoval pouze omezené množství hodnot. To je ostatně i náš případ, kdy automobily rozdělujeme podle počtu rychlostí (rychlostních stupňů):

Obrázek 13: Rozdělení hodnot podle zvolené vlastnosti.

Zobrazit můžeme i legendu k jednotlivým barvám použitým v grafu. Pro tento účel se použije přepínač auto.key (pokud už daný popis není součástí datového rámce):

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       group=gear,
       auto.key=TRUE)

Obrázek 14: Automatické vygenerování klíčů vlastnosti, podle které se vytváří skupiny.

8. Vylepšení popisků grafu

Do grafu lze pochopitelně přidat i popisky jednotlivých os, což je ostatně téma, které již známe z předchozích článků, takže jen v krátkosti:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       group=gear,
       auto.key=TRUE,
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Výsledek bude vypadat takto:

Obrázek 15: Upravené popisky os.

Tutéž specifikaci je možné provést i u lattice grafů jiných typů (popsaných dále). Například:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
densityplot(~ mpg | gear,
            data = input,
            plot.points = FALSE,
            xlab = "Miles/(US) gallons",
            ylab = "Weight (1000lbs)")

9. Regresní přímky a interpolace hodnotami

Do grafu typu xyplot je možné přidat regresní přímku, a to konkrétně s využitím pojmenovaného parametru type. Hodnotou tohoto parametru je vektor, v němž se specifikuje, jaké údaje se mají v grafu zobrazit. V dalším demonstračním příkladu specifikujeme, že se mají vykreslit jednotlivé body (vstupní data, „p“) a taktéž regresní přímka („r“). Vektor se specifikací typu vykreslení je zvýrazněn:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       type = c("p", "r"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Obrázek 16: Přidání regresní přímky do grafu.

Podobným způsobem můžeme do grafu přidat i křivku, která se snaží interpolovat naměřené (resp. přesněji řečeno zobrazené) hodnoty. V tomto případě je ve vektoru předaného v parametru type uveden řetězec „smooth“:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       type = c("p", "smooth"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Nyní bude výsledek vypadat následovně:

Obrázek 17: Interpolace naměřenými body.

10. Mřížka v grafech, regresní přímky či interpolace při rozdělení hodnot do skupin

Do grafů je – podle očekávání – možné přidat i mřížku usnadňující orientaci v zobrazených hodnotách, a to konkrétně specifikací typu „g“ v parametru type. Podívejme se na následující demonstrační příklad, v němž je mřížka povolena a zobrazena:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       type = c("p", "g", "smooth"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Výsledek by v tomto případě měl vypadat následovně:

Obrázek 18: Přidání mřížky do grafu.

V případě, že se při vykreslení grafu použije parametr group= pro rozdělení výsledků na základě další veličiny, je stále možné do takového grafu přidat regresní přímku (type = c(…, „r“):

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       group=gear,
       auto.key=TRUE,
       type = c("p", "r"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Ve skutečnosti se nyní namísto jediné regresní přímky zobrazí tolik přímek, kolik existuje rozdílných hodnot další veličiny, podle které je graf rozdělen:

Obrázek 19: Seskupení + regresní přímky.

Další graf bude obsahovat trojici interpolací naměřenými hodnotami, pokaždé pro ty automobily, které mají shodný počet rychlostních stupňů. Jedná se tedy opět o kombinaci možností popsaných v předchozím textu:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg,
       data = input,
       group = gear,
       auto.key = TRUE,
       type = c("p", "smooth"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Výsledný graf může vypadat následovně:

Obrázek 20: Seskupení + interpolace hodnotami.

Poznámka: povšimněte si, že začátky a konce interpolačních křivek jsou ve výchozím nastavení určeny zobrazovanými hodnotami (resp. danou konkrétní skupinou); obecně tedy neprochází celým „definičním oborem“.

11. Samostatné grafy řízené třetí veličinou

Nyní se konečně dostáváme k lattice diagramům a grafům, tedy ke skupině grafů rozdělených na základě nějaké podmínky. V dalším demonstračním příkladu je ukázáno, jak lze původně jediný diagram typu xyplot rozdělit na několik diagramů, a to na základě toho, kolik rychlostních stupňů má daný automobil – každá hodnota (informace o každém automobilu) je tedy použita vždy pouze v jediném grafu:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg | gear,
       data = input,
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

Povšimněte si způsobu zápisu, který lze přečíst následovně: „vykresli závislost váhy na spotřebě rozděleno (za podmínky) stejného počtu rychlostních stupňů“

Obrázek 21: Samostatné grafy pro hodnoty vybrané podle počtu rychlostí, stejná měřítka na osách.

Ve výchozím nastavení mají všechny grafy umístěné v mřížce shodné meze hodnot na osách. Toto chování (které je velmi užitečné, protože umožňuje grafy porovnat) můžeme vypnout volbou scales = „free“:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg | gear,
       data = input,
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)",
       scales = "free")

Nyní bude výsledek vypadat poněkud odlišně:

Obrázek 22: Samostatné grafy pro hodnoty vybrané podle počtu rychlostí, rozdílná měřítka na osách.

12. Kombinace předchozích možností

V předchozích kapitolách popsané možnosti grafů typu xyplot je možné zkombinovat, například přidat do rozdělených grafů regresní přímky:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg | gear,
       data = input,
       type = c("p", "r"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)")

S výsledkem:

Obrázek 23: Samostatné grafy pro hodnoty vybrané podle počtu rychlostí, přidání regresních přímek.

Popř. s interpolací průběhů:

library(lattice)
 
input <- mtcars[,c('wt','mpg','gear')]
 
xyplot(wt~mpg | gear,
       data = input,
       type = c("p", "smooth"),
       xlab = "Miles/(US) gallons",
       ylab = "Weight (1000lbs)",
       scales = "free")

S nepatrně odlišným výsledkem:

Obrázek 24: Samostatné grafy pro hodnoty vybrané podle počtu rychlostí, přidání interpolace průběhy.

13. Trojrozměrný korelační graf

Dalším typem grafu podporovaným knihovnou lattice je trojrozměrný korelační graf. Jedná se o rozšíření grafu vykreslovaného funkcí xyplot do třech rozměrů – pro vykreslování se tedy budou používat tři stejně dlouhé vektory představující pozice bodů v trojrozměrném prostoru (x-ové souřadnice jsou v prvním vektoru atd.). Trojrozměrný korelační graf se vykresluje funkcí nazvanou cloud:

help(cloud)
 
B_07_cloud               package:lattice               R Documentation
 
3d Scatter Plot and Wireframe Surface Plot
 
Description:
 
     Generic functions to draw 3d scatter plots and surfaces.  The
     ‘"formula"’ methods do most of the actual work.
 
Usage:
 
     cloud(x, data, ...)
     wireframe(x, data, ...)
      
     ## S3 method for class 'formula'
     cloud(x,
           data,
           allow.multiple = is.null(groups) || outer,
           outer = FALSE,
           auto.key = FALSE,
           aspect = c(1,1),
           panel.aspect = 1,
           panel = lattice.getOption("panel.cloud"),
           prepanel = NULL,
           scales = list(),
           strip = TRUE,
           groups = NULL,
           xlab,
           ylab,
           zlab,
           xlim = if (is.factor(x)) levels(x) else range(x, finite = TRUE),
           ylim = if (is.factor(y)) levels(y) else range(y, finite = TRUE),
           zlim = if (is.factor(z)) levels(z) else range(z, finite = TRUE),
           at,
           drape = FALSE,
           pretty = FALSE,
           drop.unused.levels,
           ...,
           lattice.options = NULL,
           default.scales =
           list(distance = c(1, 1, 1),
                arrows = TRUE,
                axs = axs.default),
           default.prepanel = lattice.getOption("prepanel.default.cloud"),
           colorkey,
           col.regions,
           alpha.regions,
           cuts = 70,
           subset = TRUE,
           axs.default = "r")

Způsob specifikace dat, které se mají vykreslit, je opět odlišný:

cloud(wt~mpg*hp,
       data = input)

14. Ukázky použití grafu typu cloud

Trojrozměrné korelační diagramy nemusí být tím nejlepším řešením ve chvíli, kdy se zobrazují nespojitá data, což je i náš případ datového rámce s informacemi o automobilech. Ostatně to můžete posoudit sami po spuštění následujícího demonstračního příkladu:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp')]
 
cloud(wt~mpg*hp,
       data = input)

Obrázek 25: Trojrozměrný korelační diagram.

Podporováno je i rozdělení bodů do skupin:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
cloud(wt~mpg*hp,
       data = input,
       group = gear,
       auto.key=TRUE)

S výsledkem:

Obrázek 26: Rozdělení bodů do skupin.

Názornější je použití odlišného standardního datového rámce nazvaného „iris“:

library(lattice)
 
data("iris")
head(iris)
 
input <- iris[,c('Sepal.Length','Sepal.Width','Petal.Length','Petal.Width')]
 
cloud(Sepal.Length~Sepal.Width*Petal.Length,
       data = input)

Obrázek 27: Použití odlišného zdroje dat, v nichž lze rozeznat několik „clusterů“.

15. Histogramy

Tato kapitola bude velmi stručná, protože si v ní popíšeme známý typ diagramu – histogram. Tento velmi užitečný (kupodivu však mnohdy přehlížený) graf se vykresluje funkcí nazvanou jednoduše histogram:

help(histogram)
 
B_03_histogram             package:lattice             R Documentation
 
Histograms and Kernel Density Plots
 
Description:
 
     Draw Histograms and Kernel Density Plots, possibly conditioned on
     other variables.
 
Usage:
 
     histogram(x, data, ...)
     densityplot(x, data, ...)
     ## S3 method for class 'formula'
     histogram(x,
               data,
               allow.multiple, outer = TRUE,
               auto.key = FALSE,
               aspect = "fill",
               panel = lattice.getOption("panel.histogram"),
               prepanel, scales, strip, groups,
               xlab, xlim, ylab, ylim,
               type = c("percent", "count", "density"),
               nint = if (is.factor(x)) nlevels(x)
               else round(log2(length(x)) + 1),
               endpoints = extend.limits(range(as.numeric(x),
                               finite = TRUE), prop = 0.04),
               breaks,
               equal.widths = TRUE,
               drop.unused.levels =
                   lattice.getOption("drop.unused.levels"),
               ...,
               lattice.options = NULL,
               default.scales = list(),
               default.prepanel =
                   lattice.getOption("prepanel.default.histogram"),
               subscripts,
               subset)

Podívejme se nyní na příklad použití histogramu. Použijeme jediný vektor s hodnotami, například výkon motoru:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
histogram(~ hp,
            data = input,
            plot.points = FALSE)

S výsledkem:

Obrázek 28: Histogram s počtem převodových stupňů vozidel.

Specifikovat je možné i počet intervalů, a to pojmenovaným parametrem breaks:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
histogram(~ hp,
            data = input,
            breaks = 16,
            plot.points = FALSE)

Obrázek 29: Zvětšení počtu intervalů v histogramu.

I histogram lze rozdělit ve stylu lattice diagramů:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
histogram(~ hp |gear,
            data = input,
            breaks = 16,
            plot.points = FALSE)

Obrázek 30: Rozdělení histogramu podle hodnot gear.

16. Zobecnění histogramů – distribuce dat přes spojitý interval

S využitím vhodného jádra (kernel) je možné původně diskrétní histogram převést na graf se spojitým průběhem. V knihovně lattice tuto funkcionalitu zajišťuje funkce densityplot. Její nejjednodušší použití vypadá následovně:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
densityplot(~ wt,
            data = input)

Ve výsledném grafu budou zobrazeny jak jednotlivé hodnoty wt v daném intervalu, tak i graf spočtený s využitím kernelu:

Obrázek 31: Výsledek volání funkce densityplot.

Body, které mohou být spíše matoucí, je možné odstranit volbou plot.points = FALSE:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
densityplot(~ wt,
            data = input,
            plot.points = FALSE)

Obrázek 32: Odstranění bodů z grafu.

17. Další příklady použití funkce densityplot

Podívejme se na další příklad použití funkce densityplot, v níž namísto histogramu se třemi sloupci zobrazíme spojitý průběh (který je ovšem zrovna v tomto případě dost matoucí pro případné čtenáře, protože mj. naznačuje, že se jedná o spojitou veličinu, což není pravda):

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
densityplot(~ gear,
            data = input,
            plot.points = FALSE)

Výsledek:

Obrázek 33: Další graf vytvořený funkcí densityplot.

Hodnoty je možně rozdělit do skupin podle zvolené veličiny (zde opět počet rychlostních stupňů):

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
densityplot(~ mpg,
            data = input,
            groups = gear,
            auto.key = TRUE,
            plot.points = FALSE)

Obrázek 34: Rozdělení hodnot do skupin podle zvolené veličiny.

Užitečnější může být rozdělení na lattice grafy na základě zvolené veličiny:

library(lattice)
 
input <- mtcars[,c('wt','mpg','hp','gear')]
 
densityplot(~ mpg | gear,
            data = input,
            plot.points = FALSE)

Obrázek 35: Další příklad využití lattice grafů.

18. Obsah následující části seriálu

V následující části seriálu o programovacím jazyku R dokončíme popis knihovny lattice. Ukážeme si například následující (již složitější) příklady:

bitcoin_skoleni

library(lattice)
 
x <- seq(-1.1*pi, 1.1 * pi, length.out = 30)
y <- seq(-1.1*pi, 1.1 * pi, length.out = 30)
r <- as.vector(sqrt(outer(x^2, y^2, "+")))
grid <- expand.grid(x=x, y=y)
grid$z <- cos(r)
 
wireframe(z ~ x * y, grid, col.regions = topo.colors(20),
          at = c(-Inf, seq(-0.8, 0.8, by = 0.2), Inf))

popř.:

library(lattice)
 
x <- seq(-1.1*pi, 1.1 * pi, length.out = 30)
y <- seq(-1.1*pi, 1.1 * pi, length.out = 30)
r <- as.vector(sqrt(outer(x^2, y^2, "+")))
grid <- expand.grid(x=x, y=y)
grid$z <- cos(r) + sin(x-0.5)
 
contourplot(z ~ x * y, grid, col.regions = topo.colors(20),
          at = c(-Inf, seq(-0.8, 0.8, by = 0.2), Inf))

19. 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/r-examples 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:

# Příklad Stručný popis Cesta
1 01_import_lattice_library1.R import knihovny lattice do R https://github.com/tisnik/r-examples/blob/master/08-lattice/01_import_lattice_library1.R
2 02_import_lattice_library2.R import knihovny lattice do R (alternativní způsob) https://github.com/tisnik/r-examples/blob/master/08-lattice/02_import_lattice_library2.R
3 03_xyplot_basic.R jednoduchý graf vykreslený funkcí xyplot https://github.com/tisnik/r-examples/blob/master/08-lattice/03_xyplot_basic.R
4 04_xyplot_data_parameter.R specifikace zdroje dat pro graf https://github.com/tisnik/r-examples/blob/master/08-lattice/04_xyplot_data_parameter.R
5 05_xyplot_implicit_input.R implicitní (poziční) parametr se specifikací zdroje dat https://github.com/tisnik/r-examples/blob/master/08-lattice/05_xyplot_implicit_input.R
6 06_xyplot_temperature_pressure.R zobrazení závislosti tlaku na teplotě https://github.com/tisnik/r-examples/blob/master/08-lattice/06_xyplot_tempera­ture_pressure.R
7 07_xyplot_pressure_temperature.R zobrazení závislosti teploty na tlaku https://github.com/tisnik/r-examples/blob/master/08-lattice/07_xyplot_pressure_tem­perature.R
8 08_xyplot_groups.R skupiny hodnot v grafu xyplot https://github.com/tisnik/r-examples/blob/master/08-lattice/08_xyplot_groups.R
9 09_xyplot_groups_auto_key.R skupiny hodnot v grafu xyplot + jejich popisek https://github.com/tisnik/r-examples/blob/master/08-lattice/09_xyplot_groups_auto_key.R
10 10_xyplot_xlab_ylab.R specifikace popisků souřadných os grafu https://github.com/tisnik/r-examples/blob/master/08-lattice/10_xyplot_xlab_ylab.R
11 11_xyplot_type_p_r.R regresní přímka v grafu xyplot https://github.com/tisnik/r-examples/blob/master/08-lattice/11_xyplot_type_p_r.R
12 12_xyplot_type_p_smooth.R interpolace hodnot v grafu xyplot https://github.com/tisnik/r-examples/blob/master/08-lattice/12_xyplot_type_p_smooth.R
13 13_xyplot_grid.R přidání mřížky do grafu xyplot https://github.com/tisnik/r-examples/blob/master/08-lattice/13_xyplot_grid.R
14 14_xyplot_groups.R větší množství grafů rozdělených podle třetí veličiny https://github.com/tisnik/r-examples/blob/master/08-lattice/14_xyplot_groups.R
15 15_xyplot_groups_regression.R větší množství grafů s regresními přímkami rozdělených podle třetí veličiny https://github.com/tisnik/r-examples/blob/master/08-lattice/15_xyplot_groups_regression.R
16 16_xyplot_grid.R větší množství grafů, přidání mřížky https://github.com/tisnik/r-examples/blob/master/08-lattice/16_xyplot_grid.R
17 17_xyplot_groups_smooth.R větší množství grafů s interpolací rozdělených podle třetí veličiny https://github.com/tisnik/r-examples/blob/master/08-lattice/17_xyplot_groups_smooth.R
18 18_xyplot_grid_free_scales.R různá měřítka na osách rozdělených grafů https://github.com/tisnik/r-examples/blob/master/08-lattice/18_xyplot_grid_free_scales.R
19 19_xyplot_grid_regression.R regresní přímka + mřížka https://github.com/tisnik/r-examples/blob/master/08-lattice/19_xyplot_grid_regression.R
20 20_xyplot_grid_smooth.R interpolace hodnot + mřížka https://github.com/tisnik/r-examples/blob/master/08-lattice/20_xyplot_grid_smooth.R
21 21_cloud_basic.R základní diagram typu cloud https://github.com/tisnik/r-examples/blob/master/08-lattice/21_cloud_basic.R
22 22_cloud_input_specification.R specifikace zdroje dat v diagramu typu cloud https://github.com/tisnik/r-examples/blob/master/08-lattice/22_cloud_input_specification.R
23 23_histogram.R základní histogram https://github.com/tisnik/r-examples/blob/master/08-lattice/23_histogram.R
24 24_histogram_breaks_specification.R úprava zobrazení histogramu https://github.com/tisnik/r-examples/blob/master/08-lattice/24_histogram_break­s_specification.R
25 25_histogram_condition.R histogram rozdělený do více grafů podle další veličiny https://github.com/tisnik/r-examples/blob/master/08-lattice/25_histogram_condition.R
26 26_densityplot_basic.R jednoduchý graf typu densityplot https://github.com/tisnik/r-examples/blob/master/08-lattice/26_densityplot_basic.R
27 27_densityplot_no_points.R jednoduchý graf typu densityplot bez naměřených/spočtených bodů https://github.com/tisnik/r-examples/blob/master/08-lattice/27_densityplot_no_points.R
28 28_densityplot_gear.R další varianta grafu typu densityplot https://github.com/tisnik/r-examples/blob/master/08-lattice/28_densityplot_gear.R
29 29_densityplot_groups.R více skupin v grafu typu densityplot https://github.com/tisnik/r-examples/blob/master/08-lattice/29_densityplot_groups.R
30 30_densityplot_condition.R rozdělení do více grafů podle další veličiny https://github.com/tisnik/r-examples/blob/master/08-lattice/30_densityplot_condition.R

20. Odkazy na Internetu

  1. The R Project for Statistical Computing
    https://www.r-project.org/
  2. An Introduction to R
    https://cran.r-project.org/doc/manuals/r-release/R-intro.pdf
  3. R (programming language)
    https://en.wikipedia.org/wi­ki/R_(programming_language)
  4. The R Programming Language
    https://www.tiobe.com/tiobe-index/r/
  5. R Graphics Second Edition
    https://www.stat.auckland­.ac.nz/~paul/RG2e/
  6. Grid
    https://www.stat.auckland­.ac.nz/~paul/grid/grid.html
  7. Interactive Course: Data Visualization with lattice in R
    https://www.datacamp.com/courses/data-visualization-in-r-with-lattice
  8. Lattice: trellis graphics for R
    https://lattice.r-forge.r-project.org/
  9. Lattice: Multivariate Data Visualization with R
    http://lmdvr.r-forge.r-project.org/figures/figures.html
  10. Getting Started with Lattice Graphics
    https://lattice.r-forge.r-project.org/Vignettes/src/lattice-intro/lattice-intro.pdf
  11. Using lattice’s xyplot()
    https://homerhanumat.github­.io/tigerstats/xyplot.html
  12. ggplot2 Tutorial
    https://www.tutorialspoin­t.com/ggplot2/index.htm
  13. Lattice Package in R with Functions and Graphs
    https://techvidvan.com/tu­torials/lattice-package-in-r/
  14. The R Graph Gallery
    https://www.r-graph-gallery.com/index.html
  15. Lattice Graphs
    https://www.statmethods.net/ad­vgraphs/trellis.html
  16. ggplot2 (Graph gallery)
    https://www.r-graph-gallery.com/ggplot2-package.html
  17. R Markdown
    https://rmarkdown.rstudio.com/
  18. R Markdown: The Definitive Guide
    https://bookdown.org/yihui/rmarkdown/
  19. R Markdown Cheat Sheet
    https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf
  20. Introduction to R Markdown
    https://rmarkdown.rstudio­.com/articles_intro.html
  21. R Cheat Sheets
    https://blog.sergiouri.be/2016/07/r-cheat-sheets.html
  22. R Cheat Sheet
    https://s3.amazonaws.com/quandl-static-content/Documents/Quandl±+R+Che­at+Sheet.pdf
  23. Base R Cheat Sheet
    https://rstudio.com/wp-content/uploads/2016/06/r-cheat-sheet.pdf
  24. PYPL PopularitY of Programming Language
    https://pypl.github.io/PYPL.html
  25. Tiobe index
    https://www.tiobe.com/tiobe-index/
  26. Stack Overflow: Most Loved, Dreaded & Wanted Programming Languages In 2020
    https://fossbytes.com/stack-overflow-most-loved-dreaded-wanted-programming-languages-in-2020/
  27. How to Install and Use R on Ubuntu
    https://itsfoss.com/install-r-ubuntu/
  28. R programming for beginners – Why you should use R
    https://www.youtube.com/wat­ch?v=9kYUGMg_14s
  29. GOTO 2012 • The R Language The Good The Bad & The Ugly
    https://www.youtube.com/wat­ch?v=6S9r_YbqHy8
  30. R vs Python – What should I learn in 2020? | R and Python Comparison
    https://www.youtube.com/wat­ch?v=eRP_J2yLjSU
  31. R Programming 101
    https://www.youtube.com/c/rpro­gramming101
  32. Seriál Tvorba grafů pomocí programu „R“
    https://www.root.cz/serialy/tvorba-grafu-pomoci-programu-r/
  33. Tvorba grafů pomocí programu „R“: úvod
    https://www.root.cz/clanky/tvorba-grafu-pomoci-programu-r-1/
  34. Tvorba grafů pomocí programu „R“: pokročilé funkce
    https://www.root.cz/clanky/tvorba-grafu-pomoci-programu-r-pokrocile-funkce/
  35. Tvorba grafů pomocí programu „R“: vkládání textu, čeština
    https://www.root.cz/clanky/grafy-pomoci-programu-r-vkladani-textu-cestina/
  36. Cesta erka: Krok nultý – instalace & nastavení – prostředí, projekty, package
    https://www.jla-data.net/r4su/r4su-environment-setup/
  37. Cesta erka: Krok první – operace a struktury – proměnné, rovnítka a dolary
    https://www.jla-data.net/r4su/r4su-data-structures/
  38. Cesta erka: Krok druhý – načtení externích dat – csvčka, excely a databáze
    https://www.jla-data.net/r4su/r4su-read-data/
  39. Cesta erka: Krok třetí – manipulace s daty – dplyr, slovesa a pajpy
    https://www.jla-data.net/r4su/r4su-manipulate-data/
  40. Cesta erka: Krok čtvrtý – podání výsledků – ggplot, geomy a estetiky
    https://www.jla-data.net/r4su/r4su-report-results/
  41. Cesta erka: Krok pátý – case study – případ piva v Praze
    https://www.jla-data.net/r4su/r4su-case-study-beer/
  42. 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/
  43. Is R Programming SURGING in Popularity in 2020?
    https://www.youtube.com/watch?v=Duwn-vImyXE
  44. Using the R programming language in Jupyter Notebook
    https://docs.anaconda.com/a­naconda/navigator/tutorial­s/r-lang/
  45. Using R on Jupyter Notebook
    https://dzone.com/articles/using-r-on-jupyternbspnotebook
  46. Graphics, ggplot2
    http://r4stats.com/examples/graphics-ggplot2/
  47. A Practice Data Set
    https://r4stats.wordpress­.com/examples/mydata/
  48. Shiny – galerie projektů
    https://shiny.rstudio.com/gallery/
  49. Seriál Programovací jazyk Julia
    https://www.root.cz/seria­ly/programovaci-jazyk-julia/
  50. Julia (front page)
    http://julialang.org/
  51. Julia – repositář na GitHubu
    https://github.com/JuliaLang/julia
  52. Julia (programming language)
    https://en.wikipedia.org/wi­ki/Julia_%28programming_lan­guage%29
  53. IJulia
    https://github.com/JuliaLan­g/IJulia.jl
  54. Introducing Julia
    https://en.wikibooks.org/wi­ki/Introducing_Julia
  55. Julia: the REPL
    https://en.wikibooks.org/wi­ki/Introducing_Julia/The_REPL
  56. Introducing Julia/Metaprogramming
    https://en.wikibooks.org/wi­ki/Introducing_Julia/Meta­programming
  57. Month of Julia
    https://github.com/DataWo­okie/MonthOfJulia
  58. Learn X in Y minutes (where X=Julia)
    https://learnxinyminutes.com/doc­s/julia/
  59. New Julia language seeks to be the C for scientists
    http://www.infoworld.com/ar­ticle/2616709/application-development/new-julia-language-seeks-to-be-the-c-for-scientists.html
  60. Julia: A Fast Dynamic Language for Technical Computing
    http://karpinski.org/publi­cations/2012/julia-a-fast-dynamic-language
  61. The LLVM Compiler Infrastructure
    http://llvm.org/
  62. Julia: benchmarks
    http://julialang.org/benchmarks/
  63. R Vector
    https://www.datamentor.io/r-programming/vector/
  64. .R File Extension
    https://fileinfo.com/extension/r
  65. Lineární regrese
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_regre­se
  66. lm (funkce)
    https://www.rdocumentation­.org/packages/stats/versi­ons/3.6.2/topics/lm
  67. quit (funkce)
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/quit
  68. c (funkce)
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/c
  69. help (funkce)
    https://www.rdocumentation­.org/packages/utils/versi­ons/3.6.2/topics/help
  70. Shiny: Introduction to interactive documents
    https://shiny.rstudio.com/ar­ticles/interactive-docs.html
  71. R Release History 1997–2013
    http://timelyportfolio.git­hub.io/rCharts_timeline_r/
  72. R: atomic vectors
    https://renenyffenegger.ch/no­tes/development/languages/R/da­ta-structures/vector/
  73. 11 Best R Programming IDE and editors
    https://www.dunebook.com/best-r-programming-ide/
  74. CRAN – The Comprehensive R Archive Network
    https://cran.r-project.org/
  75. R – Arrays
    https://www.tutorialspoin­t.com/r/r_arrays.htm
  76. Array vs Matrix in R Programming
    https://www.geeksforgeeks.org/array-vs-matrix-in-r-programming/?ref=rp
  77. Online R Language IDE
    https://www.jdoodle.com/execute-r-online/
  78. Execute R Online (R v3.4.1)
    https://www.tutorialspoin­t.com/execute_r_online.php
  79. Snippets: Run any R code you like. There are over twelve thousand R packages preloaded
    https://rdrr.io/snippets/
  80. R Package Documentation
    https://rdrr.io/
  81. Data Reshaping in R – Popular Functions to Organise Data
    https://techvidvan.com/tutorials/data-reshaping-in-r/
  82. What is an R Data Frame?
    https://magoosh.com/data-science/what-is-an-r-data-frame/
  83. What's a data frame?
    https://campus.datacamp.com/cou­rses/free-introduction-to-r/chapter-5-data-frames?ex=1
  84. data.frame
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/data.frame
  85. as.data.frame
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/as.data.fra­me
  86. table
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/table
  87. Python Pandas – DataFrame
    https://www.tutorialspoin­t.com/python_pandas/python_pan­das_dataframe.htm
  88. The Pandas DataFrame: Make Working With Data Delightful
    https://realpython.com/pandas-dataframe/
  89. Python | Pandas DataFrame
    https://www.geeksforgeeks.org/python-pandas-dataframe/
  90. R – Factors
    https://www.tutorialspoin­t.com/r/r_factors.htm
  91. R – Scatterplots
    https://www.tutorialspoin­t.com/r/r_scatterplots.htm
  92. Quick guide to line types (lty) in R
    https://www.benjaminbell.co­.uk/2018/02/quick-guide-to-line-types-lty-in-r.html
  93. Lattice C (Wikipedia)
    https://en.wikipedia.org/wi­ki/Lattice_C
  94. Lorenz Attractor in R
    https://www.sixhat.net/lorenz-attractor-in-r.html
  95. Small multiple
    https://en.wikipedia.org/wi­ki/Small_multiple
  96. Category:Infographics (infografika)
    https://en.wikipedia.org/wi­ki/Category:Infographics
  97. Trellis plots (pro Python)
    https://subscription.packtpub­.com/book/big_data_and_bu­siness_intelligence/9781784390150/4/ch04l­vl1sec41/trellis-plots
  98. Trellis (architecture)
    https://en.wikipedia.org/wi­ki/Trellis_(architecture)
  99. Izobara (meteorologie)
    https://cs.wikipedia.org/wi­ki/Izobara_(meteorologie)
  100. How to Create a Lattice Plot in R
    https://www.dummies.com/pro­gramming/r/how-to-create-a-lattice-plot-in-r/
  101. Density estimation
    https://en.wikipedia.org/wi­ki/Density_estimation

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.