Hlavní navigace

Tvorba grafů v jazyce R s využitím knihovny ggplot2

20. 10. 2020
Doba čtení: 26 minut

Sdílet

 Autor: R Core Team
Dnes si popíšeme základní koncepty, na nichž je postavena knihovna gplot2. Tyto informace budou použitelné nejenom pro uživatele používající přímo jazyk R, ale i pro programátory, kteří ggplot2 volají z dalších jazyků.

Obsah

1. Tvorba grafů v jazyce R s využitím knihovny ggplot2

2. „Grammar of Graphics“ a jazyk R

3. Zrychlené a zjednodušené vykreslení grafů funkcí qplot

4. Vykreslení korelačního diagramu

5. Změna stylu vykreslování na základě další hodnoty (sloupce v datovém rámci)

6. Kombinace většího množství hodnot zakreslovaných do jediného grafu

7. Spojení vykreslených bodů úsečkami

8. Proložení bodů v korelačním diagramu křivkou

9. Volba facets – rozdělení grafů do mřížky na základě vybraných veličin

10. Příklad rozdělení grafu

11. Kombinace změny grafických stylů s volbou facets

12. Vykreslování průběhů funkcí s využitím qplot

13. Histogram

14. Jednoduchý krabicový diagram

15. Základy „Grammar of Graphics“ – funkce ggplot

16. Korelační diagram, tentokrát vytvořený pomocí ggplot a geom_point

17. Přidání regresní přímky do korelačního diagramu

18. Kombinace několika stylů vykreslování

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

20. Odkazy na Internetu

1. Tvorba grafů v jazyce R s využitím knihovny ggplot2

V dnešní části seriálu o programovacím jazyku R se začneme zabývat knihovnou pojmenovanou ggplot2. Už samotná existence této knihovny je pro některé uživatele důvodem k přechodu na jazyk R. Vysvětlíme si – ovšem po relativně malých krocích – jak se v této knihovně vytváří různé typy grafů a zejména jak se určuje způsob mapování dat na „vizuální styl“ použitý v grafech, protože princip práce knihovny ggplot na je postaven právě na těchto konceptech.

Obrázek 1: Logo knihovny ggplot2.

Naposled si v tomto seriálu připomeňme, jaké knihovny pro tvorbu grafů máme v jazyku R k dispozici:

  • 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

Pro interaktivní grafy (či obecně grafiku) je možné využít například tyto knihovny:

  • Balíček rggobi
  • Balíček iplots
  • Balíček rgl

Vidíme tedy, že knihovna ggplot2 spadá do stejné kategorie jako již zmíněná knihovna Lattice. Ve skutečnosti je ovšem tvorba grafů značně odlišná, což si ukážeme v závěrečných kapitolách a zejména pak v navazujícím článku.

Poznámka: všechny dnes popsané demonstrační příklady byly odzkoušeny i v interaktivním prostředí programovacího jazyka R, které je dostupné na stránce https://rdrr.io/snippets/.

2. „Grammar of Graphics“ a jazyk R

K tvorbě grafů je možné přistoupit dvěma způsoby. Buď knihovna nabízí několik funkcí, přičemž každá z těchto funkcí je určena pro vykreslení určitého typu grafu. Záleží pak na dokonalosti knihovny, jaké vlastnosti grafu je možné ovlivnit a jak je to složité. Tento způsob může být výhodnější zejména při snaze o rychlé zobrazení „nějakých“ grafů, ovšem navazující úpravy mohou být složité nebo nemožné. Druhý způsob spočívá v tom, že se graf postupně skládá z datových vstupů, mapování těchto vstupů na grafické vlastnosti a popř. i skládání grafů do vrstev či naopak jejich rozdělení do mřížky. Knihovna ggplot2 nabízí oba způsoby, přičemž ten první je reprezentován funkcí gplot/quickplot a druhý je založen na „grammar of graphics“, což je poněkud nadnesený termín označující sémantiku skládání grafů z jednotlivých částí pomocí propojení dat a vlastností.

Konkrétně se jedná o propojení (mapování) mezi daty či metadaty (statistickými informacemi o datech) na straně jedné a vizuálními styly geometrických objektů na straně druhé, přičemž mezi zmíněné geometrické objekty patří zejména body, úsečky a sloupce. Ovlivňovat lze různé vizuální styly, například barvu, tvar, velikost, umístění v rovině či prostoru apod. Dále se využívá vlastnost nazývaná „faceting“, která umožňuje použít stejné styly nastavené uživatelem pro vybrané podmnožiny dat a vytvořit tak grafy rozdělené do několika oblastí, podobně jako tomu bylo v knihovně Lattice (což uvidíme dále na příkladech).

Existuje zde jedno omezení – gramatika nepopisuje interaktivní chování, což pochopitelně nemusí vadit v různých vědeckých publikacích, ovšem při tvorbě „živých“ grafů dostupných online je nutné řešit i tuto problematiku. Tomuto tématu bude věnován samostatný článek.

3. Zrychlené a zjednodušené vykreslení grafů funkcí qplot

Ještě než se zaměříme na způsob vytváření grafů s využitím výše zmíněné „grammar of graphics“, popíšeme si zrychlený a vlastně i do značné míry zjednodušený postup vykreslení grafů funkcí qplot, popř. quickplot. Tato funkce byla do knihovny ggplot2 přidána proto, aby nebylo nutné pro základní grafy používat celou gramatiku, která je sice na jednu stranu velmi mocná, ovšem ne vždy je nutné tuto mocnou technologii použít. Funkce qplot může být pro mnoho účelů více než dostačující, což si ostatně ukážeme na demonstračních příkladech popsaných v navazujících kapitolách.

Podobně jako u dalších funkcí, je k dispozici nápověda i pro funkci qplot; součástí nápovědy jsou i jednoduché příklady použití:

library(ggplot2)
 
help(qplot)
qplot                 package:ggplot2                  R Documentation
 
Quick plot
 
Description:
 
     'qplot' is a shortcut designed to be familiar if you're used to
     base 'plot()'. It's a convenient wrapper for creating a number of
     different types of plots using a consistent calling scheme. It's
     great for allowing you to produce plots quickly, but I highly
     recommend learning 'ggplot()' as it makes it easier to create
     complex graphics.
 
Usage:
 
     qplot(x, y, ..., data, facets = NULL, margins = FALSE, geom = "auto",
       xlim = c(NA, NA), ylim = c(NA, NA), log = "", main = NULL,
       xlab = NULL, ylab = NULL, asp = NA, stat = NULL,
       position = NULL)
 
     quickplot(x, y, ..., data, facets = NULL, margins = FALSE,
       geom = "auto", xlim = c(NA, NA), ylim = c(NA, NA), log = "",
       main = NULL, xlab = NULL, ylab = NULL, asp = NA, stat = NULL,
       position = NULL)

V dalších kapitolách budeme používat datový soubor uložený v datovém rámci mtcars, který již známe z předchozích částí tohoto seriálu. Takže jen krátce – jedná se o souhrnné informace o třiceti dvou vozech, přičemž každý řádek datového rámce je pojmenovaný podle typu vozu):

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

4. Vykreslení korelačního diagramu

Ukažme si nyní naprosto základní způsob využití funkce qplot. V případě, že se této funkci předají dva vektory (sloupce v datovém rámci), bude první vektor považován za soubor x-ových souřadnic a druhý vektor za soubor souřadnic y-ových. Výsledkem tedy bude graf obsahující jednotlivé body – tento graf se nazývá korelační diagram, popř. scatter plot:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars)

Obrázek 2: Korelační diagram vykreslený funkcí qplot. Vykreslené body reprezentují pouze dvojici vlastností (resp. vzájemnou souvislost obou vlastností) – zde konkrétně váhu vozu a jeho spotřebu (ta je ovšem zobrazena inverzně, jak je zvykem v USA).

Poznámka: funkce qplot se rozhoduje, jaký typ grafu se má vykreslit, primárně podle počtu předaných dat. Pokud bude předán jediný vektor, vytvoří se namísto korelačního diagramu histogram.

5. Změna stylu vykreslování na základě další hodnoty (sloupce v datovém rámci)

V mnoha případech potřebujeme do korelačního diagramu nějakým způsobem zanést informace o další vlastnosti (hodnotách). Pokud budeme chtít zachovat přehlednost dvourozměrného grafu, lze další vlastnost zakódovat například do barvy. V tomto případě bude barvou označen počet válců motoru:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      colour = factor(cyl))
Poznámka: povšimněte si, jak jsme převedli sadu numerických hodnot na faktory.

Obrázek 3: Zobrazení třetí vlastnosti – počtu válců – formou barvy. Součástí grafu je i automaticky vytvořená legenda.

Modifikovat je možné i velikost vykreslených bodů, opět (například) v závislosti na počtu válců motoru:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      size = cyl)

Obrázek 4: Zobrazení třetí vlastnosti – počtu válců – změnou velikosti vykreslovaných bodů. Vzhledem k tomu, že jsme numerické hodnoty nepřevedli na faktory, zobrazují se v legendě i ty hodnoty, které nejsou v datovém setu použity.

Často se taktéž setkáme s tím, že se změní tvar vykreslovaných bodů (ovšem daná vlastnost musí mít jen několik hodnot, jinak bude tento způsob nepřehledný):

library(ggplot2)
 
qplot(mpg,
      wt,
      data = mtcars,
      shape = factor(cyl))

Obrázek 5: Zobrazení třetí vlastnosti – počtu válců – změnou tvaru vykreslovaných bodů.

6. Kombinace většího množství hodnot zakreslovaných do jediného grafu

Nic nám ovšem nebrání v tom, aby se do korelačního diagramu zakódovaly i další vlastnosti, například jak počet válců, tak i počet rychlostí. Jedna z vlastností bude reprezentována velikostí bodů, druhá pak barvou:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      size = cyl,
      colour = gear)

Obrázek 6: Zobrazení třetí a čtvrté vlastnosti v korelačním diagramu změnou velikosti a barvy vykreslovaných bodů.

Poznámka: z legendy je patrné, jak je užitečné převádět vektory hodnot na faktory. Sami si vyzkoušejte, jak se graf změní po nepatrné úpravě příkladu:
library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      size = factor(cyl),
      colour = factor(gear))

Kombinace velikosti a tvaru bodů:

library(ggplot2)
 
qplot(mpg,
      wt,
      data = mtcars,
      shape = factor(cyl),
      size = gear)

Obrázek 7: Zobrazení třetí a čtvrté vlastnosti v korelačním diagramu modifikací tvaru a velikosti vykreslovaných bodů.

Kombinace tří vlastností:

library(ggplot2)
 
qplot(mpg,
      wt,
      data = mtcars,
      shape = factor(cyl),
      size = gear,
      color = hp)

Obrázek 8: Zobrazení tří dalších vlastností do korelačního diagramu s využitím tvaru, velikosti i barvy vykreslovaných bodů.

7. Spojení vykreslených bodů úsečkami

S využitím pojmenovaného parametru geom můžeme v korelačním diagramu spojit jednotlivé body úsečkami, což by v některých případech mohlo naznačit nějaký trend (resp. přesněji řečeno nějakou korelaci mezi vynášenými hodnotami). U datového setu s automobily je tomu tak pouze do určité míry – trend mezi spotřebou a hmotností obecně existuje, ovšem počet vynášených hodnot je relativně malý:

library(ggplot2)
 
qplot(mpg,
      wt,
      data = mtcars,
      geom = c("point", "line"))

Výsledek bude v našem ne příliš vhodném datovém setu vypadat následovně:

Obrázek 9: Spojení bodů vykreslených v korelačním diagramu úsečkami.

8. Proložení bodů v korelačním diagramu křivkou

Výhodnější může být proložení bodů v korelačním diagramu aproximační křivkou. Navíc se okolo této křivky zobrazí plocha vyjadřující interval spolehlivost. Čím je plocha okolo křivky širší, tím méně (obecně) křivka aproximuje reálná data. V našem konkrétním datovém setu je šířka plochy dosti široká, takže aproximace není (pro tato vstupní data) v žádném případě dokonalá:

library(ggplot2)
 
qplot(mpg,
      wt,
      data = mtcars,
      geom = c("point", "smooth"))

Obrázek 10: Proložení bodů v korelačním diagramu křivkou se zobrazením intervalu spolehlivosti.

Aproximační křivku lze v případě potřeby rozdělit na základě další (třetí) veličiny, v našem případě podle počtu válců motoru. Navíc jsou jednotlivé části křivky odlišeny i barvou:

library(ggplot2)
 
qplot(mpg,
      wt,
      data = mtcars,
      geom = c("point", "smooth"),
      color = factor(cyl))

Obrázek 11: Rozdělení aproximační křivky na tři části v závislosti na počtu válců motoru.

9. Volba facets – rozdělení grafů do mřížky na základě vybraných veličin

V předchozích dvou částech tohoto seriálu jsme se zaměřili na popis knihovny Lattice, která je taktéž určená pro vykreslování grafů. Název této knihovny je odvozen od toho, že grafy je možné v případě potřeby rozdělit do několika menších grafů umístěných do pravidelné mřížky. Rozdělení je provedeno na základě třetí, popř. čtvrté hodnoty (typicky sloupci v datovém rámci) a může vypadat například následovně:

Podobný koncept nalezneme i v knihovně ggplot2, ovšem namísto označení „lattice“ se zde používá slovo „facet(s)“. Příklady použití v souvislosti s funkcí qplot budou ukázány v navazujících kapitolách.

10. Příklad rozdělení grafu

Pro ilustraci se nyní pokusme rozdělit graf váha vozu/spotřeba na několik částí, přičemž v každé části budou vyneseny údaje o těch automobilech, které mají stejný počet válců a současně i stejný počet rychlostních stupňů. V případě použití funkce qplot je zapotřebí stanovit pojmenovaný parametr facets:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      facets = cyl ~ gear)

Výsledek by měl vypadat takto:

Obrázek 12: Rozdělení grafu na menší části v závislosti na počtu válců a počtu převodových stupňů.

11. Kombinace změny grafických stylů s volbou facets

Opět nám nic nebrání v tom zanést i do rozdělených grafů informace o další vlastnosti či dalších vlastnostech. Již bez podrobnějšího popisu se podívejme na dvojici demonstračních příkladů.

Rozdělení podle počtu válců a rychlostních stupňů, obarvení na základě páté vlastnosti:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      facets = cyl ~ gear,
      colour = factor(carb))

Obrázek 13: Rozdělení podle počtu válců a rychlostních stupňů, obarvení na základě páté vlastnosti.

Přidání šesté vlastnosti (výkon motoru) reprezentované velikostí vykreslených bodů:

library(ggplot2)
 
qplot(wt,
      mpg,
      data = mtcars,
      facets = cyl ~ gear,
      colour = factor(carb),
      size = hp)

Obrázek 14: Přidání šesté vlastnosti (výkon motoru) reprezentované velikostí vykreslených bodů.

12. Vykreslování průběhů funkcí s využitím qplot

Díky tomu, že korelační diagram zobrazuje (ve své nejjednodušší podobě) body určené svými souřadnicemi v kartézské souřadné soustavě, je možné relativně snadno vykreslovat i průběhy funkcí. Podívejme se na velmi jednoduchý příklad:

library(ggplot2)
 
x <- 1:50
y <- sin(6*pi*x/100)/x
 
qplot(x, y)

Obrázek 15: Průběh funkce je naznačen body v grafu.

Body, kterými jsme průběh funkce interpolovali, lze spojit úsečkami, což nám dá lepší představu o průběhu funkce:

library(ggplot2)
 
x <- 1:50
y <- sin(6*pi*x/100)/x
 
qplot(x,
      y,
      geom = c("point", "line"))

Obrázek 16: Propojení jednotlivých bodů úsečkami.

Na druhou stranu snaha o aproximaci průběhu obecné funkce aproximační křivkou nemusí dopadnout dobře, což je ostatně na dalším příkladu patrné (lepší by v tomto konkrétním případě bylo použít křivku interpolační):

library(ggplot2)
 
x <- 1:50
y <- sin(6*pi*x/100)/x
 
qplot(x,
      y,
      geom = c("point", "smooth"))

Obrázek 17: Snaha o aproximaci funkce křivkou, která k tomuto účelu není příliš vhodná.

13. Histogram

V případě, že se namísto dvojice vektorů představujících x-ové a y-ové souřadnice vynášených bodů, předá pouze jediný vektor s numerickými hodnotami, bude namísto korelačního diagramu vykreslen běžný histogram. Funkce qplot tak sama rozhoduje na základě počtu předaných dat, který typ grafu se má vykreslit. Podívejme se tedy například na histogram s výkony motorů z našeho datového setu:

library(ggplot2)
 
qplot(hp, data = mtcars)

Výsledkem bude tento histogram:

Obrázek 18: Histogram vykreslený předchozím demonstračním příkladem.

Šířku intervalů v histogramu určuje nepovinný parametr nazvaný binwidth:

library(ggplot2)
 
qplot(hp, data = mtcars, binwidth=20)

S tímto výsledkem:

Obrázek 19: Histogram s upravenou šířkou intervalů.

14. Jednoduchý krabicový diagram

Posledním typem grafu, který je podporovaný funkcí qplot, je krabicový diagram, s nímž jsme se seznámili již v souvislosti s knihovnou Lattice. Tento graf je nutné explicitně zvolit pojmenovaným parametrem geom, kterému se předává vektor voleb ovlivňujících způsob zobrazení. Příklad použití může vypadat následovně:

library(ggplot2)
 
qplot(factor(cyl), wt, data = mtcars, geom = c("boxplot", "jitter"))

S následujícím výsledkem:

Obrázek 20: Jednoduchý krabicový diagram zobrazený funkcí qplot.

15. Základy „Grammar of Graphics“ – funkce ggplot

Nyní se konečně dostáváme k popisu použití grammar of graphics v knihovně ggplot2. Vykreslení, resp. přesněji řečeno složení grafu je provedeno v několika krocích:

  1. Inicializace objektu ggplot, většinou se specifikací zdroje dat
  2. Specifikace „estetického mapování“, což je určení, jakým způsobem se mají zdrojová data transformovat do vizuálních stylů, popř. na geometrii vykreslovaných objektů
  3. Určení způsobu vykreslení (typ grafu atd.)
  4. Změna grafických vlastností, například na základě třetí či další veličiny
  5. Složení grafu z vrstev, popř. rozdělení na „facets“

Základem je konstruktor objektu ggplot, v němž se typicky specifikuje zdroj dat pro nový graf:

help(ggplot)
 
ggplot                 package:ggplot2                 R Documentation
 
Create a new ggplot
 
Description:
 
     'ggplot()' initializes a ggplot object. It can be used to declare
     the input data frame for a graphic and to specify the set of plot
     aesthetics intended to be common throughout all subsequent layers
     unless specifically overridden.
 
Usage:
 
     ggplot(data = NULL, mapping = aes(), ...,
       environment = parent.frame())
 
Arguments:
 
    data: Default dataset to use for plot. If not already a data.frame,
          will be converted to one by 'fortify()'. If not specified,
          must be supplied in each layer added to the plot.
 
 mapping: Default list of aesthetic mappings to use for plot. If not
          specified, must be supplied in each layer added to the plot.

     ...: Other arguments passed on to methods. Not currently used.
 
environment: DEPRECATED. Used prior to tidy evaluation.

Určení transformace zdrojových dat do vizuálních stylů zajišťuje funkce aes:

help(aes)
 
aes                  package:ggplot2                   R Documentation
 
Construct aesthetic mappings
 
Description:
 
     Aesthetic mappings describe how variables in the data are mapped
     to visual properties (aesthetics) of geoms. Aesthetic mappings can
     be set in 'ggplot2()' and in individual layers.

Způsob použití:

ggplot(zdrojová_data) + aes(mapování)

Ovšem zápis můžeme i zkrátit na:

ggplot(zdrojová_data) + aes(mapování)

Dnes si ukážeme tvorbu korelačních diagramů, což je však jen jeden z mnoha typů podporovaných grafů. Další typy grafů a způsoby ovlivnění jejich vykreslení budou uvedeny v navazujících částech tohoto seriálu.

16. Korelační diagram, tentokrát vytvořený pomocí ggplot a geom_point

Nyní se můžeme pokusit o vykreslení korelačního diagramu, tentokrát přímo s využitím funkce ggplot a nikoli qplot. Této funkci předáme jak zdroj dat (datový rámec mtcars), tak i specifikaci mapování, zde konkrétně jaký vektor představuje x-ové souřadnice a jaký vektor souřadnice y-ové:

library(ggplot2)
 
ggplot(mtcars, aes(x = mpg, y = wt))

Popř.:

library(ggplot2)
 
ggplot(mtcars) + aes(x = mpg, y = wt)

Pokud tento graf zobrazíme, uvidíme, že se ve skutečnosti vykreslila jen prázdná plocha (ovšem se správně nastavenými rozsahy na souřadných osách). Je tomu tak z toho důvodu, že není specifikováno mapování mezi daty a způsobem jejich zobrazení:

Obrázek 21: Prázdná plocha pro graf.

Musíme tedy nějakým způsobem specifikovat, jakým způsobem se mají data určená pomocí aes zobrazit. Pokud budeme chtít zobrazit korelační diagram (scatter plot), použijeme funkci geom_points:

help(geom_point)
 
geom_point               package:ggplot2               R Documentation
 
Points
 
Description:
 
     The point geom is used to create scatterplots. The scatterplot is
     most useful for displaying the relationship between two continuous
     variables. It can be used to compare one continuous and one
     categorical variable, or two categorical variables, but a
     variation like 'geom_jitter()', 'geom_count()', or 'geom_bin2d()'
     is usually more appropriate. A _bubblechart_ is a scatterplot with
     a third variable mapped to the size of points.
 
Usage:
 
     geom_point(mapping = NULL, data = NULL, stat = "identity",
       position = "identity", ..., na.rm = FALSE, show.legend = NA,
       inherit.aes = TRUE)

Tuto funkci použijeme následujícím způsobem, aby se graf postupně složil z jednotlivých komponent gramatiky:

library(ggplot2)
 
ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point()

Výsledek by měl vypadat takto:

Obrázek 22: Vykreslení korelačního diagramu.

Poznámka: můžeme psát i:
library(ggplot2)
 
ggplot(mtcars) + aes(x = mpg, y = wt) + geom_point()

17. Přidání regresní přímky do korelačního diagramu

Do korelačního diagramu můžeme přidat i regresní přímku. K tomuto účelu se používá funkce geom_smooth, které se předá typ regresního modelu (lm funkce pro linear model):

help(geom_smooth)
 
geom_smooth              package:ggplot2               R Documentation
 
Smoothed conditional means
 
Description:
 
     Aids the eye in seeing patterns in the presence of overplotting.
     'geom_smooth()' and 'stat_smooth()' are effectively aliases: they
     both use the same arguments. Use 'stat_smooth()' if you want to
     display the results with a non-standard geom.
 
Usage:
 
     geom_smooth(mapping = NULL, data = NULL, stat = "smooth",
       position = "identity", ..., method = "auto", formula = y ~ x,
       se = TRUE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)
 
     stat_smooth(mapping = NULL, data = NULL, geom = "smooth",
       position = "identity", ..., method = "auto", formula = y ~ x,
       se = TRUE, n = 80, span = 0.75, fullrange = FALSE,
       level = 0.95, method.args = list(), na.rm = FALSE,
       show.legend = NA, inherit.aes = TRUE)

Příklad použití, resp. přesněji řečeno přidání regresní přímky může vypadat následovně:

library(ggplot2)
 
ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point() + geom_smooth(method="lm")

Obrázek 23: Regresní přímka přidaná do korelačního grafu.

18. Kombinace několika stylů vykreslování

U funkce qplot jsme si ukázali, že je možné na základě třetího, popř. i čtvrtého atd. vektoru hodnot zobrazit i další veličiny, a to například s použitím barevných kódů, stylu vykreslení bodů, jejich velikosti atd. Podobný koncept lze pochopitelně využít i v grammar of graphics. Konkrétně musíme specifikovat styl vykreslování bodů přímo ve funkci geom_point, a to následovně:

library(ggplot2)
 
ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point(col=mtcars$cyl) + geom_smooth(method="lm")
Poznámka: povšimněte si, že již nemůžeme použít zkrácenou specifikaci vektoru pomocí cyl (tedy beze jména datového rámce), ale musíme uvést celé jméno, v našem případě mtcars$cyl.

Výsledek:

tip obecný root

Obrázek 23: Modifikace barvy vykreslovaných bodů na základě počtu válců.

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_qplot_help.R zobrazí dokumentace k funkci qplot z knihovny ggplot2 https://github.com/tisnik/r-examples/blob/master/10-ggplot2/01_qplot_help.R
2 02_qplot_xy.R vykreslení základního korelačního diagramu https://github.com/tisnik/r-examples/blob/master/10-ggplot2/02_qplot_xy.R
3 03_qplot_colour.R zobrazení třetí vlastnosti – počtu válců – formou barvy. https://github.com/tisnik/r-examples/blob/master/10-ggplot2/03_qplot_colour.R
4 04_qplot_size.R zobrazení třetí vlastnosti – počtu válců – změnou velikosti vykreslovaných bodů. https://github.com/tisnik/r-examples/blob/master/10-ggplot2/04_qplot_size.R
5 05_qplot_shape.R zobrazení třetí vlastnosti – počtu válců – změnou tvaru vykreslovaných bodů. https://github.com/tisnik/r-examples/blob/master/10-ggplot2/05_qplot_shape.R
6 06_qplot_colour_and_size.R zobrazení třetí a čtvrté vlastnosti v korelačním diagramu změnou velikosti a barvy vykreslovaných bodů https://github.com/tisnik/r-examples/blob/master/10-ggplot2/06_qplot_colour_and_size.R
7 07_qplot_shape_and_size.R zobrazení třetí a čtvrté vlastnosti v korelačním diagramu modifikací tvaru a velikosti vykreslovaných bodů https://github.com/tisnik/r-examples/blob/master/10-ggplot2/07_qplot_shape_and_size.R
8 08_qplot_shape_and_size_and_colour.R zobrazení tří dalších vlastností do korelačního diagramu s využitím tvaru, velikosti i barvy vykreslovaných bodů https://github.com/tisnik/r-examples/blob/master/10-ggplot2/08_qplot_shape_an­d_size_and_colour.R
9 09_qplot_lines.R spojení bodů vykreslených v korelačním diagramu úsečkami https://github.com/tisnik/r-examples/blob/master/10-ggplot2/09_qplot_lines.R
10 10_qplot_smooth.R proložení bodů v korelačním diagramu křivkou se zobrazením intervalu spolehlivosti https://github.com/tisnik/r-examples/blob/master/10-ggplot2/10_qplot_smooth.R
11 11_qplot_smooth_color.R rozdělení aproximační křivky na tři části v závislosti na počtu válců motoru https://github.com/tisnik/r-examples/blob/master/10-ggplot2/11_qplot_smooth_color.R
12 12_qplot_facets.R rozdělení grafu na menší části v závislosti na počtu válců a počtu převodových stupňů https://github.com/tisnik/r-examples/blob/master/10-ggplot2/12_qplot_facets.R
13 13_qplot_facets_colour.R rozdělení podle počtu válců a rychlostních stupňů, obarvení na základě páté vlastnosti https://github.com/tisnik/r-examples/blob/master/10-ggplot2/13_qplot_facets_colour.R
14 14_qplot_facets_colour_sizes.R přidání šesté vlastnosti (výkon motoru) reprezentované velikostí vykreslených bodů https://github.com/tisnik/r-examples/blob/master/10-ggplot2/14_qplot_facets_colour_sizes.R
15 15_qplot_xyplot_points.R vykreslení funkce: průběh funkce je naznačen body v grafu https://github.com/tisnik/r-examples/blob/master/10-ggplot2/15_qplot_xyplot_points.R
16 16_qplot_xyplot_lines.R vykreslení funkce: propojení jednotlivých bodů úsečkami https://github.com/tisnik/r-examples/blob/master/10-ggplot2/16_qplot_xyplot_lines.R
17 17_qplot_xyplot_smooth.R vykreslení funkce: snaha o aproximaci funkce křivkou, která k tomuto účelu není příliš vhodná https://github.com/tisnik/r-examples/blob/master/10-ggplot2/17_qplot_xyplot_smooth.R
18 18_histogram.R histogram vykreslený funkcí qplot https://github.com/tisnik/r-examples/blob/master/10-ggplot2/18_histogram.R
19 19_histogram.R histogram s upravenou šířkou intervalů https://github.com/tisnik/r-examples/blob/master/10-ggplot2/19_histogram.R
20 20_bwplot.R jednoduchý krabicový diagram zobrazený funkcí qplot https://github.com/tisnik/r-examples/blob/master/10-ggplot2/20_bwplot.R
21 21_ggplot2_blank_chart.R prázdný diagram vytvořený funkcí ggplot https://github.com/tisnik/r-examples/blob/master/10-ggplot2/21_ggplot2_blank_chart.R
22 22_ggplot2_geom_point.R korelační diagram vytvořený pomocí ggplot a geom_point https://github.com/tisnik/r-examples/blob/master/10-ggplot2/22_ggplot2_geom_point.R
23 23_ggplot2_geom_smooth.R přidání regresní přímky do korelačního diagramu https://github.com/tisnik/r-examples/blob/master/10-ggplot2/23_ggplot2_geom_smooth.R
24 24_ggplot2_different_colors.R kombinace několika stylů vykreslování https://github.com/tisnik/r-examples/blob/master/10-ggplot2/24_ggplot2_different_colors.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. ggplot2 – Introduction
    https://www.tutorialspoin­t.com/ggplot2/ggplot2_intro­duction.htm
  7. Create Elegant Data Visualisations Using the Grammar of Graphics
    https://www.rdocumentation­.org/packages/ggplot2/ver­sions/3.3.2
  8. Grid
    https://www.stat.auckland­.ac.nz/~paul/grid/grid.html
  9. Interactive Course: Data Visualization with lattice in R
    https://www.datacamp.com/courses/data-visualization-in-r-with-lattice
  10. Lattice: trellis graphics for R
    https://lattice.r-forge.r-project.org/
  11. Lattice: Multivariate Data Visualization with R
    http://lmdvr.r-forge.r-project.org/figures/figures.html
  12. Getting Started with Lattice Graphics
    https://lattice.r-forge.r-project.org/Vignettes/src/lattice-intro/lattice-intro.pdf
  13. Using lattice’s xyplot()
    https://homerhanumat.github­.io/tigerstats/xyplot.html
  14. ggplot2 Tutorial
    https://www.tutorialspoin­t.com/ggplot2/index.htm
  15. Lattice Package in R with Functions and Graphs
    https://techvidvan.com/tu­torials/lattice-package-in-r/
  16. The R Graph Gallery
    https://www.r-graph-gallery.com/index.html
  17. Lattice Graphs
    https://www.statmethods.net/ad­vgraphs/trellis.html
  18. ggplot2 (Graph gallery)
    https://www.r-graph-gallery.com/ggplot2-package.html
  19. R Markdown
    https://rmarkdown.rstudio.com/
  20. R Markdown: The Definitive Guide
    https://bookdown.org/yihui/rmarkdown/
  21. R Markdown Cheat Sheet
    https://rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf
  22. Introduction to R Markdown
    https://rmarkdown.rstudio­.com/articles_intro.html
  23. R Cheat Sheets
    https://blog.sergiouri.be/2016/07/r-cheat-sheets.html
  24. R Cheat Sheet
    https://s3.amazonaws.com/quandl-static-content/Documents/Quandl±+R+Che­at+Sheet.pdf
  25. Base R Cheat Sheet
    https://rstudio.com/wp-content/uploads/2016/06/r-cheat-sheet.pdf
  26. PYPL PopularitY of Programming Language
    https://pypl.github.io/PYPL.html
  27. Tiobe index
    https://www.tiobe.com/tiobe-index/
  28. Stack Overflow: Most Loved, Dreaded & Wanted Programming Languages In 2020
    https://fossbytes.com/stack-overflow-most-loved-dreaded-wanted-programming-languages-in-2020/
  29. How to Install and Use R on Ubuntu
    https://itsfoss.com/install-r-ubuntu/
  30. R programming for beginners – Why you should use R
    https://www.youtube.com/wat­ch?v=9kYUGMg_14s
  31. GOTO 2012 • The R Language The Good The Bad & The Ugly
    https://www.youtube.com/wat­ch?v=6S9r_YbqHy8
  32. R vs Python – What should I learn in 2020? | R and Python Comparison
    https://www.youtube.com/wat­ch?v=eRP_J2yLjSU
  33. R Programming 101
    https://www.youtube.com/c/rpro­gramming101
  34. Seriál Tvorba grafů pomocí programu „R“
    https://www.root.cz/serialy/tvorba-grafu-pomoci-programu-r/
  35. Tvorba grafů pomocí programu „R“: úvod
    https://www.root.cz/clanky/tvorba-grafu-pomoci-programu-r-1/
  36. Tvorba grafů pomocí programu „R“: pokročilé funkce
    https://www.root.cz/clanky/tvorba-grafu-pomoci-programu-r-pokrocile-funkce/
  37. Tvorba grafů pomocí programu „R“: vkládání textu, čeština
    https://www.root.cz/clanky/grafy-pomoci-programu-r-vkladani-textu-cestina/
  38. Cesta erka: Krok nultý – instalace & nastavení – prostředí, projekty, package
    https://www.jla-data.net/r4su/r4su-environment-setup/
  39. Cesta erka: Krok první – operace a struktury – proměnné, rovnítka a dolary
    https://www.jla-data.net/r4su/r4su-data-structures/
  40. Cesta erka: Krok druhý – načtení externích dat – csvčka, excely a databáze
    https://www.jla-data.net/r4su/r4su-read-data/
  41. Cesta erka: Krok třetí – manipulace s daty – dplyr, slovesa a pajpy
    https://www.jla-data.net/r4su/r4su-manipulate-data/
  42. Cesta erka: Krok čtvrtý – podání výsledků – ggplot, geomy a estetiky
    https://www.jla-data.net/r4su/r4su-report-results/
  43. Cesta erka: Krok pátý – case study – případ piva v Praze
    https://www.jla-data.net/r4su/r4su-case-study-beer/
  44. 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/
  45. Is R Programming SURGING in Popularity in 2020?
    https://www.youtube.com/watch?v=Duwn-vImyXE
  46. Using the R programming language in Jupyter Notebook
    https://docs.anaconda.com/a­naconda/navigator/tutorial­s/r-lang/
  47. Using R on Jupyter Notebook
    https://dzone.com/articles/using-r-on-jupyternbspnotebook
  48. Graphics, ggplot2
    http://r4stats.com/examples/graphics-ggplot2/
  49. A Practice Data Set
    https://r4stats.wordpress­.com/examples/mydata/
  50. Shiny – galerie projektů
    https://shiny.rstudio.com/gallery/
  51. Seriál Programovací jazyk Julia
    https://www.root.cz/seria­ly/programovaci-jazyk-julia/
  52. Julia (front page)
    http://julialang.org/
  53. Julia – repositář na GitHubu
    https://github.com/JuliaLang/julia
  54. Julia (programming language)
    https://en.wikipedia.org/wi­ki/Julia_%28programming_lan­guage%29
  55. IJulia
    https://github.com/JuliaLan­g/IJulia.jl
  56. Introducing Julia
    https://en.wikibooks.org/wi­ki/Introducing_Julia
  57. Julia: the REPL
    https://en.wikibooks.org/wi­ki/Introducing_Julia/The_REPL
  58. Introducing Julia/Metaprogramming
    https://en.wikibooks.org/wi­ki/Introducing_Julia/Meta­programming
  59. Month of Julia
    https://github.com/DataWo­okie/MonthOfJulia
  60. Learn X in Y minutes (where X=Julia)
    https://learnxinyminutes.com/doc­s/julia/
  61. 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
  62. Julia: A Fast Dynamic Language for Technical Computing
    http://karpinski.org/publi­cations/2012/julia-a-fast-dynamic-language
  63. The LLVM Compiler Infrastructure
    http://llvm.org/
  64. Julia: benchmarks
    http://julialang.org/benchmarks/
  65. R Vector
    https://www.datamentor.io/r-programming/vector/
  66. .R File Extension
    https://fileinfo.com/extension/r
  67. Lineární regrese
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_regre­se
  68. lm (funkce)
    https://www.rdocumentation­.org/packages/stats/versi­ons/3.6.2/topics/lm
  69. quit (funkce)
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/quit
  70. c (funkce)
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/c
  71. help (funkce)
    https://www.rdocumentation­.org/packages/utils/versi­ons/3.6.2/topics/help
  72. Shiny: Introduction to interactive documents
    https://shiny.rstudio.com/ar­ticles/interactive-docs.html
  73. R Release History 1997–2013
    http://timelyportfolio.git­hub.io/rCharts_timeline_r/
  74. R: atomic vectors
    https://renenyffenegger.ch/no­tes/development/languages/R/da­ta-structures/vector/
  75. 11 Best R Programming IDE and editors
    https://www.dunebook.com/best-r-programming-ide/
  76. CRAN – The Comprehensive R Archive Network
    https://cran.r-project.org/
  77. R – Arrays
    https://www.tutorialspoin­t.com/r/r_arrays.htm
  78. Array vs Matrix in R Programming
    https://www.geeksforgeeks.org/array-vs-matrix-in-r-programming/?ref=rp
  79. Online R Language IDE
    https://www.jdoodle.com/execute-r-online/
  80. Execute R Online (R v3.4.1)
    https://www.tutorialspoin­t.com/execute_r_online.php
  81. Snippets: Run any R code you like. There are over twelve thousand R packages preloaded
    https://rdrr.io/snippets/
  82. R Package Documentation
    https://rdrr.io/
  83. Data Reshaping in R – Popular Functions to Organise Data
    https://techvidvan.com/tutorials/data-reshaping-in-r/
  84. What is an R Data Frame?
    https://magoosh.com/data-science/what-is-an-r-data-frame/
  85. What's a data frame?
    https://campus.datacamp.com/cou­rses/free-introduction-to-r/chapter-5-data-frames?ex=1
  86. data.frame
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/data.frame
  87. as.data.frame
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/as.data.fra­me
  88. table
    https://www.rdocumentation­.org/packages/base/version­s/3.6.2/topics/table
  89. Python Pandas – DataFrame
    https://www.tutorialspoin­t.com/python_pandas/python_pan­das_dataframe.htm
  90. The Pandas DataFrame: Make Working With Data Delightful
    https://realpython.com/pandas-dataframe/
  91. Python | Pandas DataFrame
    https://www.geeksforgeeks.org/python-pandas-dataframe/
  92. R – Factors
    https://www.tutorialspoin­t.com/r/r_factors.htm
  93. R – Scatterplots
    https://www.tutorialspoin­t.com/r/r_scatterplots.htm
  94. Quick guide to line types (lty) in R
    https://www.benjaminbell.co­.uk/2018/02/quick-guide-to-line-types-lty-in-r.html
  95. Lattice C (Wikipedia)
    https://en.wikipedia.org/wi­ki/Lattice_C
  96. Lorenz Attractor in R
    https://www.sixhat.net/lorenz-attractor-in-r.html
  97. Small multiple
    https://en.wikipedia.org/wi­ki/Small_multiple
  98. Category:Infographics (infografika)
    https://en.wikipedia.org/wi­ki/Category:Infographics
  99. Trellis plots (pro Python)
    https://subscription.packtpub­.com/book/big_data_and_bu­siness_intelligence/9781784390150/4/ch04l­vl1sec41/trellis-plots
  100. Trellis (architecture)
    https://en.wikipedia.org/wi­ki/Trellis_(architecture)
  101. Izobara (meteorologie)
    https://cs.wikipedia.org/wi­ki/Izobara_(meteorologie)
  102. How to Create a Lattice Plot in R
    https://www.dummies.com/pro­gramming/r/how-to-create-a-lattice-plot-in-r/
  103. Density estimation
    https://en.wikipedia.org/wi­ki/Density_estimation
  104. Sedm smrtelných statistických hříchů
    http://dfens-cz.com/sedm-smrtelnych-statistickych-hrichu/
  105. Spurious correlations
    https://tylervigen.com/spurious-correlations

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.