# Balíčky a Import dat ------------------------- library(tidyverse) df <- haven::read_sav("data/eukids.sav") %>% mutate(across(c(pohlavi, kohorta, narod, ocek_vzd), as_factor)) %>% drop_na(pohlavi, kohorta) set.seed(22) df_sml <- sample_n(df, 100) # Použití balíčku ggplot2 ------------------------------- # ggplot(data = POUŽITÝ_DATASET) + # GEOM_FUNKCE(mapping = aes()) ggplot(data = df_sml) + geom_point(aes(x = deprese, y = zdravi)) ggplot(df_sml) + geom_point(aes(deprese, zdravi)) ggplot(data = df_sml) + geom_point(aes(x = deprese, y = zdravi), size = 3, shape = 18) # 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í. # Estetické mapování (aesthetic mapping) -------------------------------------- ggplot(data = df_sml) + geom_point(mapping = aes(x = deprese, y = zdravi, color = pohlavi)) ggplot(data = df_sml) + geom_point(mapping = aes(x = deprese, y = zdravi, size = pohlavi)) 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) ggplot(data = df_sml) + geom_point(mapping = aes(x = deprese, y = zdravi), color = "blue", size = 3) # 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. # https://r-charts.com/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") # Typ čáry pak můžeme nastavit pomocí argumentu linetype 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, "")), nudge_x = -0.1)+ geom_text(aes(label = if_else(x == 2, nms, "")), nudge_x = 0.1) # 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")) # 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)) # Fazety (facets) --------------------------------------------------- # Základní graf si uložíme do objektu p p <- ggplot(data = df_sml) + geom_point(mapping = aes(x = deprese, y = zdravi)) p + facet_wrap(~kohorta, nrow = 2) # dva řádky p + facet_wrap(~kohorta, ncol = 2) # dva sloupce p + facet_wrap(~kohorta + pohlavi, nrow = 2) p + facet_grid(kohorta ~ pohlavi) # řádky ~ sloupce p + facet_grid(pohlavi ~ kohorta) # řádky ~ sloupce # 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) p + facet_wrap(~optim) # 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) # Geometrické objekty (geomy) --------------------------------- # 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)) # Použití více geomů 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() 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 # Co se stane, když nastavíme argument show.legend = FALSE 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) # Tvorba grafů “od píky” -------------------------------------- # * 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. # Popisky (labels) ------------------------------------- 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") ggplot(df_sml, aes(selfe, deprese, color = pohlavi)) + geom_point() + geom_smooth(se = FALSE, method = lm) 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") 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") # Škály (scales) ------------------------------------- ggplot(df_sml, aes(selfe, deprese)) + geom_point(aes(colour = pohlavi)) + scale_x_continuous() + scale_y_continuous() + scale_colour_discrete() # 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)) # 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")) 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á "#0000FF")) # modrná ggplot(df_sml, aes(optim, zdravi, color = pohlavi)) + geom_point() + scale_color_manual(name = "Pohlaví", labels = c("Chlapci", "Dívky", "Neuvedeno"), values = c("#FF0000", "#0000FF"), guide = guide_legend(override.aes = list(size = 5))) # Design nedatových prvků grafu (themes) ------------------------------------- # 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() # Custom theme 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 ) 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 # 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 # Staré theme můžeme vrátit pomocí: # theme_set(old) # Uložení (export) grafu ------------------------------------------- ggsave(filename = "plots/sp_deprese_zdravi.png", # Nově vytvořený soubor plot = p, # Graf, který chceme uložit dpi = 300, # Rozlišení width = 19, # šířka height = 10, # Výška units = "cm")