5  Grafický výstup

Cíle cvičení
  • Naučit se tvorbu základních typů grafů.
  • Definovat rozdělení sazby výstupu do polí.
  • Uložit výstupy do souboru.

V R dnes existují dva rúzné systémy pro tvorbu diagramů. První je obsažen v balíčku base a druhý staví na funkcionalitě obsažené v grid. V tomto kurzu budeme pracovat s base.

Opět připravíme datovou sadu, tentokrát umístíme do data.frame jménem dfr.

Kód
dfr <- data.frame(
  X = 1:100,
  Y = rnorm(100)
)
1
K vytvoření proměnné \(Y\) použijeme generování čísel z náhodného rozdělení s parametry \(\mu = 0\) a \(\sigma = 1\); více v Kapitola 7. Velká písmena jsou zvolena pro odlišnost od argumentů funkce.
Úloha
    1. Zadejte do konzole demo(graphics) a projeďte až na konec ukázky. Potom vyčistěte panely Environment, Plots a Console.
    2. Pročtěte si nápovědu ?par

5.1 Jednorozměrná data

Jednorozměrná data nejčastěji kreslíme pomocí boxplotu, histogramu a sloupcového grafu.

Kód
par(mfrow = c(1, 3))
boxplot(dfr$Y)
hist(dfr$Y)
barplot(dfr$Y)
1
Rozdělení grafického okna na tři sloupce (viz níže).
2
Funkce pro jednorozměrné grafy v základní parametrizaci.

Úloha
    1. Podívejte se na oba krajní grafy předchozího výstupu a popište, rozdíl mezi histogramem a sloupcovým grafem.
    2. Podívejte se do nápovědy k funkci hist() a doplňte následující kód tak, aby koše měly hranice od \(-4\) do \(4\) s krokem \(0,5\). hist(dfr$Y, breaks = )

5.2 Funkce curve()

Curve je funkce, která se uplatní při tvorbě symbolických grafů matematických funkcí, kdy není třeba parametrizovat argument x. Další argumenty ?par jsou stejné jako u plot().

Kód
curve(expr = tanh(x),
      from = -pi, 
      to = pi)
curve(expr = tanh(2*x),
      from = -pi, 
      to = pi, 
      add = TRUE)

5.3 Funkce plot()

plot(x, y, ...) je základní S3 generická funkce, jejíž metody umožňují použití na široké množství objektů. Začneme s použitím na vektor z datasetu dfr.

Kód
plot(dfr$X, dfr$Y)
1
Funkce má věšinu svých argumentů parametrizovaných v přednastavenými hodnotami, nebo hodnotami novodvozenými od parametru. Vidíme tak, že osa \(y\) je pojmenována po vstupním parametru.

Zkusíme více parametrizovat výstup a

Kód
plot(x = dfr$X,
     y = dfr$Y,
     type = "b",
     col = "gray10",
     pch = 21,
     bg = "#4a6777",
     ylim = c(-abs(1.25 * min(dfr$Y)),
              1.25 * max(dfr$Y)),
     xlab = "",
     ylab = "Value",
     main = "Y~X vztah",
     sub = Sys.Date())
legend(x = "topright",
       fill = "#4a6777",
       pch = 21,
       legend = c("Y"),
       box.col = NA,
       lty = 1,
       col = "gray10")
1
Základní proměnné \(X\) a \(Y\) pro typ grafu.
2
Volba typu grafu "b" označuje body protnuté spojnicí.
3
Volba barvy popředí znaku bod/přímka.
4
Volba charakteru bodového znaku.
5
Volba barvy pozadí znaku umožňujícího výplň - bod.
6
Změna rozsahu osy \(y\).
7
Změna názvu os.
8
Znění hlavního nadpisu.
9
Podnadpis dtto.
10
Pokračujeme nastavením umístění legendy.
11
Výplň prvku v legendě.
12
Typ prvku v legendě.
13
Název prvku v legendě.
14
Volba barvy ohraničení legendy
15
Volba typu spojnice (1 = plná čára)
16
Volba barvy popředí prvku legendy

U funkcí, do kterých vstupuje více proměnných z jednoho datasetu je možné z důvodu přehledonosti použít obalovací funkci with(), s níž pak není třeba provádět opakovaně podvýběr.

Kód
with(data = dfr,
     expr = {
       plot(x = X, y = Y)
       lines(x = X, y = Y)
       }
     ) 
1
Funkce with() umožňuje zavolání funkce uvedené v arugmentu expr na proměnných v data.frame. Odpadá opakované psaní prefixu datové sady (zde dfr$___)
2
Argument expr může obsahovat i blok kódu {...}, jako je tomu v tomto případě.

5.4 Volba barev

Barvy je možné aplikovat na všechny prvrky grafu. Buď je možné psát barvy dle názvů, například "white", "orange" použít funkci rgb() a nebo hexadecimální zápis "#FFF000". Výpis všech předdefinovaných barev1 lze získat příkazem colors().

Kód
colors()[1:10]
 [1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"
 [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"   
 [9] "aquamarine1"   "aquamarine2"  

5.4.1 Palety a RColorBrewer

Součástí základní sady je sada palet a balík RColorBrewer.

Kód
RColorBrewer::display.brewer.all()

K vytvoření palety (vektoru) barev pak žádáme \(n\) barev z předdefinovaného jmenného rozsahu.

Kód
RColorBrewer::brewer.pal(n = 100, name = "RdBu")
Warning in RColorBrewer::brewer.pal(n = 100, name = "RdBu"): n too large, allowed maximum for palette RdBu is 11
Returning the palette you asked for with that many colors
 [1] "#67001F" "#B2182B" "#D6604D" "#F4A582" "#FDDBC7" "#F7F7F7" "#D1E5F0"
 [8] "#92C5DE" "#4393C3" "#2166AC" "#053061"
Kód
rbind(
  rainbow = rainbow(10),
  heat.colors = heat.colors(10),
  cm.colors = cm.colors(10),
  blues9
)
Warning in rbind(rainbow = rainbow(10), heat.colors = heat.colors(10),
cm.colors = cm.colors(10), : number of columns of result is not a multiple of
vector length (arg 4)
            [,1]      [,2]      [,3]      [,4]      [,5]      [,6]     
rainbow     "#FF0000" "#FF9900" "#CCFF00" "#33FF00" "#00FF66" "#00FFFF"
heat.colors "#FF0000" "#FF2400" "#FF4900" "#FF6D00" "#FF9200" "#FFB600"
cm.colors   "#80FFFF" "#99FFFF" "#B3FFFF" "#CCFFFF" "#E6FFFF" "#FFE6FF"
blues9      "#F7FBFF" "#DEEBF7" "#C6DBEF" "#9ECAE1" "#6BAED6" "#4292C6"
            [,7]      [,8]      [,9]      [,10]    
rainbow     "#0066FF" "#3300FF" "#CC00FF" "#FF0099"
heat.colors "#FFDB00" "#FFFF00" "#FFFF40" "#FFFFBF"
cm.colors   "#FFCCFF" "#FFB3FF" "#FF99FF" "#FF80FF"
blues9      "#2171B5" "#08519C" "#08306B" "#F7FBFF"
Kód
palette.pals()
 [1] "R3"              "R4"              "ggplot2"         "Okabe-Ito"      
 [5] "Accent"          "Dark 2"          "Paired"          "Pastel 1"       
 [9] "Pastel 2"        "Set 1"           "Set 2"           "Set 3"          
[13] "Tableau 10"      "Classic Tableau" "Polychrome 36"   "Alphabet"       
Kód
palette.colors(palette = "Okabe-Ito")
[1] "#000000" "#E69F00" "#56B4E9" "#009E73" "#F0E442" "#0072B2" "#D55E00"
[8] "#CC79A7" "#999999"
Kód
fcol <- colorRampPalette(colors = c("black", "white"))
palette("Classic Tableau")
Poznámka

Správná volba barev v grafech odborných publikací je velmi důležitá. V ideálním případě by grafické škály měly být stejné čitelné jak pro lidi s poruchou barevného spektra, tak v černobílem tisku. Obojí je řešeno například pomocí balíčku scico Pedersen a Crameri (2021). Ve zkratce je problematika vysvětlena například ve vignette balíčku viridis.

Úloha
  1. následujícím příkladu vytvoříte graf Budykovy křivky.
    Postup:
    1. Nahrajte do prostředí data ze souboru ./data/budyko_dfr
    2. Začněte tvorbu grafu s funkcí plot.new() 
    3. Nejjednodušší vztah popsal Schreiber v roce 1902 
      \[ \dfrac{\textrm{Ea}}{\textrm{P}_a} = 1-\exp(-\phi) \]
    4. Vytvořte posloupnost od \(0\) do \(2\) s krokem \(10e^{-3}\) a uložte do proměnné phi.
    5. Pro posloupnost phi spočítejte Schreiberovu rovnici a uložte do schreiber.
    6. S pomocí následujícího příkazu vytvořte barevné schéma paleta <- rev(rainbow(20, start = 0, end = 0.6))
    7. Vyneste body x = budyko_dfr$PET_over_P a y = budyko_dfr$ET_over_P.
    8. Nastavte xlab = "Ep/P", ylab = "P/Er", xlim v rozsahu \(\phi\) a ylim od \(0\) do \(1,2\)
    9. Vyneste do plotu liniové segmenty \((0;0)\)\((1;1)\) a \((1;1)\)\((2;1)\).
    10. Funkcí grid() přidejte tečkovanou mřížku.

Pokuste se výsledkem přiblížit následovnému grafu, použijte nápovědy:

5.5 Matematická sazba v grafech

Dá se použít v místě textu, nadpisu nebo jiného popisku.

?plotmath demo(plotmath)

Kód
plot(x = dfr$X, 
     y = dfr$X^2, 
     main = expression(paste("graf ", y == x^2)), 
     ylab = expression(paste(y == x^2)))

5.6 Layout

Jednoduchý pravidelný layout můžeme vytvořit změnou parametrů okna grafického výstupu pomocí funkce par()

5.6.1 Sazba pomocí par()

Kód
par(mfrow = c(1, 2))
hist(dfr$X, main = "X", xlab = "")
hist(dfr$Y, main = "Y", xlab = "")
1
Okno výstupu rozdělíme do dvou sloupců na jednom řádku.
2
Posléze voláme dva grafy, které postupně vyplní pole v daném okně.

5.6.2 Sazba do matice s funkcí layout()

Kód
par(cex = 2)
layout.show(
  layout(
    mat = matrix(
      data = c(2, 2, 0,
               1, 1, 3,
               1, 1, 3),
      nrow = 3, 
      ncol = 3, 
      byrow = TRUE))
)
1
Zde sdělujeme, že celkově bude pole rozděleno v poměru \(3\times 3\) a \(4\over9\) (levá dolní část) vyplní 1. graf.

Nyní vynecháme layout.show(), zavolámem jen layout() a postupně přiřadíme grafy k jednotlivým polím.

Kód
layout(
    mat = matrix(
      data = c(2, 2, 0,
               1, 1, 3,
               1, 1, 3), 
      nrow = 3, 
      ncol = 3, 
      byrow = TRUE))
Úloha
  1. Vytvořte layout dle následujícího nákresu a vyplňte libovolnými rúznými typy grafů.

5.7 Uložení do souboru

Grafy je možné uložit externě, at už prostřednictvím dialogu v Plots > Export, nebo přímo ve skriptu. Formát lze volit mezi rastrovými *.png, *.jpeg, *.tiff, *.bmp, či vektorovými *.eps, *.svg, *.pdf.

Kód
png("./budyko_kompozit.png", 
    width = 8, 
    height = 6, 
    units = "px", 
    res = 300)
...
dev.off()
1
Standardním způsobem vytvořený diagram či layout.
Úloha
    1. Vytvořte poslouponost t <- seq(from = 2010, to = 2020, length = 200)) a potom do stejného grafu vyneste \(\sin(2\pi(t - 1))\) a \(\cos^2(2\pi t)\).
    2. Vytvořte layout ze 4. úlohy a uložte předchozí graf a dva další do souboru s pomocí funkce pdf(). Využijte naápovědy.
Pedersen, Thomas Lin, a Fabio Crameri. 2021. „Package ’scico’".

  1. Předdefinovaných barev je celkem 657.↩︎