17.2 Základní vizualizace: vrstva po vrstvě
Celkovou konstrukci obrázku můžeme ilustrovat na tabulce diamonds
, která je součástí balíku ggplot2
. Tabulka obsahuje informace o jednotlivých kamenech (viz ?diamonds
). Tabulka obsahuje přes 50 tisíc pozorování. Jejich vykreslování by zejména na pomalejších počítačích trvalo velmi dlouho. Proto budeme pracovat pouze s 500 náhodně vybranými řádky:
<- diamonds %>% sample_n(500)
diamonds print(diamonds)
## # A tibble: 500 × 10
## carat cut color clarity depth table price x y z
## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 1.51 Premium I VS2 62.3 60 8997 7.35 7.29 4.56
## 2 0.7 Very Good F VVS1 63.3 62 3204 5.67 5.57 3.56
## 3 0.59 Ideal D SI1 61.6 57 1743 5.41 5.44 3.34
## 4 0.41 Very Good D SI1 63 57 717 4.64 4.7 2.94
## 5 0.53 Ideal F VVS2 62.3 56 2045 5.24 5.2 3.25
## 6 0.35 Very Good G VVS2 62.4 56 798 4.47 4.53 2.81
## 7 0.33 Ideal F VVS1 61.7 57 1021 4.47 4.44 2.75
## 8 1.59 Premium J SI1 62.5 60 7836 7.46 7.42 4.65
## 9 0.4 Ideal E VS2 60.9 56 904 4.78 4.81 2.92
## 10 0.9 Premium F SI2 58.5 60 2681 6.3 6.25 3.67
## # … with 490 more rows
Našim cílem je vytvořit podobný obrázek, který byl použit pro schématickou ilustraci fungování ggplot2: Vykreslit závislost ceny (price
), váhy (carat
) a kvality řezu (cut
).
Základ každého obrázku vytvoříme pomocí funkce ggplot()
:
ggplot(data = NULL, mapping = aes())
Funkce má dva základní argumenty: data
obsahují tabulku s daty, která se mají vizualizovat. Parametr mapping
pak přijímá základní pravidla, podle kterých se má vizualizace řídit. Přesněji řečeno pravidla vytvořená funkcí aes()
, která určují, jaká proměnná se má mapovat na kterou estetiku.
Pro pochopení těchto pojmů je užitečné zamyslet se nad tím, jak vlastně funguje bodový graf. Jeho podstatou je to, že jedno pozorování, je reprezentováno jedním bodem. Jaké vlastnosti (estetiky) však tento bod může mít?
- Pozici v rovině obrázku: souřadnice na ose x (
x
) a y (y
) - Tvar (
shape
): kolečko, čtvereček, srdíčko, listy, káry,… - Velikost (
size
) - Barvu (
color
/colour
) - Barvu výplně (
fill
) - Typ ohraničující linky (
stroke
) - Průhlednost (
alpha
)
Všechny estetiky je možné nastavit (set) nebo namapovat (map). V případě nastavení bude estetika u všech pozorování stejná. V případě namapování se hodnota estetiky bude řídit podle hodnoty přiřazené proměnné.
Pokud tedy chceme vykreslit bodový graf závislosti, ceny a váhy, potom tyto proměnné chceme namapovat na vybrané estetiky. Stejného výsledku jako u úvodního obrázku dosáhneme pomocí aes(x = carat, y = price)
. Základní volání ggplot()
tedy může vypadat následovně:
%>%
diamonds ggplot(
aes(x = carat, y = price)
)
Výsledkem je prázdná formátované plocha. Volání ggplot()
totiž pouze vytvoří prázdné “plátno,” na které je potřeba přidávat jednotlivé vrstvy s obsahem.
Nové vrstvy se typicky přidávají voláním funkcí geom_*()
. Tyto funkce nejsou nic jiného, než aliasy pro různé nastavení funkce layer()
:
layer(geom = NULL, stat = NULL, data = NULL, mapping = NULL,
position = NULL, params = list(), inherit.aes = TRUE,
check.aes = TRUE, check.param = TRUE, subset = NULL, show.legend = NA)
Funkce layer()
má mnoho parametrů. Zásadní jsou tyto:
data
…tabulka s daty, která se má použít v dané vrstvě. Pokud tento parametr není zadán, potom se použije tabulka dat specifikované ve voláníggpplot()
. Každá vrstva tak může pracovat s jinými daty. (A takéggplot()
nemusí obsahovat specifikaci dat.)geom
…typ geometrického objektu, který se má použít pro vizualizaci dat. Může se jednat o bod (point
), polygon (polygon
), úsečku (line
) a mnoho dalších.mapping
…obsahuje namapování proměnných na estetiky pomocí funkceaes()
. Pokud není parametr specifikován, potom se použije specifikace zggplot()
. Pokud je specifikace v konfliktu se specifikací vggplot()
, potom se použije specifikace zlayer()
. Pokud je specifikována estetika, která není přiřazena vggplot()
, potom se použije jako doplnění ke specifikaci zggplot()
.stat
…statistická transformace dat, která se má provést před vykreslením. Vykreslují se až transformované data.position
…umožňuje upravit pozici hrubých dat před jejich vykreslením
Funkce layer()
není zpravidla nikdy volána přímo. V podstatě vždy se používají funkce geom_*()
. Pokud například chceme přidat vrstvu s bodovým grafem, potom použijeme geom_point()
. Tato funkce je přesným ekvivalentem volání:
layer(
data = NULL,
mapping = NULL,
geom = "point",
stat = "identity",
position = "identity"
)
Pokračujme v příkladu konstrukcí bodového grafu:
%>%
diamonds ggplot(
aes(x = carat, y = price)
+
) geom_point()
Vrstvu obsahující body jsme vytvořili voláním funkce geom_point()
. Tato nová vrstva je k původnímu volání ggplot()
připojena funkcí +
. Pomocí této funkce můžeme do obrázku přidávat další vrstvy – například vrstvu, která vykreslí proloženou křivku:
%>%
diamonds ggplot(
aes(x = carat, y = price)
+
) geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Jak vlastně funguje ggplot2
vevnitř? Základní volání ggplot()
vytvoří “prázdnou” datovou strukturu. Funkce +
potom R říká, že má tuto datovou strukturu modifikovat. Jakým způsobem se to má stát určuje funkce volaná za +
. Například + geom_point()
přidá k původní datové struktuře vrstvu s body, atd.
Primárním výsledkem volání ggplot()
je tedy datová struktura. Tu můžeme přiřadit do proměnné:
<- diamonds %>%
p ggplot(
aes(x = carat, y = price)
+
) geom_point()
…a dále modifikovat…
<- p + geom_smooth() p
…nebo “vytisknout”:
p
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'