25  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.

25.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")

25.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.

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 převedeme do dlouhého formátu a poté zpět do širšího. Spočítáme rozdil mezi oběma skupinami pro každou z proměnných a nakonec dáme sloupcům lepší názvy:

countries %>% 
  group_by(postsoviet) %>% 
  summarise(across(.cols = c(material_dep, poverty_risk, uni_prc),
                   .fns = mean, na.rm = TRUE)) %>% 
  pivot_longer(cols = -postsoviet) %>% 
  pivot_wider(names_from = postsoviet, values_from = value) %>%
  mutate(diff = yes-no) %>% 
  rename(western = no,
         postsoviet = yes)
# A tibble: 3 × 4
  name         western postsoviet    diff
  <chr>          <dbl>      <dbl>   <dbl>
1 material_dep   0.137      0.239  0.102 
2 poverty_risk   0.223      0.264  0.0419
3 uni_prc        0.320      0.249 -0.0705

Druhým krokem je vytvořením grafu obsahujícím úsečku spojujícím obě skupiny. Pro vytvoření úsečky využijeme funkce geom_segment(), které vyžaduje čtyři argumenty: x, xend, y a yend.

countries %>% 
  group_by(postsoviet) %>% 
  summarise(across(.cols = c(material_dep, poverty_risk, uni_prc),
                   .fns = mean, na.rm = TRUE)) %>% 
  pivot_longer(cols = -postsoviet) %>% 
  pivot_wider(names_from = postsoviet, values_from = value) %>%
  mutate(diff = yes-no) %>% 
  rename(western = no,
         postsoviet = yes) %>% 
  ggplot(aes(y = name)) +
  geom_segment(aes(x = western, xend= postsoviet, yend = name), size = 4)

V posledním kroce přidáme body na každou stranu úsečky. Protože průměr každé skupiny je samostatné proměnná, budeme muset použít dvě vrstvy geomů. Dále také budeme muset ručně definovat dimenzi barvy, pro správné vytvoření legendy. Nakonec jen upravíme popisky:

25.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)