class: center, middle, inverse, title-slide # Obrada podataka ## Predavanje 4 (dodatak): Osnove ggplot2 vizualizacijskog sustava ### Luka Šikić, PhD ### Fakultet hrvatskih studija |
OP
--- # PREGLED PREDAVANJA <br> <br> <br> <br> 1. [ggplot2](#ggplot2) --- class: inverse, center, middle name: ggplot2 # ggplot2 <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html> (Najbolji sustav za vizualizaciju podataka na svijetu!) --- # Instaliraj i učitaj Isprobajte [ggplot2](https://ggplot2.tidyverse.org/) (i.e. livecoding). <br> <br> Ako već niste, instalirajte `ggplot2` i `gapminder` pakete via: <br> <br> - **Konzola:** Unesite `install.packages(c("ggplot2", "gapminder"), dependencies=T)`. - **RStudio:** Kliknite"Packages" tab u donjem desnom prozoru. Potom kliknite "Install" i potražite ova dva paketa. ![](pics/install.gif) --- # Instaliraj i učitaj (dalje) Kada su paketi instalirani, učitajte ih u R sesiju sa `library()` funkcijom ```r library(ggplot2) library(gapminder) ## Za gapminder podatke ``` ``` ## Warning: package 'gapminder' was built under R version 4.0.3 ``` Nisu potrebni navodnici za učitavanje. Razlog: R sada prepoznaje ove pakete kao definirane objekte sa danim imenima. ("Sve je objekt i sve ima naziv!") -- PS — Prigodno je moguće instalirati pakete sa [pacman](https://github.com/trinker/pacman) `p_load()` funkcijom. Ako izvršite `pacman::p_load(ggplot, gapminder)` funkcija će prvo pogledati da li paketi postoje i da li ih treba instalirati prije učitavanja. Pametno!. - Također je moguće koristiti paket bez učitavanja kroz naredbu `PACKAGE::package_function()`. --- # Gapminder podatci Koristiti ćemo [gapminder](https://github.com/jennybc/gapminder) podatkovni skup. Ovi podatci su strukturirani kao panel podatci o očekivanoj dugovječnosti, veličini populacije, i BDP-u za 142 zemlje od 1950-ih. ```r gapminder ``` ``` ## # A tibble: 1,704 x 6 ## country continent year lifeExp pop gdpPercap ## <fct> <fct> <int> <dbl> <int> <dbl> ## 1 Afghanistan Asia 1952 28.8 8425333 779. ## 2 Afghanistan Asia 1957 30.3 9240934 821. ## 3 Afghanistan Asia 1962 32.0 10267083 853. ## 4 Afghanistan Asia 1967 34.0 11537966 836. ## 5 Afghanistan Asia 1972 36.1 13079460 740. ## 6 Afghanistan Asia 1977 38.4 14880372 786. ## 7 Afghanistan Asia 1982 39.9 12881816 978. ## 8 Afghanistan Asia 1987 40.8 13867957 852. ## 9 Afghanistan Asia 1992 41.7 16317921 649. ## 10 Afghanistan Asia 1997 41.8 22227415 635. ## # ... with 1,694 more rows ``` --- # Elementi ggplot2 [Hadley Wickham-ov](http://hadley.nz/) ggplot2 je vjerojatno najpoznatiji R paket. - Paket je napravljen na vizualizacijskoj teoriji: i.e. Leland Wilkinson [*The Grammar of Graphics*](https://www.amazon.com/Grammar-Graphics-Statistics-Computing/dp/0387245448). Ključni elementi ggplot2 pristupa su: 1. Grafikon ("vizualizacija") je vezana uz varijable ("podatke") kroz **aesthetic mappings**. 2. Kada se definiraju estetska mapiranja, podatci se mogu prikazati preko **geoms** (i.e. "geometrijskih objekata" kao što su točke, linije, stupci). 3. Grafikon se izrađuje kroz **layers** ("slojeve"). -- </br> Ovo sve djeluje apstraktno u teoriji. Pogledajmo kako to izgledaja u praksi. --- # 1. Estetska mapiranja ```r ggplot(data = gapminder, mapping = aes(x = gdpPercap, y = lifeExp)) + geom_point() ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/aesthetics0-1.png" style="display: block; margin: auto;" /> --- # 1. Estetska mapiranja (dalje) ```r ggplot(data = gapminder, mapping = aes(x = gdpPercap, y = lifeExp)) + geom_point() ``` Pogledajte gornji red koji sadrži `ggplot()` funkcijski poziv. Ova funkcija prihvaća različite argumente, uključujući: - Odakle dolaze podatci (i.e. `data = gapminder`). - Koja su estetska mapiranja(i.e. `mapping = aes(x = gdpPercap, y = lifeExp)`). -- Estetska mapiranja su ovdje jednostavna: ona samo definiraju x-os (GDP per capita) i a y-os (life expecancy). - Za stjecanje dojma o fleksibilnosti ovog pristupa, razmislite kakve viualizacije su moguće kada se dodaju dodatna estetska mapiranja... --- # 1. Estetska mapiranja (dalje) ```r ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp, size = pop, col = continent)) + geom_point(alpha = 0.3) ## "alpha" kontrolira transparentnost. Vrijednost izmedju 0 i 1. ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/aesthetics2-1.svg" style="display: block; margin: auto;" /> -- .footnote[[*]Primjetite da smo maknuli "mapping =" dio. Najčešće se koristi "aes(...)" jer `ggplot2` zna redosljed funkcijskih argumenata.] --- # 1. Estetska mapiranja (dalje) Estetska mapiranja se mogu specificirati u u `geom layer-u` također. ```r ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp)) + ## Primjenjivo za sve geom-e geom_point(aes(size = pop, col = continent), alpha = 0.3) ## Primjenjivo samo za ovaj geom ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/aesthetics3-1.svg" style="display: block; margin: auto;" /> --- # 1. Estetska mapiranja (dalje) Oops. Što se dogodilo? ```r ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp)) + geom_point(aes(size = "big", col="black"), alpha = 0.3) ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/aesthetics_mistake-1.svg" style="display: block; margin: auto;" /> -- **Odgovor:**Estetike moraju biti mapirane na varijablem, ne na opise! --- # 1. Estetska mapiranja (dalje) Umjesto ponavljanja iste ggplot2 funkcije, moguće je stvoriti objekt za recikliranje (čuvajmo okoliš!). ```r p = ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp)) p ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/p-1.svg" style="display: block; margin: auto;" /> --- # 2. Geomi Kada su odonosi varijabli definirani kroz estetska mapiranja, moguće je pozivati i kombinbirati različite geome. ```r p + geom_point(alpha = 0.3) + geom_smooth(method = "loess") ``` ``` ## `geom_smooth()` using formula 'y ~ x' ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/geoms1-1.svg" style="display: block; margin: auto;" /> --- # 2. Geomi (dalje) Estetike mogu biti primjenjene u različitim geomima. ```r p + geom_point(aes(size = pop, col = continent), alpha = 0.3) + geom_smooth(method = "loess") ``` ``` ## `geom_smooth()` using formula 'y ~ x' ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/geoms2-1.svg" style="display: block; margin: auto;" /> --- # 2. Geomi (dalje) Prethodni primjer dobro prikazuje potencijal pripisivanja estetskih mapiranja "globalno" vs u individualnim geom layer-ima ("slojevi"). - Usporedi: Izvrši donji kod? ```r ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp, size = pop, col = continent)) + geom_point(alpha = 0.3) + geom_smooth(method = "loess") ``` --- # 2.Geomi (dalje) Slično tome, neki geomi prihvaćaju samo podskup estetskih mapiranja. E.g. `geom_density()` ne zna što napraviti sa "y" estetskim mapiranjem. ```r p + geom_density() ``` ``` ## Error: geom_density requires the following missing aesthetics: y ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/geoms4-1.svg" style="display: block; margin: auto;" /> --- # 2.Geomi (dalje) Ovo je moguće izbjeći uz malo opreza. ```r ggplot(data = gapminder) + ## i.e. Bez "globalnih" estetskih mapiranja geom_density(aes(x = gdpPercap, fill = continent), alpha=0.3) ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/geoms5-1.svg" style="display: block; margin: auto;" /> --- # 3. Napravi grafikon u slojevima Već smo vidjeli kao se mogu lančano ("u slojevima") kombinirati elementi grafikona koristeći `+` spojnicu. - npr. recikliranje grafikona stvorenih u međukoracima. Na osnovi ovog principa je moguće napraviti uistinu fascinantne vizualizacije! - Nije potrebno transformirati početne podatke; ggplot2 to radi sam. - Pogledajte primjere na sljedećim slajdovima. ```r p2 = p + geom_point(aes(size = pop, col = continent), alpha = 0.3) + scale_color_brewer(name = "Kontinent", palette = "Set1") + ## Skala boja scale_size(name = "Br. stanovnika", labels = scales::comma) + ## Skala legende scale_x_log10(labels = scales::dollar) + ## Prebaci na logaritamsku skalu i koristi dolarski znak labs(x = "Log (GDP per capita)", y = "Očekivana životna dob") + ## Ljepši nazivi osi theme_minimal() ## Minimalistička tema ``` --- # 3. Napravi grafikon u slojevima (dalje) <img src="04_OSNOVE_R_ggplot2_files/figure-html/layers2-1.svg" style="display: block; margin: auto;" /> --- # Kako dalje Prethodni primjeri su samo uvod u punu funkcionalnost ggplot2...nismo ni spomenuli druge pakete koji omogućavaju različite ekstenzije. - Nekoliko dodatnih primjera... -- Za sljedeće grafikone je potrebno instalirati neke dodatne pakete. To možete napraviti na ovaj način: ```r if (!require("pacman")) install.packages("pacman") ``` ``` ## Loading required package: pacman ``` ``` ## Warning: package 'pacman' was built under R version 4.0.3 ``` ```r pacman::p_load(hrbrthemes, gganimate) ``` --- # Kako dalje? (cont.) Jednostavno poboljšanje: eksterna tema! ```r # library(hrbrthemes) p2 + theme_modern_rc() + geom_point(aes(size = pop, col = continent), alpha = 0.2) ``` <img src="04_OSNOVE_R_ggplot2_files/figure-html/modern_rc_theme-1.svg" style="display: block; margin: auto;" /> --- # Kako dalje? (cont.) Napredno poboljšanje: Animacija! (Vidi naredni slide!) ```r library(gganimate) library(gifski) anim <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) + geom_point(alpha = 0.7, show.legend = FALSE) + scale_colour_manual(values = country_colors) + scale_size(range = c(2, 12)) + scale_x_log10() + facet_wrap(~continent) + # neki detalji iz paketa gganimate labs(title = 'Godina: {frame_time}', x = 'GDP per capita', y = 'Očekivana životna dob') + transition_time(year) + ease_aes('linear') ``` -- Animirani grafikon je izvrstan za intuitivno razumijevanje podataka. Baš kao što je to i [Hans Rosling](https://www.ted.com/talks/hans_rosling_the_best_stats_you_ve_ever_seen) zamislio. --- # Kako dalje? (cont.) <img src="04_OSNOVE_R_ggplot2_files/figure-html/ggamin2-1.gif" style="display: block; margin: auto;" /> --- # Kako dalje? (cont.) Za kraj važno spomenuti da je ggplot2' u odnosu sa "tidy" data principom. - Riječ je o nizu paketa pod nazivom [tidyverse](https://www.tidyverse.org/). Korisni resursi vezani uz današnje predavanje: - [Poglavlje 3](https://r4ds.had.co.nz/data-visualisation.html) knjige *R for Data Science* od Hadley Wickham i Garett Grolemund. - [*Data Visualization: A Practical Guide*](https://socviz.co/makeplot.html) od Kieran Healy. - [Designing ggplots](https://designing-ggplots.netlify.com) od Malcom Barrett. --- class: inverse, center, middle # HVALA NA PAŽNJI! <html><div style='float:left'></div><hr color='#EB811B' size=1px width=796px></html>