1 Načtení balíčků

Kromě balíčku tidyverse, jehož součástní je i balíček ggplot2, určený k tvorbě grafů, budeme používat také balíček Cairo. Pokud jej nemáte nainstalovaný, udělejte to např. pomocí install.packages("Cairo")

library(tidyverse)

2 Import dat

K procvičování tvorby použijeme stará dat z Cest do dospělosti, se kterými jste se možná setkali ve Statistice II. Vytvoříme si i menší dataset df_sml, obsahující 100 náhodně vybraných případů.

set.seed(22)
df <- haven::read_sav("data/eukids.sav") %>% 
  mutate(across(c(pohlavi, kohorta, narod, ocek_vzd), as_factor)) %>% 
  drop_na(pohlavi, kohorta)
df_sml <- sample_n(df, 100)

3 Použití balíčku ggplot2

Jedním z nesnandnějších způsobů, jak v R vytvářet grafy, je balíček ggplot2. Jeho filozofie je taková, že dělí graf na tři základní části:

graf = použitá data + estetické mapování + geometrický tvar

Hlavní funkce balíčku se jmenuje podobně jako samotný balíček, a to ggplot. Obecně grafy vytváříme tímto kódem:

ggplot(data = POUŽITÝ_DATASET) + 
  GEOM_FUNKCE(mapping = aes(<MAPOVÁNÍ PROMĚNNÝCH>))

Pro ukázku SI vytvoříme bodový graf (scatter plot) depresivity (deprese) a psychosomatických požítí (zdravi).

ggplot(data = df_sml) +
  geom_point(aes(x = deprese, y = zdravi))

Jak můžeme vidět, prvním argumentem samotné funkce ggplot() je použitý dataset. pak následuje výraz + a volba “geometrické” funkce k tvorbě grafu (těch je více a budeme si je postupně ukazovat). Pro tvorbu bodového grafu použijeme geom_point(). Nakonec v samotné funkci geom_point() upřesními uvnitř funkce aes(), jaké proměnné se mají mapovat na jakou osu/škálu grafu. Jména proměnných přitom specifikujeme bez uvozovek. Kdybychom chtěli specifikovat jména proměnných v uvozovkách jako “strings”, musíme použít funkci aes_string().

ggplot(data = df_sml) +
  geom_point(aes_string(x = "deprese", y = "zdravi"))

Funkce geom_point má více argumentů, např. size, kterým specifikujeme velikost bodů, nebo shape, kterým specifikujeme tvar bodů:

ggplot(data = df_sml) +
  geom_point(aes(x = deprese, y = zdravi), size = 3, shape = 18)

3.0.1 Cvičení

  • Zkuste vytvořit scatterplot sebehodnocení (selfe) a depresivity (deprese).
  • Co se stane, když vytvoříme scatterplot známek z matematiky (zn_mat) a češtiny (zn_cj). Proč není takový scatterplot moc užitečný?
  • Co kdybychom použili pro zachycení vztahu mezi zn_mat a zn_cj jiné geomy: geom_jitter() nebo geom_count(). Zkuste obojí.

4 Estetické mapování (aesthetic mapping)

Informace obsažené v datech můžeme v grafu vyjádřit různým způsobem: hodnoty či úrovně proměnných “mapujeme” na různé “škály”. Například při tvorbě bodového grafuje mapujeme dvě proměnné (níže v grafu depresivitu a psychosomatické symptomy) na prostorové osy X a Y. Ale můžeme zachytit i další informace o jednotlivých “případech”, např. pohlaví respondentů pomocí diskrétní barevné škály, a to argumentem color v rámci funkce aes().

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi, color = pohlavi))

Podobně bychom mohli mapovat informace o pohlaví nebo jiné proměnné na škálu velikosti čili vyjádřit úroveň proměnné pomocí velikosti bodů v grafu.

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi, size = pohlavi))

Tady je ale důležité upozornit na to, že mapovat vyjádřit úrovně nominální proměnné, nemající přirozené pořadí, pomocí velikost není dobrá praxe, ale jde to, když si o to řekneme.

Dále bychom mohli vyjádřit pohlaví pomocí míry průhlednosti (argument alpha) nebo tvaru bodů argument (shape).

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi, alpha = pohlavi),
             size = 3)


ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi, shape = pohlavi),
             size = 3)

Estetické vlastnosti geomů rovněž můžeme nastavit ručně. Kdybychom např. chtěli, ať jsou všechny body v grafu modře a jsou větší, můžeme argumenty color a size použít mimo funkci aes() a přímo specifikovat konkrétní barvu a velikost.

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi), 
             color = "blue", size = 3)

V takovém případě pak barva ani velikost nenese informace o nějaké proměnné, ale pouze jsme změnili vzhled všech bodů v grafu.

  • Velikost bodů tedy můžeme nastavit uvedením jakéhokoli kladného čísla. Pro výběr barvy (color) můžeme použít její název v podobě textu v závorkách (string). Zde je přehled všech barev v R, které mají vlastní název a je možné se na ně takto odkázat. Názvy všech 657 barev si můžeme také získat pomocí funkce colors().
  • Velikost (v milimetrech) můžeme nastavit arugmentem size.
  • Míru neprůhlenosti (od 0 do 1) můžeme nastavit argumentem alpha.
  • Nastavit tvar bodů pomocí argumentu shape, např. uvedením čísla (viz níže).
shapes_df <- tibble(
  id = 0:25, # čísla
  x = rep(1:13, 2),
  y = rep(1:2, each = 13)
)

# Přehled tvarů
ggplot(shapes_df, aes(x, factor(y), shape = factor(id))) +
  geom_point(size = 5, fill = "red") +
  scale_shape_manual(values = 0:25) +
  geom_text(aes(label = id), nudge_y = 0.1) +
  theme_void() +
  theme(legend.position = "none")

Některé tvary vypadají podobně, ale u těch, které jsou červené, lze nastavit samostatně barvu obrysu (color) a barvu výplně (fill).

  • Typ čáry pak můžeme nastavit pomocí argumentu linetype. Typ čary pak stanovujeme pomocí čísla od 0 do 6 (např. linetype = 3) nebo textu (např. linetype = "dotted"). Níže v grafu je přehled různých typů čar.
linetype_df <- tibble(
  y = rep(0:6, each = 2) %>% factor(),
  x = rep(1:2, times = 7),
  nms = c("blank", "solid", "dashed", "dotted",
          "dotdash", "longdash", "twodash") %>% rep(each = 2)
)

linetype_df %>% 
  ggplot(aes(x, y, group = y, linetype = y)) +
  geom_line(size = 2) +
  scale_linetype_manual(values = 0:7) +
  theme_void() +
  theme(legend.position = "none") +
  geom_text(aes(label = if_else(x == 1, y, NULL)), nudge_x = -0.1)+
  geom_text(aes(label = if_else(x == 2, nms, NULL)), nudge_x = 0.1)

4.0.1 Cvičení

V kódu níže je chyba. Body nejsou vybarveny modře. Opravte ji, aby byly.

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi,  color = "blue"))

Vytvořte graf deprese (na ose X) a zdravi s využitím menšího datasetu df_sml. Pak postupně “mapujte” pohlaví na barvu, velikost a tvar. Pak totéž zkuste udělat pro proměnnou ziv_sp (také ji mapovat na barvu, velikost a tvar). Pohlaví je kategorická proměnná a životní spokojenost spíš spojitá. Jak se tyto různé estestické provky chovají jinak pro kategorická a spojité proměnné?

Co se stane, když mapujeme tutéž proměnnou na různé estitické prvky?

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi, color = ziv_sp, size = ziv_sp))

Co se stane, když při mapování nepoužijeme přímo jméno nějaké proměnné, ale např. ziv_sp < 2.5.

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi, color = ziv_sp < 2.5))

5 Fazety (facets)

Ukázali jsme si, že jedním ze způsobů, jak vyjádřit úrovně proměnných, je pomocí estetických vlastností grafu. Další ze způsobů, který se hodí zejména pro kategorické proměnné, je rozdělit graf na fazety, což jsou vlastně samostatné grafy pro různé subsety dat. K tomu můžeme použít funkci facet_wrap, a následujícím způsobem, kdybycho chtěli samostatné grafy v závislosti na proměnné kohorta

# Základní graf si uložíme do objektu p
p <- ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi))
p


p + facet_wrap(~kohorta, nrow = 2) # dva řádky


p + facet_wrap(~kohorta, ncol = 2) # dva sloupce

Mohli bychom chtít graf rozdělit i podle úrovní dvou proměnných, např. kohorty i pohlaví, což bychom provedli takto:

p + facet_wrap(~kohorta + pohlavi, nrow = 2)

Kromě toho má balíček ggplot2 i funkci facet_grid(), která se hodí tehdy, když chceme graf rozdělit na řádky podle úrovní jedné proměnné a na sloupce podle úrovní druhé proměnné.

p + facet_grid(kohorta ~ pohlavi) # řádky ~ sloupce


p + facet_grid(pohlavi ~ kohorta) # řádky ~ sloupce

5.0.1 Cvičení

Co se stane, pokud jako fazetu zvolíme spojitou proměnnou nebo jednoduše proměnnou s mnoha úrovněmi. Zkuste to udělat pro proměnnou optim (optimismus)

Proč jsou v tomto grafu některé fazety prázdné?

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = deprese, y = zdravi)) + 
  facet_grid(zn_mat ~ zn_cj)

Souvisí to nějak s tímto grafem?

ggplot(data = df_sml) + 
  geom_count(mapping = aes(x = zn_mat, y = zn_cj))

6 Geometrické objekty (geomy)

Geom je geometrický objekt, který slouží v grafu k reprezentaci dat. Často se různé typy grafů nazývají podle toho, jaké geomy používají. Sloupcové grafy např. používají sloupce, bodové grafy body, spojnicové grafy úsečky, boxploty “krabice” apod. Můžeme si ukázat, jak lze data a vztahy reprezentovat pomocí různých geomů.

# Pomocí bodů, s využitím geom_point()
ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = selfe, y = deprese))


# Pomocí křivky, s využitím geom_smooth()
ggplot(data = df_sml) + 
  geom_smooth(mapping = aes(x = selfe, y = deprese))

Každá geometrická funkce (geom function) v ggplot() vyžaduje specifikaci estetického mapování, tj. toho, prostřednictvím čeho mý být vajádřena která proměnná. Každý geom má ale omezený počet estetických vlastností, na které lze proměnnou mapovat, můžeme např. nastavit “tvar” (shape) bodů (point), ale nikoli “tvar” křivek. U křivek ale můžeme naopak nastavit typ čar (linetype), zatímco u bodů nikoli.

6.0.1 Cvičení

Zachyťte vztah mezi sebehodnocením (selfe) a depresivitou (deprese) pomocí dvou typů grafů/geomů: geom_point() a geom_smooth(). Pro každý z těchto typů grafů mapujte pohlaví (pohlavi) postupně na shape, linetype, group a color? Na které estetické parametry jde pohlaví mapovat (a na které nikoli) v závislosti na typu geomu (protože daný geom tyto estetické parametry nemá).

6.1 Použití více geomů

V jednom grafu můžeme zobrazit více geomů. Stačí použít více funkcí typu geom_, např. takto bychom vyjádřili vztah mezi sebehodnocením a depresivitou jak pomocí bodů, tak křivky:

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = selfe, y = deprese)) +
  geom_smooth(mapping = aes(x = selfe, y = deprese))

To ale vede ke zbytečné duplicitě. Proto lze mapování proměnných na grafické parametry grafu nastavit přímo ve funkci ggplot(), Pokud tak učiníme, všechny použité geom_ funkce toto nastavení převezmou (pokud jej nepřepíšeme). Tyto dva příkazy tedy vedou k totožným grafům, ale v druhém z nich jsme se zbavili duplicity v kódu:

ggplot(data = df_sml) + 
  geom_point(mapping = aes(x = selfe, y = deprese)) +
  geom_smooth(mapping = aes(x = selfe, y = deprese))


ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + 
  geom_point() + 
  geom_smooth()

Pokud mapování nastavíme v jedné funkci geom_, ale v ostatních nikoli, ovlivní to grafické parametry pouze jednoho geomu. Můžeme si vyzkoušet, jak bude graf vypadat, pokud pohlaví mapujeme na barvu jen v rámci geom_point a pak jen v rámci geom_smooth:

ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + 
  geom_point(mapping = aes(color = pohlavi)) + # mapovat pohlaví na barvu jen pro body
  geom_smooth()


ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + 
  geom_point() + 
  geom_smooth(mapping = aes(color = pohlavi)) # mapovat pohlaví na barvu jen pro křivku

6.1.1 Cvičení

Zkuste odhadnout, jaký graf získáme, když spustíme následující kód. Pro informaci: obě proměnné, monitorování (motiv) i důvěra vůči rodičům (duv_r), jsou spojité.

ggplot(data = df_sml, mapping = aes(x = monit, y = duv_r)) + 
  geom_point() +
  geom_smooth()

Co se stane, když nastavíme argument show.legend = FALSE? Co se stane, když jej odstraníme nebo nastavíme na TRUE? Vyzkoušejte si to.

ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + 
  geom_point() +
  geom_smooth(mapping = aes(color = pohlavi),
              show.legend = FALSE)

K čemu slouží argument se ve funkci geom_smooth()? Vyzkoušejte.

ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + 
  geom_point() +
  geom_smooth(se = FALSE)


ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + 
  geom_point() +
  geom_smooth(se = TRUE)

7 Tvorba grafů “od píky”

Pracujte s kompletním datasetem df a po krocích vytvářejte jednotlivé grafy, abyste hned zachytili, kdyby se něco “pokazilo”, viděli, jak se graf postupně mění, když rozšiřujeme kód.

  • Tvorba histogramu
    • Vytvořte histogram selfe pomocí geom_histogram()
    • šírku sloupců (binwidth) nastavte na 0.2
    • barvu (color) na “black”
    • a výplň (fill) na “grey”
  • Tvorba bodového grafu / Scatterplotu
    • Nejprve z dat vyřaďte případy s chybějící hodnotou v pohlavi
    • Vytvořte scatteplot selfe a optim pomocí geom_jitter()
    • v geom_jitter() nastavte argumenty width i height na 0.05
    • přidejte geom geom_smooth()
    • v rámci toho nastavte method = “lm” a color = “black”
    • nastavte barvu bodů (ale nikoli křivky) podle pohlaví
  • Tvorba krabicového grafu / boxplotu
    • Nejprve z dat vyřaďte případy s chybějící hodnotou v kohorta a pohlavi
    • Vytvořte boxplot monit pomocí geom_boxplot()
    • na osu X dejte kohorta a na osu Y monit
    • nastavte výplň (fill) podle pohlavi
    • v geom_boxplot() nastavte argument notch = TRUE
  • Tvorba sloupcového grafu / barplotu
    • Vyřaďte respondenty, kteří neuvedli kohortu anebo pohlaví.
    • pomocí geom_bar() vytvořte sloupcový graf ocek_vzd
    • prohoďte osy přidáním: + coord_flip()
    • pomocí facet_wrap() rozdělte graf na dva řádky podle kohorty
    • nastave výplň (fill) podle pohlaví
    • do estetického mapování přidejte: y = stat(prop), group = kohorta:pohlavi
  • Tvorba spojnicovového grafu / line plot
    • Vyřaďte respondenty, kteří neuvedli kohortu anebo pohlaví
    • na osu X dejte kohortu, na osu Y monitorování
    • na barvu mapujte pohlaví
    • přidejte geom_point(stat = "summary", fun = mean)
    • přidejte geom_line(stat = "summary", fun = mean, aes(group = pohlavi))
    • přidejte geom_errorbar(stat = "summary", fun.data = mean_cl_normal)
    • v rámci geom_errorbar() si pohrajte s argumentem width – zkuste jej nastavit na různé hodnoty, např. 1, 0.5 nebo 0.1.
    • definutje objekt dodge <- position_dodge(width = 0.1) a do všech funkcí geom_ přidejte argument position = dodge.

8 Popisky (labels)

Pokud vytváříme pouze explorační grafy pro vlastní potřebu, nemusíme si s popisky příliš lámat hlravu. Ale pokud grafy budeme někde prezentovat, měli bychom vhodné popisky určitě nastavit. Přidat je můžeme pomocí funkce labs(). Například titulek grafu lze nastavit takto, pomocí argumentu title v rámci labs().

ggplot(df_sml, aes(selfe, deprese, color = pohlavi)) +
  geom_point() +
  geom_smooth(se = FALSE, method = lm) +
  labs(title = "Depresivita klesá s rostoucím sebehodnocením")

Pomocí argumentu subtitletaké můžeme přidat podtitulek, který bude uveden menším písmem pod samotným titulkem, a pomocí argumentu caption můžeme přidat poznámku, kerá bude umístěna vpravo dole.

ggplot(df_sml, aes(selfe, deprese, color = pohlavi)) +
  geom_point() +
  geom_smooth(se = FALSE, method = lm) +
  labs(
    title = "Depresivita klesá s rostoucím sebehodnocením",
    subtitle = "Tento vztah je silnější u dívek",
    caption = "Data z projektu Cesty do dospělosti"
  )

Dále můžeme pomocí labs() změnit popisky osy X i Y anebo jiných škál, zde např. barvy, která vyjadřuje pohlaví žáka.

ggplot(df_sml, aes(selfe, deprese)) +
  geom_point(aes(color = pohlavi)) +
  geom_smooth(se = FALSE, method = lm) +
  labs(
    x = "Sebehodnocení (RSES)",
    y = "Depresivita (ADS)",
    color = "Pohlaví žáka"
  )

8.0.1 Cvičení

Vytvořte jakýkoli graf, který chcete, a nastavte pomocí labs() všechny popisky, které dovedede změnit.

9 Škály (scales)

Další možností, jak vylepšit graf, je upravení podoby škál. Škály určují, jakým způsobem budou data zobrazeny. Defaultní chování balíčku ggplot2 je takové, že automaticky určí vhodný typ škály a sám je přidá. Když například vytvoříme scatterplot tímto kódem:

ggplot(df_sml, aes(selfe, deprese)) +
  geom_point()

automaticky rozpozná, že proměnné mapované na osu X a Y (selfe a deprese) jsou spojité spojité proměnné, zatímco pohlaví je kategorická, takže přidá vhodné škály, aniž bychom je museli takto ručně definovat:

ggplot(df_sml, aes(selfe, deprese)) +
  geom_point(aes(colour = pohlavi)) +
  scale_x_continuous() +
  scale_y_continuous() +
  scale_colour_discrete()

Funkce pro výběr škál vždy začínají slovem “scale_”, pak následuje název estetického prvku (nap.ř x, y, color, fill, alpha, linetype, shape apod.) a na konec typ škály:

  • spojitá čili continuous,
  • diskrétní čili discrete,
  • pro datum a čas čili datetime,
  • nebo pro datu čili date.

První, co můžeme na škále změnit, je vzhled osových značek (ticks) a popisků hodnot na osách. Pomocí argumentu breaks kontrolujeme, kde mají být umístěny osové značky, a pomocí argumentu labels měníme popisky hodnot na škálách.

Dejte tomu, že nám nevyhovuje defaultní podoba grafu, a chtěli bychom, aby osové značky na ose X byly vždy ob jednu hodnotu. S využitím funkce seq() můžeme breaks přepsat takto:

# Funkce seq vytváří sekvenci čísel od – do s určeným přírůstkem (by)
seq(8, 26, by = 2)
#>  [1]  8 10 12 14 16 18 20 22 24 26

# Defaultní graf
ggplot(df_sml, aes(optim, zdravi)) +
  geom_point()


# Změna osových značek osy X a Y
ggplot(df_sml, aes(optim, zdravi)) +
  geom_point() +
  scale_x_continuous(breaks = seq(8, 26, by = 2)) +
  scale_y_continuous(breaks = seq(15, 35, by = 2.5))

Změna popisků hodnot využijeme spíš pro diskrétní škály, například pokud bychom pohlaví mapovali na diskrétní škálu barvy a chtěli změnit popisky kategorií, můžeme to udělat následovně. Samotný popis škály jde kromě funkce labs() změnit i ve funkci v rámci funkce scale_, a to pomocí argumentu name.

# Defaultní graf
ggplot(df_sml, aes(optim, zdravi, color = pohlavi)) +
  geom_point()


# Změna popisků úrovní pro proměnnou mapovanou na diskrétní barevnou škálu
ggplot(df_sml, aes(optim, zdravi, color = pohlavi)) +
  geom_point() +
  scale_color_discrete(name = "Pohlaví",
                       labels = c("Chlapci", "Dívky", "Neuvedeno"))

Není také problém změnit, jakými barvami mají být jednotlivé úrovně nějaké diskrétní proměnné reprezentovány. Na výběr máme nejen z předem definovaných názvů barev, ale můžeme barvy specifikovat pomocí hexadecimálních kódů, což jsou šestimístné kódy používající šestnáctkovou soustavu k určení poměru červené, zelené a modré. Musíme ale místo scale_color_discrete() použít scale_color_manual a pak barvy specifikovat pomocí argumentu values jako textový vektor (který musí mít alespoň tolik prvků, kolik má daná proměnná úrovní).

ggplot(df_sml, aes(optim, zdravi, color = pohlavi)) +
  geom_point() +
  scale_color_manual(name = "Pohlaví",
                     labels = c("Chlapci", "Dívky", "Neuvedeno"),
                     values = c("#FF0000", # červená
                                "#00FF00", # zelená
                                "#0000FF")) # modrná

Zkuste navštívit https://colorhunt.co/ a pozměnit barevnou paletu grafu výše. Vyberte si barvy, které se vám líbí.

Jak si dále můžete všimnout, vzhled legendy odpovídá nastavení grafu, např. body v legendě mají stejnou barvu a velikost. Pro lepší čitelnost legendy ale můžeme toto nastavení přepsat pomocí guide = guide_legend(override.aes = list()). Kdybychom například chtěli, aby body v legendě byly větší než v samotném grafu, můžeme to udělat takto:

ggplot(df_sml, aes(optim, zdravi, color = pohlavi)) +
  geom_point() +
  scale_color_manual(name = "Pohlaví",
                     labels = c("Chlapci", "Dívky", "Neuvedeno"),
                     values = c("#FF0000", # červená
                                "#00FF00", # zelená
                                "#0000FF"),
                     guide = guide_legend(override.aes = list(size = 5)))

10 Design nedatových prvků grafu (themes)

Design nedatových prvků grafu můžeme měnit pomocí funkce(). ggplot2 obsahuje i několik kompletních grafických schémat, které můžeme na graf aplikovat takto:

# Defaultní graf
p <- ggplot(df_sml, aes(deprese, zdravi)) +
  geom_point(aes(color = pohlavi)) +
  geom_smooth(se = FALSE)
p


# Různá grafická schémata
p + theme_bw()

p + theme_classic()

p + theme_dark()

p + theme_grey() # Default

p + theme_light()

p + theme_linedraw()

p + theme_minimal()

p + theme_void()

Pokuc bychom nechtěli používat tato předdefinovaná schémata, můžeme použít pomocí funkce theme() specifikovat nepřeberné množství různých parametrů. Zkuste se podívat na nápovědu pomocí ?theme(), kolik možností se nabízí. Zde je jenom na ukázku změna několika grafických prvků.

# Takto
p + 
  theme(
    text = element_text(size = 14), # Zvětšit veškerý text
    axis.title = element_text(face = "bold"), # Názvy os tučně
    legend.title = element_text(face = "bold"), # titulek legendy tučně
    panel.background = element_blank(), # Odsranit barevné pozadí
    axis.line = element_line(colour = "black"), # Přidat černé ohraničení os
    legend.key = element_blank(), # Klíč legendy bez barevného pozadí
    legend.position = "top", # Umístění legendy nahoru
    legend.text = element_text(size = 14) # Klíč legendy větším písmem
    )


# Nebo takto, kdy si theme nejprve uložíme do objektu my_theme
# a pak tento objektu můžeme přidávat k jakémukoli grafu
my_theme <-   theme(
    text = element_text(size = 14), # Zvětšit veškerý text
    axis.title = element_text(face = "bold"), # Názvy os tučně
    legend.title = element_text(face = "bold"), # titulek legendy tučně
    panel.background = element_blank(), # Odsranit barevné pozadí
    axis.line = element_line(colour = "black"), # Přidat černé ohraničení os
    legend.key = element_blank(), # Klíč legendy bez barevného pozadí
    legend.position = "top", # Umístění legendy nahoru
    legend.text = element_text(size = 14) # Klíč legendy větším písmem
    )

p + my_theme

Chceme-li použít jedno z komletních grafických schémat (např. theme_bw()) pro více grafů nebo pro všechny vytvořené grafy, nemusíme ke každému grafu přidávat + theme_bw(). Jednodušší je použít funkci theme_set(). Můžeme si původní theme uložit do objektu s libovolným názvem (např. old) a zároveň nastavit, ať se grafické schéma theme_bw() použije pro všechny další vytvořené grafy

# Tímto uložíme původní grafické schéma do objektu old a zároveň nastavíme
# pro všechny další grafy schéma theme_bw()
old <- theme_set(theme_bw())
p

Kdyby nás theme_bw() omrzelo, můžeme vráti původní schéma jednoduše opět pomocí theme_set()

# Zpátky k původnímu schématu, které jsme si uložili do objektu old
theme_set(old)
p

Můžeme si také nastavit vlastní desing pomocí funkce theme_update(). Tím vlastně pozměníme jen vybrané prvky aktuálního grafického schématu (ostatní zůstanou beze změny). Takto se vyhneme tomu, abychom např. ke každému grafu přidávali vždy + my_theme

# Původní grafické schéma je uloženo do objektu old
# A zároveň updatujeme některé jeho prvky
old <- theme_update(
    text = element_text(size = 14), # Zvětšit veškerý text
    axis.title = element_text(face = "bold"), # Názvy os tučně
    legend.title = element_text(face = "bold"), # titulek legendy tučně
    panel.background = element_blank(), # Odsranit barevné pozadí
    axis.line = element_line(colour = "black"), # Přidat černé ohraničení os
    legend.key = element_blank(), # Klíč legendy bez barevného pozadí
    legend.position = "top", # Umístění legendy nahoru
    legend.text = element_text(size = 14) # Klíč legendy větším písmem
) 
# Všechny grafy teď budou mít updatované schéma
p


# pokud nevrátíme původní pomocí theme_set(old)

11 Uložení (export) grafu

Často také potřebujeme si graf exportovat. To můžeme prostřednictvím funkce ggsave(), která obsahuje tyto hlavní argumenty:

  • filename: Cesta + název nově vytvořeného souboru. Jediný argument, který je nutné specifikovat.
  • plot: Graf, který chceme uložit. Pokud nespecifikujeme, uloží se naposledy vytvořený graf.
  • device: Formát souboru. Doporučuji “png” nebo “tiff” kvůli bezztrátové kompresi.
  • type: Použitá grafická knihovna/balíček pro tvorbu grafu. “cairo” produkuje asi nejkvalitnější grafy.
  • width a height: Rozměry grafu.
  • units: V jakých jednotkách chceme rozměry specifikovat.
ggsave(filename = "plots/sp_deprese_zdravi.png", # Nově vytvořený soubor
       plot = p, # Graf, který chceme uložit
       dpi = 300, # Rozlišení
       device = "png", # Formát
       type = "cairo", # 
       width = 19, # šířka
       height = 10, # Výška
       units = "cm")

11.0.1 Cvičení

Podívejte se znovu na proměnné v datasetu:

x <- df %>% 
  select(pohlavi:neshody) %>% 
  map(attributes) %>% 
  map_chr("label")

tibble(
  name = names(x),
  label = x
) %>% 
  print(n = Inf)

Vybertes si z nich ty, které vás zajímají, a zkuste vytvořit hlavní typy grafů (můžete vždy použít jiné proměnné), především:

  • histogram,
  • scatterplot s křivkou pro trend,
  • boxplot,
  • sloupcový graf,
  • spojnicový graf pro průměry.

Zkuste vždy nastavit barvu (color) nebo výplň (fill) podle nějaké kategorické proměnné (nejvíce se nabízí pohlaví a kohorta) a graf “vylepšit” do podoby, kdy byste jej považovali za hodný publikace. Nakonec zkuste všechny grafy uložit pomocí ggsave().