NMSA230 - Úvod do programování v R

Zimný semester 2022/2023 | Cvičenie 3 | St 02/11/22

zdrojový Rmd súbor



III. Grafické nástroje v programe R

Program R (dostupný pod GNU GPL licenciou) je k dispozícii k stiahnutiu (free of charge) na adrese:

https://www.r-project.org

K dispozícii sú distribúcie s priamou podporou pre OS Windows, Linux aj Macintosh.

Základnú inštaláciu programu R je možne jednoducho rozšíriť pomocou dodatočných knižníc (balíčkov), 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). Jednotlivé R knižnice sú tvorené samotnými užívateľmi softwaru R a ich správne fungovanie nie je garantované – je preto namieste určitá opatrnosť a hlavne aktívne premýšľanie pri ich používaní a implementácii jednotlivých funkcii.

Pre užívateľov programu R sú k dispozícii aj rôzne grafické rozhrania, ktoré je možne dodatočne nainštalovať a umožňujú (v určitých smeroch) jednoduchšiu a prehľadnejšiu prácu. Najznámejší a pravdepodobne aj najviac používaný je RStudio.

Užitočné materiály pre prácu so štatistickým 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)



Stručný program trietieho semináru NMSA 230
  • Oboznámenie sa so základnými nástrojmi a niektorými R funkciami, ktoré sú v programe R určené k vytváraniu grafických výstupov (ilustrácia a vizualizácia dat, obrázky, grafy – scatterploty, 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)


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 základnej funkcie plot() by vyzeralo takto:

plot(mtcars$mpg)

Takýto obrázok ale poskytuje len hodne obmedzenú informáciu o samotnej podstate a charaktere dat. 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 viac-menej 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)

Robustnejšie 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)

Existujú samozrejme mnohé iné možnosti a ďalšie grafiké nástroje v Rku, pomocou ktorých vytvoriť ‘case-specific’ obrázky a grafy. Hlavný dôraz je pritom kladený na vizuálnu stránku, graf by mal dostatočne názorne zobrazovať podstatnú štruktúru datového súboru.

V prípade menšieho počtu premenných je celkom zaujímavou možnosťou aj zobrazenie marginálnych hustot pre nejaké dve konkrétne veličíny (z dôvodu obmedzeného vnímania viac-rozmerných grafov sa väčšinou nepoužíva viac, ako dve veličiny súčastne):

library(MASS)
library("RColorBrewer")
colors <- brewer.pal(5, "Reds")

z <- kde2d(mtcars[,1], mtcars[,4], n=5)

plot(mtcars[,c(1,4)], xlab="Miles per Galon", ylab="Horse Power", pch=21, bg = "yellow")
contour(z, drawlabels=FALSE, nlevels=4, col=colors, add=TRUE)

Knižnica MASS je potrebná k spočítaniu jadrového odhadu dvojrozmernej hustoty (príkaz kde2d()) a knižnica RColorBrewer je potrebná na vytvorenie farebnej palety, podľa ktorej sú vyfarbené kontúry.

Komplexnejší obrázok s dvoma rôznymi osami y (ľavá os y pre celkovú spotrebu a pravá os y pre výkon).

par(mar = c(5, 4, 4, 4) + 0.3)
x <- mtcars$wt
plot(mtcars$mpg ~ x, data = mtcars, pch = 21, bg = "lightblue", cex = 0.8, xlim = c(1, 5.5), xlab = "Celková hmotnosť", ylab = "")
lines(lowess(mtcars$mpg ~ mtcars$wt), col = "black", lwd = 2)

mtext("Spotreba [miles per gallon]" ,side=2,line=3, col = "black")
axis(2,col="black",col.axis="black")

par(new=TRUE)


plot(mtcars$hp ~ x, axes = FALSE, bty = "n", xlab = "", ylab = "", type = "p", col ="red", ylim = c(min(mtcars$hp), max(mtcars$hp)), lwd = 2, cex = 0.5, xlim = c(1, 5.5))
lines(lowess(mtcars$hp ~ x), col = "red", lwd = 2)
axis(4,col="red" ,col.axis= "red")

mtext("Výkon [horse power]",side=4,line=3, col = "red")

for (i in 1:50){
  lines(c(1 + i * 4.5/50, 1 + i * 4.5/50), c(50, 340), col = "gray")
}

Boxploty

Predstavu o štruktúre datového súboru získame (aj keď len v určitej obmedzenej miere) aj pomocou boxplotov, ako už bolo ukázane pre celkovú spotrebu v závislosti na počte válcov. Boxploty však môžu obsahovať aj komplexnejšiu informáciu o nejakej veličine, resp. o nejakých veličinách.

boxplot(mpg ~ cyl, col = brewer.pal(3, "Blues"), xlab = "number of cylinders", ylab = "miles per galon", main= "", data = mtcars)

prípadne verzia, ktorá zohľadňuje dve rôzne kategorické premenné (v tomto konkrétnom prípade spotrebu udávanu v míľach prejdených na jeden galón a identifikátor automatickej prevodovky: Automatic = 0 a Manual = 1).

boxplot(mpg ~ cyl + am, col = c(brewer.pal(3, "Greens"), brewer.pal(3, "Blues")), xlab = "No. of cylinders (vs.) Auto Transmission Indicator", data = mtcars)

Alebo dokonca zložitejší prípad zobrazujúci spotrebu v závislosti na dvoch rôznych faktoroch a 95% konfidenčným intervalom pre skutočnú hodnotu médianu (s voľbou parametru notched = TRUE).

boxplot(mpg ~ cyl * am, col = c(brewer.pal(3, "Greens"), brewer.pal(3, "Blues")), xlab = "Number of Cylinders", ylab = "Miles per Galon | Automatic Transmission", main= "", notch = T, data = mtcars)

Alebo celkom sofistikovany ‘histogram’, ktorý inkorporuje aj odhad hustoty (pomocou príkazu vioplot() z knižnice ‘vioplot’.

library(vioplot)
x1 <- mtcars$mpg[mtcars$cyl==4]
x2 <- mtcars$mpg[mtcars$cyl==6]
x3 <- mtcars$mpg[mtcars$cyl==8]
vioplot(x1, x2, x3, names=c("4 cyl", "6 cyl", "8 cyl"), col="gold")
title("Violin Plots of Miles Per Gallon")

S využitím dodatočnej knižnice MASS je možné zavolať funkciu parcoord() ktorá je užitočna, keď chceme vizuálne posúdiť mieru korelácie medzi jednotlivými sledovanými premennými. Ako by ste nasledujúci graf interpretovali? Resp. aké závery je možné z tohto grafu vyvodiť?

library(MASS)
attach(mtcars)
colorVector <- rep("brown", dim(mtcars)[1])
colorVector[am == 0] <- "brown1"
colorVector[cyl == 6] <- "blue4"
colorVector[cyl == 6 & am == 0] <- "blue1"
colorVector[cyl == 4] <- "darkgreen"
colorVector[cyl == 4 & am == 0] <- "green"
parcoord(mtcars, col = colorVector, lty = gear)


Príklad 2 | datový súbor ‘Orange’

V druhom príklade použijeme datový súbor ‘Orange’, s ktorým sme už pracovali. V datasete sú zaznamenané informácie o piatich druhoch pomarančovníkoch - zaznamenávame vek stromu v dňoch a priemer kmeňa v centimetroch.

Najprv využijeme štandardný príkaz plot() a následne sa pokusíme graf vylepšiť pomocou využitia informácie, ktorú o datach máme (viď R help ?Orange) a dodatočných funkcii z druhej kategórie, prípadne niektorých prametrov, pomocou ktorých sú jednotlivé funkcie implementováne.

plot(Orange[,"circumference"] ~ Orange[,"age"])

A teraz vylepšená (snáď krajšia) verzia toho istého grafu:

plot(0,0, xlim = c(0, 1800), ylim = c(0, 250), pch = "",
          xlab = "age [days]", ylab = "circumference [cm]", main = "Orange Trees")
for (i in 1:5){
  points(Orange[Orange[,1] == i,3] ~ Orange[Orange[,1] == i,2], pch = 21, bg = i)
  lines(Orange[Orange[,1] == i,3] ~ Orange[Orange[,1] == i,2], col = i)
}
legend(0, 250, legend = c("Tree type #1", "Tree type #2", "Tree type #3", "Tree type #4", "Tree type #5"), 
               col = "black", bg = "lightgray" , pch = 21, lty = c(1,1,1,1,1), pt.bg = 1:5)


Príklad 3 | multiple plot output

Pomocou príkazov par() a layout() je možné kombinovať niekoľko grafov/obrázkov v jednom grafickom okne.

par(mfrow = c(1,2))
hist(Orange[,"circumference"], col = "lightblue", xlab = "Circumference [cm]", ylab = "Frequency", freq = F, main = "")
lines(density(Orange[,3]), col = "red", lwd = 2, lty = 2)
barplot(Orange[,3], col = sort(rep(1:5,7)), xlab = "Measurements by Trees", ylab = "Circumference [cm]")



Užitočné


Program R poskytuje obrovskú škálu nástrojov a funkcii k vytváraniu a modifikovaniu grafickych výstupov. Ako názorná ukážka rôzných možnosti, ktoré sú k dispozícii, môže poslúžiť jednoduché demo, ktoré je defaultne k dispozícii v Rku pod príkazom demo("graphics").

Analogickym spôsobom funguje demo ku všetkym knižniciam, ktoré su v Rku nainštalované (príkaz demo() a následne demo("***"), kde namiesto *** je potrebné dopĺniť názov príslušného balíčku - package.

Každá zo spomínaných funkcii je implementována s dodatočnými parametrami, ktore menia jej defaultne nastavenie a ovplyvňujú finálny vysledok výsledného grafu (viď help k príslušnej funkcii). Je dôležité tieto parametre poznať a náležite ich pri práci aj využívať.



2. Obrázky a grafy pre kategorické premenné

V prípade práce s kategorickými premennými je užitočné uvažovať nad grafmi, ktoré poskytnú informáciu o zastúpení jednotlivých kategórii - teda relatívne počty. K tomuto účelu je v programe R niekoľko funkcii.

Príklad 3 | datový súbor ‘MplsStops’ (knižnica ‘carData’)

Data obsahujú informáciu o zastavených vodičoch políciou v Mineapolise v USA v roku 2017 (viď R help k príslušným datam).

library("carData")
table(MplsStops$race)
## 
##           Black           White         Unknown    East African          Latino 
##           15220           11703            9219            2188            1858 
## Native American           Other           Asian 
##            1516            1348             647
library("RColorBrewer")
colors <- brewer.pal(8, "Reds")

par(mfrow = c(1,2))
pie(table(MplsStops$race), col = colors)
barplot(table(MplsStops$race), col = colors)

Užitočné


  • Funkcia barplot() aj funkcia pie() majú v R širšie využitie a konkrétna implementácia závisí na hodnotách voliteľných parametroch.
  • S pomocou R helpu k jednotlivých funkciám vyskúšajte použitie na vlasných datach.



3. Príprava obrázkov do reportu/prezentácie

Z datovych súborov, ktoré sú defaultne k dispozícii v štandardnej inštalácii programu R (príkaz data()) si vyberte jeden datový súbor a pomocou grafických nástrojov zostrojte niekoľko obrázkov, ktoré nejakým spôsobom vypovedajú o nameraných hodnotách. Pomocov dvojice príkazov pdf() a dev.off() získame výsledný grafický výstup vo foprmáte PDF (ktorý sa automaticky vytvorí pri volaní funkcie pdf() a ukonči/zprístupni volaním funkcie dev.off() na záver).

pdf("obrazok1.pdf", width = 6, height = 4)
par(mfrow = c(1,2))
hist(Orange[,"circumference"], col = "lightblue", xlab = "Circumference [cm]", ylab = "Frequency", freq = F, main = "")
lines(density(Orange[,3]), col = "red", lwd = 2, lty = 2)
barplot(Orange[,3], col = sort(rep(1:5,7)), xlab = "Measurements by Trees", ylab = "Circumference [cm]")
dev.off()

Pre prácu s LaTeXom je užitočné poznať aj príkaz na vytvorenie obrázku/grafu vo vektorovej grafike, ktorý je všeobecne kvalitnejší. Slúži k tomu príkaz postscript(). Dodatočné grafické parametre sú totožné, ako pri vytváraní výstupov vo formáte PDF, teda príkaze pdf():

postscript("obrazok1.eps", width = 6, height = 4)
par(mfrow = c(1,2))
hist(Orange[,"circumference"], col = "lightblue", xlab = "Circumference [cm]", ylab = "Frequency", freq = F, main = "")
lines(density(Orange[,3]), col = "red", lwd = 2, lty = 2)
barplot(Orange[,3], col = sort(rep(1:5,7)), xlab = "Measurements by Trees", ylab = "Circumference [cm]")
dev.off()



Užitočné


  • Ako už bolo uvedené, v programe R je k dispozícii celá škála rôznych balíčkov a knižníc, z ktorých su mnohé venované aj grafike. Podrobnosti sú napr. na webovej stranke http://www.r-graph-gallery.com.
  • Väčšína z uvedených príkladov vyžaduje inštaláciu potrebnej knižnice (package) - inštalácia pomocou príkazu install.packages() a následna inicializácia knižnice pomocou príkazu library().



4. Knižnica ggplot2

Alternatívu ku klasickým grafickým nástrojom, ktoré sú k dispozícii v programe R, ponúka dodatočna knižnica ggplot2, ktorú naištalujete a inicializujete štandardnými príkazmi

install.packages("ggplot2")
library(ggplot2)

Základnou funkciou v tejto knižnici je funkcia qplot(), ktorá na rozdiel od štandardnej funkcie plot(), ponúka ďaleko väčšie možnosti pri vytváraní grafov a obrázkov (pozri help ?qplot()).

V datovom súbore mtcars najprv upravíme niektoré premenné - faktorizujeme ich a priradíme príslušne názvý jednotlivých úrovni.

mtcars$gear <- factor(mtcars$gear,levels=c(3,4,5), labels=c("3gears","4gears","5gears")) 
mtcars$am   <- factor(mtcars$am,levels=c(0,1), labels=c("Automatic","Manual")) 
mtcars$cyl  <- factor(mtcars$cyl,levels=c(4,6,8),  labels=c("4cyl","6cyl","8cyl"))

Následne už možeme použiť funkciu qplot() a vykresliť odhad hustoty pre spotrebu (miles per gallon) v závislosti na počte prevodových stupňov (premenná gear).

qplot(mpg, data=mtcars, geom="density", fill=gear, alpha=I(.5), main="Distribution of Gas Milage", xlab="Miles Per Gallon",  ylab="Density")

Pomocou tej istej funkcie qplot(), ale s inou voľbou parametru geom = "...", je možne celkovo meniť vzhľad a typ výsledného grafu.

qplot(gear, mpg, data=mtcars, geom=c("boxplot", "jitter"), fill=gear, main="Mileage by Gear Number", xlab="", ylab="Miles per Gallon")

Prípadne vykresliť regresnú závislosť spotreby na váhe automobilu (aj s príslušnými pásmi spoľahlivosti pre regresnú přímku).

qplot(wt, mpg, data=mtcars, geom=c("point", "smooth"), method="lm", formula=y~x, color=cyl, main="Regression of MPG on Weight", xlab="Weight", ylab="Miles per Gallon")



Užitočné


Knižnica ggplot2 funguje na princípe postupných vrstiev (layers), v ktorých sa vykresľuje výsledný graf. Jednotlivé vrstvy sa prídávajú pomocou vhodných príkazov, ako napr. geom_points(), geom_abline(), geom_area() geom_bar(), geom_contour(), geom_polygon(), atď. (zoznam napr. na stránke http://sape.inf.usi.ch/quick-reference/ggplot2/geom).

Jednoduchý príklad s využitím niekoľkých vrstiev:

dataSum <- plyr::ddply(mtcars, "gear", plyr::summarise, mean = mean(mpg), sd = sd(mpg))

ggplot() +
  geom_point(data = mtcars, aes(x = gear, y = mpg)) +
  geom_point(data = dataSum, aes(x = gear, y = mean), colour = 'red', size = 3) +
  geom_errorbar(data = dataSum, aes(x = gear, y = mean,  ymin = mean - sd, ymax = mean + sd), colour = 'red', width = 0.4) +
  ggtitle("Car consumption summary given the number of gears")





Domáca úloha

(Deadline: 4. cvičenie | St: 16.12.2022)

Použijte datový súbor, ktorý ste si vygenerovali vrámci predchadzajúcich samostatných úkolov. Uvažujte popisné charakteristiky, ktoré ste si zvolili a spočítali a doplňte tieto výberové charakteristiky vhodnými obrázkami/grafmi.

  • Vytvorte aspoň jeden graf zobrazujúci scatterplot bodov. Graf vhodným spôsobom (napr. rôzne barvy, rôzne symboly pre jednotlivé body a pod.) doplnte o dalšie informácie obsažené v datach.
  • Vytvorte vhodný obrázok pre aspoň jednu kategorickú premennú.
  • Výsledne obrázky si pomocou príkazu “pdf()” uložte na disk ako PDF súbory.