26  Pokročilé grafy

Předchozí kapitoly byly věnovány základům práce s balíčkem ggplot2. V této kapitole si ukážeme příklady pokročilejších technik, které při vizualizaci dat můžeme využít.

26.1 Polární koordináty

Většina grafů využívá karteziánské koordináty - objekty v grafu jsou mapované na horizontální a vertikální osu. Čas od času se ovšem vyplatí využít jiný systém. Jedním z nejpopulárnějších jsou polární koordináty.

Přestože si to možná neuvědomujeme, každý z nás se již s polárními koordináty setkal. Slouží k vytváření koláčových grafů, které nejsou ničím jiným, než stočenými skládánými sloupcovými grafy. Začněme vytvořením skládaného sloupcového grafu:

countries %>% 
  count(postsoviet) %>% 
  ggplot(aes(x = 1, y = n, fill = postsoviet)) +
  geom_col(position = "stack")

Nyní jen stači použít funkci coord_polar() pro aplikace polárních koordinátů. Argumentem theta určíme, kterou z os “obtočíme” kolem středu grafu:

countries %>% 
  count(postsoviet) %>% 
  ggplot(aes(x = 1, y = n, fill = postsoviet)) +
  geom_col(position = "stack") +
  coord_polar(theta = "y")

A je to, koláčový graf je hotový! Obdobným způsobem je možné vytvářet i další varianty. Například takzvaný donut chart, tedy koláčový graf s dírou ve středu, vytvoříme jednoduše tak, že necháme prostor mezi začátkem horizontální osy a sloupcem:

countries %>% 
  count(postsoviet) %>% 
  ggplot(aes(x = 1, y = n, fill = postsoviet)) +
  geom_col() +
  scale_x_continuous(limits = c(0, NA)) + 
  coord_polar(theta = "y")

26.2 Skládání geomů

Mnoho komplexních grafů je možné vytvořit kombinací několika vrstev geomů. K tomu nám pomůže fakt, že každá vrstva ggplot2 grafů může mít svůj vlastní zdroj dat a své vlastní mapování. Následující graf se nazývá barbell chart a využívá se pro srovnání zpravidla dvou skupin napříč několika proměnnými. Přestože tento graf může na první pohled vypadat komplikovaně, jedná s jen o dvě sady bodů spojené úsečkou.

NULL

Začněme přípravou dat. Pro každou ze skupin proměnné postsoviet spočítáme průměr proměnných material_dep, poverty_risk a uni_prc. Data poté převedeme do dlouhého formátu:

countries %>% 
  group_by(postsoviet) %>% 
  summarise(across(.cols = c(material_dep, poverty_risk, uni_prc),
                   .fns = mean, na.rm = TRUE)) %>% 
  pivot_longer(cols = -postsoviet)
# A tibble: 6 × 3
  postsoviet name         value
  <chr>      <chr>        <dbl>
1 no         material_dep 0.137
2 no         poverty_risk 0.223
3 no         uni_prc      0.320
4 yes        material_dep 0.239
5 yes        poverty_risk 0.264
6 yes        uni_prc      0.249

Druhým krokem je vytvořením grafu. Nejdříve využijeme funkce geom_line() pro vytvoření úsečky spojující obě skupiny zemí. Poté přidámé další vrstu grafu, tentokrát za pomoci funkce geom_point(). Tou vytvoříme body reprezentující oba typy zemí. Všimněme si, že geom_point() má svůj vlastní argument mapping. To proto, že chceme barevně rozlišit pouze body, ne úsečky, které je spojují. Díky tomu, že každý geom je možné napojit na jiný zdroj dat, máme velkou kontrolu nad finálním vzhledem grafu.

countries %>% 
  group_by(postsoviet) %>% 
  summarise(across(.cols = c(material_dep, poverty_risk, uni_prc),
                   .fns = mean, na.rm = TRUE)) %>% 
  pivot_longer(cols = -postsoviet) |> 
  ggplot(mapping = aes(x = value, y = name)) +
  geom_line() +
  geom_point(mapping = aes(color = postsoviet), size = 3)

V posledním kroce už jen stačí upravit a lehce doladit vzhled grafu. Hned je patrné, že postsovětské země vedou nad západními v počtu lidí ohrožených chudobou i materiální deprivací a naopak zaostávájí v počtu vysokoškoláků.

26.3 Více zdrojů dat

Jeden graf může být vytvořen z několika dataframů. To se může hodit například v situacích, kdy chceme vytvořit graf obsahující facety zvýrazňující určitou skupinu dat:

Graf výše využívá faktu, že facety recyklují všechna pozorovaní, které nepatří do jedné konkrétní facety. Začneme tím, že vytvoříme nový dataframe countries2, který je téměř stejný jako countries, ale neobsahuje proměnnou di_cat (a rovnou se zbavíme chybějících hodnot):

countries2 <- countries %>% 
  filter(!is.na(di_cat)) %>% 
  select(-di_cat)

Poté vytvoříme bodový graf pro proměnné hdi a life_exp rozdělený do facet podle proměnné di_cat. Zdroj dat ale nespecifikujeme uvnitř funkce ggplot(), ale až ve funkci geom_point(). Jako zdroj dat použijeme countries2. Protože tento dataframe neobsahuje facetovou proměnnou, budou všechny body zobrazeny ve všech facetech:

countries %>% 
  filter(!is.na(di_cat)) %>% 
ggplot(aes(x = hdi, y = life_exp)) +
  geom_point(data = countries2, alpha = 0.1) +
  facet_wrap(~di_cat)

Nyní přidáme druhou vrstvu bodů, tentokrát založenou na dataframu countries. Tento dataframe již facetovou proměnnou obsahuje, takže body budou zobrazeny jen pro relevantní facetu. Také rovnou skryjeme nepotřebnou legendu:

countries %>% 
  filter(!is.na(di_cat)) %>% 
ggplot(aes(x = hdi, y = life_exp)) +
  geom_point(data = countries2, alpha = 0.1) +
  facet_wrap(~di_cat) +
    geom_point(aes(color = di_cat), show.legend = FALSE)