# Loading packages and data import ---------------------------------------- library(tidyverse) set.seed(22) df <- haven::read_sav("https://is.muni.cz/el/fss/podzim2022/PSYn5320/um/datasets/eukids.sav") %>% mutate(across(c(pohlavi, kohorta, narod, ocek_vzd), as_factor)) %>% drop_na(pohlavi, kohorta) df_sml <- sample_n(df, 100) # Základy ------------------------------------------------------------------ # Zkuste vytvořit scatterplot sebehodnocení (selfe) a depresivity (deprese). ggplot(data = df_sml) + geom_point(aes(x = deprese, y = selfe)) # 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ý? ggplot(data = df_sml, aes(x = zn_mat, y = zn_cj)) + geom_point() # Co kdybychom použili pro zachycení vztahu mezi zn_mat a zn_cj jiné geomy: # geom_jitter() nebo geom_count(). Zkuste obojí. ggplot(data = df_sml) + geom_jitter(aes(x = zn_mat, y = zn_cj)) ggplot(data = df_sml) + geom_jitter(aes(x = zn_mat, y = zn_cj), width = 0.1, height = 0.1) ggplot(data = df_sml, aes(x = zn_mat, y = zn_cj)) + geom_point(position = position_jitter(width = 0.1, height = 0.1)) ggplot(data = df_sml) + geom_count(aes(x = zn_mat, y = zn_cj)) + scale_size_continuous(range = c(1, 10)) # Aesthetic mapping ------------------------------------------------------- # 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") 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é? ggplot(df_sml) + geom_point(aes(deprese, zdravi, color = pohlavi)) ggplot(df_sml) + geom_point(aes(deprese, zdravi, color = ziv_sp)) ggplot(df_sml) + geom_point(aes(deprese, zdravi, size = pohlavi)) # Using size for a discrete variable is not advised. ggplot(df_sml) + geom_point(aes(deprese, zdravi, size = ziv_sp)) ggplot(df_sml) + geom_point(aes(deprese, zdravi, shape = pohlavi)) ggplot(df_sml) + geom_point(aes(deprese, zdravi, shape = ziv_sp)) # A continuous variable can not be mapped to shape # 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 ------------------------------------------------------------------ # 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 <- ggplot(data = df_sml) + geom_point(mapping = aes(x = deprese, y = zdravi)) p 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, labeller = label_both) # Souvisí to nějak s tímto grafem? ggplot(data = df_sml) + geom_count(mapping = aes(x = factor(zn_mat), y = factor(zn_cj)), na.rm = T) # Některé kombinace se prostě nevyskytují # Geomy ------------------------------------------------------------------- # 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á). df_sml %>% ggplot(aes(selfe, deprese)) + geom_point(aes(shape = pohlavi)) df_sml %>% ggplot(aes(selfe, deprese)) + geom_smooth(aes(shape = pohlavi)) # Nelze df_sml %>% ggplot(aes(selfe, deprese)) + geom_point(aes(linetype = pohlavi)) # Nelze df_sml %>% ggplot(aes(selfe, deprese)) + geom_smooth(aes(linetype = pohlavi)) df_sml %>% ggplot(aes(selfe, deprese)) + geom_point(aes(group = pohlavi)) df_sml %>% ggplot(aes(selfe, deprese)) + geom_smooth(aes(group = pohlavi)) df_sml %>% ggplot(aes(selfe, deprese)) + geom_point(aes(color = pohlavi)) df_sml %>% ggplot(aes(selfe, deprese)) + geom_smooth(aes(color = pohlavi)) # 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) ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + geom_point() + geom_smooth(mapping = aes(color = pohlavi), show.legend = TRUE) # Default # 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, level = .68) ggplot(data = df_sml, mapping = aes(x = selfe, y = deprese)) + geom_point() + geom_smooth(se = TRUE, level = .99) # 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” ggplot(data = df) + geom_histogram(mapping = aes(x = selfe), binwidth = 0.2, color = "black", fill = "grey") ggplot(data = df_sml) + geom_histogram(aes(x = selfe), binwidth = 0.2, color = "black", fill = "pink") # Tvorba bodového grafu / Scatterplotu # 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í ggplot(data = df, aes(x = selfe, y = optim)) + geom_jitter(mapping = aes(color = pohlavi), width = 0.5, height = 0.5) + geom_smooth(method = lm, color = "black") # 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 ggplot(data = df, aes(x = kohorta, y = monit, fill = pohlavi)) + geom_boxplot(notch = TRUE) ggplot(data = df, aes_string(x = "kohorta", y = "monit", fill = "pohlavi")) + geom_boxplot(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 ggplot(data = df, aes(ocek_vzd, y = stat(prop), fill = pohlavi, group = kohorta:pohlavi)) + geom_bar(position = "dodge") + facet_wrap(~kohorta) + coord_flip() # 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řidejteargument position = dodge. dodge <- position_dodge(width = 0.1) ggplot(df, aes(kohorta, monit, color = pohlavi)) + geom_point(stat = "summary", fun = mean, position = dodge) + geom_line(stat = "summary", fun = mean, aes(group = pohlavi), position = dodge) + geom_errorbar(stat = "summary", fun.data = mean_cl_normal, position = dodge, width = 0.1) # Popisky (labels) -------------------------------------------------------- # Vytvořte jakýkoli graf, který chcete, a nastavte pomocí labs() všechny popisky, # které dovedede změnit. 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 = "To dává smysl", x = "Sebehodnocení", y = "Deprese", color = "Pohlaví", caption = "Data z projektu Cesty do dospělosti") # Wrap up ----------------------------------------------------------------- # 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 použít jakékoli proměnné, které uznáte za vhodné): 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 strip.text = element_text(size = 14, face = "bold"), strip.background = element_rect(fill = "grey90", color = "black") ) # 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. # A také zkuste všechny grafy uložit pomocí ggsave(). # Histogram, ggplot(df, aes(effi, y = stat(density)*0.25)) + geom_histogram(binwidth = 0.25, color = "black", fill = "skyblue") + facet_grid(kohorta ~ pohlavi) + labs(x = "Self-efficacy", y = "Relativní četnost") + scale_x_continuous(breaks = seq(1, 4, by = 0.5)) + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) # Scatterplot s křivkou pro trend, ggplot(df, aes(warm_m, warm_o)) + geom_jitter(aes(color = pohlavi), width = 0.1, height = 0.1) + geom_smooth(method = "lm", color = "black", size = 2, level = .99) + facet_wrap(~kohorta, ncol = 2) + labs(x = "Vřelost matky", y = "Vřelost otce") + scale_x_continuous(breaks = seq(1, 4, by = 0.5)) + scale_y_continuous(breaks = seq(1, 4, by = 0.5)) + scale_color_manual( name = "Pohlaví žáka", labels = c("Chlapci", "Dívky"), guide = guide_legend(override.aes = list(size = 5)), values = c("#1746A2", "#CD104D")) + coord_fixed(xlim = c(1, 4), ylim = c(1, 4)) # Boxplot df %>% pivot_longer(c(duv_r, duv_v), names_to = "kdo", values_to = "duvera") %>% ggplot(aes(pohlavi, duvera, color = kdo)) + geom_boxplot() + facet_wrap(~kohorta) + scale_y_continuous(breaks = seq(0, 5, by = 0.5)) + scale_x_discrete(labels = c("Chlapci", "Dívky")) + scale_color_manual(labels = c("rodičům", "vrstevníkům"), values = c("#3C4048", "#00ABB3")) + labs(x = "Pohlaví", y = "Míra důvěry", color = "Důvěra vůči") + theme(legend.key.width = unit(1, "cm"), legend.key.height = unit(1, "cm")) # Sloupcový graf cetnosti <- df %>% pivot_longer(c(zn_cj, zn_mat, zn_aj), names_to = "predmet", values_to = "znamka") %>% mutate(znamka = factor(znamka), predmet = factor(predmet, levels = c("zn_mat", "zn_cj", "zn_aj"), labels = c("Matematika", "Čeština", "Angličtina")), pohlavi = fct_recode(pohlavi, "Chlapci" = "muzske", "Divky" = "zenske")) %>% count(pohlavi, predmet, kohorta, znamka, .drop = FALSE) %>% drop_na() %>% group_by(pohlavi, kohorta, predmet) %>% mutate(p = n/sum(n)) cetnosti %>% ggplot(aes(znamka, p, fill = pohlavi)) + geom_col(position = "dodge") + facet_grid(kohorta ~ predmet) + scale_y_continuous(breaks = seq(0, 1, by = 0.1), labels = scales::percent_format(), expand = expansion(mult = c(0, 0.1))) + scale_fill_manual(values = c("#364F6B", "#3FC1C9")) + labs(x = "Známka v minulém pololetí", y = "Podíl žáků / žaček", fill = "Pohlaví") # Spojnicový graf pro průměry prumery <- df %>% group_by(pohlavi, kohorta) %>% drop_na(pohlavi, kohorta, effi) %>% summarise(m = mean(effi), sd = sd(effi), n = n()) %>% mutate(se = sd/sqrt(n), me = qt(0.975, df = n-1)*se, ci_lower = m - me, ci_upper = m + me) dodge <- position_dodge(width = 0.1) prumery %>% ggplot(aes(kohorta, m, color = pohlavi)) + geom_point(position = dodge, size = 3) + geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.1, position = dodge) + geom_line(aes(group = pohlavi), position = dodge) + scale_y_continuous(breaks = seq(2, 3, by = .05)) + scale_x_discrete(labels = c("Mladší", "Starší")) + scale_color_manual(labels = c("Chlapci", "Dívky"), values = c("#08D9D6", "#FF2E63")) + labs(x = "Kohorta", y = "Průměrná Self-efficacy", color = "Pohlaví", caption = "Chybové úsečky znázorňují 95% interval spolehlivosti.") + theme(legend.key.width = unit(1, "cm"))