NMSA230 - Úvod do programování v R

Zimný semester 2021/2022 | Cvičenie 3 | St 03/11/21



III. Grafické nástroje v programe R


Všeobecné informáie
  • K práci na seminári je potrebný program R (Team Development Core, 2019), ktorý je dostupný pod GNU GPL licenciou (free of charge) na adrese https://www.r-project.org. K dispozícii sú distribúcie s podporou pre OS Windows, Linux, aj Macintosh.
  • Základnú inštaláciu programu R je možne rozšíriť o ďalšie dodatočné knižníce (packages), ktoré sú k dispozícii na rôznych online repozitároch (zoznam hlavných repozitárov je na adrese https://cran.r-project.org/mirrors.html). Na inštaláciu konkrétneho baličku/knižnice v programe R slúži príkaz install.packages("***"), kde namiesto *** je potrebné uviesť správne meno príslušného balíčka.
  • Okrem samotného programu R a rozširujúcich knižníc sú k dispozícii aj rôzne užívateľské rozhrania (user interfaces), ktoré je možne dodatočne nainštalovať a umožňujú (v určitých smeroch) jednoduchšiu a prehľadnejšiu prácu s programom R. Najznámejší a pravdepodobne aj jeden z najlepších R interface je RStudio (defaultne nainštalované na každom počítači v posluchárni K4 a K11).
  • Dalšie rozšírenia sú k dispozícii pre umožnenie fungovania programu R s inými programamy - napr. LaTeX, C++, Python, alebo optimalizačný toolbox Mosek (ale aj mnoho ďalších).

Stručný program trietieho semináru NMSA 230
  • Oboznámenie sa so základnými funkciami a nástrojmi, ktoré sú v programe R určené k vytváraniu rôznych grafických výstupov (vizualizácia dat, obrázky, grafy, boxploty, diagramy, atď.).
  • Využitie grafických nástrojov pre jednoduchú exploratívnú analýzu za účelom vhodného doplnenia základných popisných charakteristík.
  • Podrobnejší “sprievodca” pre jednoduchú prácu s programom R: Hrátky s R (autor: doc. Arnošt Komárek).
    (k Hrátkam s R sú potrebné datove súbory: auta2004.dat, auta2004.csv a auta2004.xls)

Užitočné študijné materiály pre prácu s programom R
  • Bína, V., Komárek, A. a Komárková, L.: Jak na jazyk R. (PDF súbor)
  • Komárek, A.: Základy práce s R. (PDF súbor)
  • Kulich, M.: Stručný úvod do R. (PDF súbor)
  • Scott, T.: An Introduction to R (PDF súbor)
  • De Vries, A. a Meys, J.: R for Dummies. (ISBN-13: 978-1119055808)





1. Základné grafické nástroje v programe R

V programe R je k dispozícii veľký výber rôznych funkcii a príkazov určených k vytváraniu variabilných grafických výstupov. Dalšíe dodatočné možnosti (vo forme doplňujúcich príkazov a funkcií) je možne získať pri rozšírení štandardnej inštalácie nainštalovaním dodatočných balíčkov (packages) - tie sú väčšinou špecificky zamerané na konkrétnu oblasť, balíček často poskytuje komplexnú sadu nástrojov na riešenie určitého špecifického problému.

Okrem toho je samozrejme možné vytvárať vlastné príkazy a funkcie a defaultné grafické nástroje v programe R v mnohých smeroch mierne modifikovať, alebo úplne zmeniť a vylepšiť, či zdokonaliť. Grafické funkcie v programe R možeme podľa spôsobu fungovania začleniť do troch základných kategórii:

  1. Funkcie, ktoré vytvárajú nové grafické rozhranie
    Pri volaní ktorejkoľvek fukcie z tejto kategórie automaticky dôjde k vytvoreniu nového grafického okna (graph window) v ktorom sa vykresli samotný výsledný obrázok (graf). Toto okno je ponechané ako aktívne a pomocou ďalších funkcii z druhej skupiny (viď nižšie) je možné dopĺňať ďalšie objekty do už existujúceho obrázku, prípadne meniť rôzne nastavenia a vlastnosti.

    Základné príkazy (napr.): plot(), dotchart(), hist(), barplot(), pie(), boxplot(), pairs(), atď.;

  2. Funkcie, ktoré dopĺňajú již vytvorený graf
    Do druhej kategórie patria funkcie a príkazy, ktoré fungujú len v prípade, že bola pred ich použitím zavolaná nejaké
    funkcia z prvej kategórie a bolo tak vytvorené grafické okno, ktoré je ponechané stále aktívne. Pomocou príkazov a funkcii z tejto kategórie je možné dopĺňať ďalšie (často netriviálne) objekty do už existujúceho grafu (grafického okna - graph window).

    Základné príkazy (napr.): points(), lines(), abline(), text(), legend(), atď.;

  3. Funkcie určené na manipuláciu s grafmi a grafickými oknami
    Do tejto kategórie patria funkcie a príkazy, ktoré primárne nie sú schopné vytvárať obrázok, ani dopĺňať objekty do už existujúceho obrázku, ale služia na základnú manipuláciu s vytvorenými grafickými oknami (napr. uloženie vykresleného obrázku do rozných typov súboru, kombinácia a rozloženie niekoľkýh grafov v jednom grafickom okne, vytvorenie nového okna, zatvorenie aktívneho okna a pod.)

    Základné príkazy (napr.): dev.new(), X11(), dev.off(), postscript(), pdf(), png(), par(), layout(), atď.;

Pomocou R helpu postupne zistíte, k čomu jednotlivé príkazy a funkcie slúžia, ako sú implementované, aké dodatočné parametre je možné pri volaní danej funkcie využiť a každú z uvedených funkcii použijte aspoň v jednom grafe, ktorý vytvoríte samostatne.

Niekoľko názorných príkladov, ktoré využívajú niektoré z uvedených funkcii, sú uvedené nižšie. Všimnite si aj úlohu dodatočných parametrov, ktoré sa pri volaní konkrétnej funkcie spomínaju.

Kvalitný obrázok (graf), ktorý je vhodný na použitie v reporte, alebo prezentácii, nie je takmer nikdy možné získať pouze jednoduchým zavolaním defaultnej funkcie. Väčšinou je potrebná dodatočná práca minimálne s vhodným popisom na jednotlivých osách, prípadne dostatočne podrobnou legendou, ktorá pomôže pri celkovom porozumení vyobrazeného grafu.


Príklad 1 | datový súbor ‘mtcars’

Datový súbor ‘mtcars’, ktorý je štandardne k dispozícii v klasickej inštalácii programu R obsahuje údaje o 32 rôznych automobiloch predávaných v USA (typ auta, motoru, spotreba, atď.). Zaujíma nás spotreba auta - premenná označená ako mpg (miles per gallon) a chceme graficky zobraziť niektoré základne charakteristiky o tejto premennej.

Defaultné použitie funkcie plot() by vyzeralo takto:

plot(mtcars$mpg)

Takýto obrázok ale poskytuje len hodne obmedzenú informáciu o samotných datach. Graf je preto potrebné vo viacerých ohľadoch vylepšiť - to znamená, dostať do grafu viac podstatnej informácie. Jedna z možností (je ich samozrejme viacmenej neobmedzené množstvo) je napríklad takáto:

x <- mtcars[order(mtcars$mpg),] # sort by mpg
x$cyl <- factor(x$cyl) # it must be a factor
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"  
dotchart(x$mpg,labels=row.names(x),cex=.7,groups= x$cyl,
    main="Gas Milage for Car Models\ngrouped by cylinder",
   xlab="Miles Per Gallon", gcolor="black", color=x$color)

c4 <- mean(mtcars$mpg[mtcars$cyl == 4])
c6 <- mean(mtcars$mpg[mtcars$cyl == 6])
c8 <- mean(mtcars$mpg[mtcars$cyl == 8])

lines(c(c8, c8), c(1, 14), col = "darkgreen", lwd = 2)
lines(c(c6, c6), c(17, 23), col = "blue", lwd = 2)
lines(c(c4, c4), c(26, 36), col = "red", lwd = 2)

Robustnejsie charakteristiky dostaneme jednoducho pomocou príkazu boxplot() v ktorom zohľadníme tri rozličné kategórie podľa celkového počtu válcov v danom aute - premenná označená ako cyl.

boxplot(mpg ~ cyl, col = c("red", "blue", "darkgreen"), data = mtcars, xlab = "Počet válcov", ylab = "Spotreba [miles per gallon]")

Alternatívný náhľad dostaneme prostredníctvom matice scatterplotov, pomocou príkazu pairs() a s využitím niektorých ďalších (numerických, resp. spojitých) premenných:

pairs(mtcars[,c(1,3,4,6)], col=mtcars$cyl, pch = mtcars$am)

Sofistikovanejšie verzie aj s odhadom hustoty a regresnej závislosti možeme konštruovať pomocou knižnice library(car) príkazom scatterplot.matrix():

panel.hist <- function(x, ...)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(usr[1:2], 0, 1.5) )
    h <- hist(x, plot = FALSE)
    breaks <- h$breaks; nB <- length(breaks)
    y <- h$counts; y <- y/max(y)
    rect(breaks[-nB], 0, breaks[-1], y, col = "cyan", ...)
}

panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- abs(cor(x, y))
    txt <- format(c(r, 0.123456789), digits = digits)[1]
    txt <- paste0(prefix, txt)
    if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt, cex = 2)
}

pairs(~mpg+disp+drat+wt + cyl, data=mtcars,  lower.panel=panel.smooth, upper.panel = panel.cor, diag.panel = panel.hist, pch = 21)