LAB 02 - 2.10.2017 Pokracujeme v praci s viacrozmernymi datami "cars" z minuleho tyzdna. Cielom je vytvorit vizualizaciu typu "timeline", zobrazujucu niekolko premennych naraz tak aby sa dali vidiet trendy v case. Pripravil som pre Vas pociatocne kroky, Vasou ulohou bude ich rozvinut dalej. Pripravena je ukazka konstrukcie jednoduchej linearnej casovej osi a grafickych prvkov nad nou. Nasleduje idea spiralovitej casovej osi, s ktorou budete mat za ulohu dalej pracovat a vytvorit vlastnu vizualizaciu. Mozete napriklad menit podla dat hrubku a farbu spiraly, umiestnovat nu body roznej velkosti alebo doplnit ju obrazkami ilustrujucimi trendy v datach. Zmente kod smerom k vyssej estetickej urovni, pouzite lepsiu paletu farieb a podobne. Vysledky prace zaslite e-mailom vyucujucemu, budu hodnotene bodovo. Ak Vam budu pri praci chybat nejake balicky v R, mali by ste byt schopni si ich nainstalovat prikazom install.packages()". Budu instalovane vo Vasom domovskom adresari. Pokial nemate uchovanu historiu z minuleho tyzdna: cardata <- read.table("cars.data") names(cardata) <- c("mpg","cylinders","displacement","horsepower","weight","acceleration","model.year","origin") carnames <- read.table("cars.names") names(carnames) <- c("name") cars <- data.frame(c(carnames,cardata)) Len velmi povrchne sa zoznamime s moznostami upravy dat pred vizualizaciou. K tomu posluzia funkcie a balicky zo sady balickov "tidyverse", hlavne tidyr a dplyr. Upravime do 3.normalnej formy data v subore le_mess.csv. read_csv() z readr posluzi k nacitaniu dat, operator %>% z tidyr k retazeniu prikazov, funkcia gather() zas k reorganizacii premmennych zo stlpcov do novej tabulky (data frame). library(readr) life_exp_df <- read_csv("le_mess.csv") View(life_exp_df) library(tidyr) library(dplyr) (life_exp_tidy <- life_exp_df %>% gather(key = "year", value = "life_exp", -country)) View(life_exp_tidy) Naucite sa pouzivat graficke prikazy z balika ggplot2. Vizualizacia dat v nom vychadza z principov grafickej gramatiky (Grammar of Graphics). Tato rozdeluje rozhodovanie o konecnej podobe grafickeho vystupu na pracu s relativne nezavislymi zlozkami ako su priestor, graficke znacky a mapovanie ich vlastnosti na data. Porovnajte klasicky vystup s pouzitim systemu grid plot(cars$model.year, cars$mpg) a obdobny prikaz v ggplot2 library(ggplot2) quickplot(data=cars, model.year,mpg) Obdobny prikaz s pouzitim plnej vyjadrovacej sily je g <- ggplot(cars, aes(x=model.year,y=mpg)) g + geom_point() Vsimnite si ake jednoduche je zmenit typ vizualizacie g + stat_summary(geom="area") V tejto chvili experimentujte s dalsimi moznostami, ktore balicek ggplot2 poskytuje. V minulych rokoch sme v systeme grid konstruovali nasledovnu vizualizaciu: ---------- Vytvorime podoblast pre data od roku 1969 do 1983 library(grid) grid.newpage() pushViewport(plotViewport()) pushViewport(viewport(xscale=c(1969,1983))) years <- c(1969:1983) Vykreslime body pre jednotlive roky, kazdy desiaty vyraznejsie grid.circle(years,0,0.15,default.units="native",gp=gpar(fill="red")) syears <- years[which(years/10 == floor(years/10))] grid.circle(syears,0,0.25,default.units="native",gp=gpar(fill="blue")) Popiseme modre body rokmi grid.text(syears,syears,-0.1,default.units="native",rot=90,gp=gpar(fontsize=14,fontface="bold")) Aby sme mohli opakovat rozne vizualizacie s tou istou casovou osou, ulozime si predchadzajuce prikazy ako funkciu initTimeline() initTimeline <- function(years){ ... } Vytvorime farebnu plochu, ktora bude znazornovat spotrebu aut v danom roku Najprv ale potrebujeme funkciu, ktora spocita pocet aut pre dany rok countCars <- function(year){ length(which(cars$model.year == year-1900)) } Vyskusajte, ci funguje: countCars(1971) vysledok by mal byt 29. Vyborne! podobna funkcia nam spocita priemerny pocet valcov pre dany rok countCylinders <- function(year){ mean(cars$cylinders[which(cars$model.year == year-1900)]) } countCylinders(1971) Je vysledok 5.517241? a priemernu spotrebu countMpg <- function (year) { if(countCars(year)>0){ mean(cars$mpg[which(cars$model.year == year-1900)],na.rm=TRUE) } else { 0 } } Mozeme zobrazit oblast podla poctu aut v danom roku grid.polygon(years,mapply(countMpg,years)/100+0.05,default.units="native",gp=gpar(fill="grey")) Nad nou zobrazime prislusny pocet valcov tak, aby sa zdoraznilo, ze jedna klesa zatial co druha stupa. Potrebujeme funkciu drawCyl() drawCyl <- function(){ grid.rect(x=0.5,y=0.7,width=0.8,height=0.6,gp=gpar(fill="brown")) grid.rect(x=0.5,y=0.9,width=0.8,height=0.08,gp=gpar(fill="brown")) grid.rect(x=0.5,y=0.3,width=0.1,height=0.2,gp=gpar(fill="brown")) grid.circle(0.5,0.1,0.2,gp=gpar(fill="grey")) } ... a mozeme zacat vykreslovat, viewport vzdy nastavime na spravne miesto pomocou x= a y= drawSymbols <- function(year){ n <- round(countCylinders(year)) for(i in 1:n){ pushViewport(viewport(x=year,y=1.0-i*0.075,width=0.5,height=0.06,default.units="native")) drawCyl() popViewport() } } Funkcia mapply aplikuje funkciu drawSymbols na vsetky prvky vektora (roky) mapply(drawSymbols,c(1970:1982)) ---------- Ako prve hodnotene cvicenie, vytvorte dve vizualizacie pomocou balika ggplot2 1) obdobnu vizualizaciu ako je ta vyssie 2) obdobnu vysledku prikazu z cvicenia 1: xyplot(displacement ~ mpg | cylinders, data = cars)