%>%
countries count(postsoviet) %>%
ggplot(aes(x = 1, y = n, fill = postsoviet)) +
geom_col(position = "stack")
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:
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):
<- countries %>%
countries2 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)