17.8 Vzhled obrázků

Vzhled obrázků, nebo přesněji prvky, které nemají vztah k datům se v ggplot2 ovládají pomocí funkce theme(). Ta umožňuje změnit vzhled obrázků k nepoznání: můžete mít obrázek, který vypadá, jako by byl vytvořen v Excelu, Stata, nebo jako by vyšel v The Economist.

Funkce theme() má obrovské množství parametrů a nebylo by praktické je nastavovat vždy u každého obrázku. Proto v ggplot2 existuje řada předpřipravených kompletních témat (vzhledů). Například theme_bw(), theme_classic() nebo theme_void(). Základní vzhled obrázků potom odpovídá theme_gray(). Nápověda ggplot2 obsahuje hrubá doporučení, kdy je vhodné použít které téma.

17.8.1 Ukázky předpřipravených témat

Pro ukázky použijeme již známý sloupcový graf:

occupation %>% 
    ggplot(
        aes(x = occupation, fill = sex)
    ) +
    geom_bar() -> p

Populární téma je theme_bw(), které ggplot2 doporučuje například pro prezentace:

p + theme_bw()

Klasicky vypadající téma s minimem čar je theme_classic():

p + theme_classic()

Například pro kreslení map oceníte velmi speciální téma theme_void(), které zahodí všechny čáry:

p + theme_void()

Sbírku předpřipravených témat obsahuje například balík ggthemes. Kromě různých theme_*() obsahuje balík i řadu scale_*_*() a několik geom_*() funkcí.

Například minimalistické téma vytvořené podle Tufteho doporučení obsahuje ggthemes::theme_tufte():

p + ggthemes::theme_tufte()

17.8.2 Modifikace témat

ggplot2 umožňuje vytvářet vlastní předpřipravená témata, ale většinou bohatě postačuje použít předpřipravené a upravit ho, to lze zařídit následujícím způsobem:

p + 
    theme_classic() +
    theme(
        panel.grid.major = element_line(size = 0.2)
    )

U theme() funguje vrstvení stejně, jako u všeho ostatního. Volání jednotlivých funkcí modifikuje podkladovou datovou strukturu. Zavolání funkce theme_classic() tedy nastaví všechny parametry tak, jak to odpovídá theme_classic – to znamená, žádné linky na pozadí. Následné volání theme() přepíše to, co před tím nastavilo volání theme_classic() a linky přidá. Žádný další parametr nebyl v theme() zadán a proto se nic jiného nezmění.

Pokud by funkce byly volány v opačném pořadí, potom by byl výsledek následující:

p + 
    theme(
        panel.grid.major = element_line(size = 0.2)
    ) +
    theme_classic()

Výsledek by přesně odpovídal theme_classic. theme_classic() totiž bez milosti přepíše veškeré formátování vytvořené v předchozích voláních theme() nebo theme_*().

Samotné volání theme() ve výše uvedeném příkladu vypadá skutečně velmi krypticky, ale není to tak, protože, podobně jako (skoro) ve všem v ggplot2, za ním stojí promyšlený systém.

Funkce theme() má opravdu mnoho parametrů (viz ?theme), jejich jména odpovídají jménům jednotlivých grafických prvků. Jména jsou naštěstí často velmi výstižná, intuitivní, a navíc je RStudio zvládá (u novějších verzí ggplot2) našeptávat.

Formátování grafických prvků se ve většině případů provádí pomocí volání jedné z následujících funkcí:

element_text(family = NULL, face = NULL, colour = NULL, size = NULL,
  hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL,
  color = NULL, margin = NULL, debug = NULL)

element_line(colour = NULL, size = NULL, linetype = NULL,
  lineend = NULL, color = NULL)

element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL,
  color = NULL)

element_blank()

Tu správnou lze uhodnout. Pokud chcete upravit formátování prvku, který je ve své podstatě text, potom chcete použít element_text(). Příkladem může být modifikace titulku (plot.title) obrázku:

p + 
    labs(
       title = "Just Another Bar Plot" 
    ) +
    theme(
        plot.title = element_text(colour = "red")
    )

Pokud je prvek svým charakterem čára, potom se jeho formátování nastavuje pomocí element_line() (viz modifikace čar na pozadí výše). Prvky, které jsou ve své podstatě čtyřúhelník se potom modifikují pomocí element_rect(). Příkladem může být změna barvy pozadí grafu na poníkovou:

p + 
    theme(
        panel.background = element_rect(fill = "pink")
    )

Speciální funkce je potom element_blank(), která způsobí, že se daný prvek z obrázku kompletně vypustí:

p + 
    theme(
        legend.title = element_blank()
    )

Například toto volání vypustilo jméno legendy a to zcela. Špinavé triky typu scale_fill_discrete(name = "") sice způsobí, že jméno “nebude vidět.” Respektive se vykreslí prázdný řetězec. Místo pro titulek však bude alokováno a bude tak rozhazovat uspořádání obrázku. element_blank() je správná cesta.

Některé parametry v theme() se nastavují pomocí speciálních funkcí – typicky jde o nastavení velikostí pomocí funkce unit(). Další parametry se nastavují prostým zadáním hodnoty. Příkladem může být pozice a orientace legendy:

p + 
    theme(
        legend.position = "bottom",
        legend.direction = "horizontal"
    )