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 tzv. 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 poskytnutých argumentů. Pro lepší představu o parametrech se podívejte na plot.default().

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ě.

Úloha
  1. Funkcí plot(x, y)

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. V 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.↩︎