Obiecte geometrice (geometric objects)

Obiectele geometrice (geometric objects), sau geom pe scurt, sunt elementele fundamentale ale unui grafic creat în ggplot2, prin intermediul lor se efectuează reprezentarea a datelor, controlând tipul de grafic dorit. Ne includerea unui strat geom în desen conduce la o figură goală (a se vedea mai sus). Majoritatea obiectelor geometrice sunt asociate unui grafic a cărui denumire este prestabilită, astfel geom_bar corespunde unei diagrame cu bare (barplot), geom_line corespunde unei diagrame liniare (linegraph), geom_histogram corespunde unei histograme, geom_boxplot corespunde unei diagrame de tip boxplot (cutie cu mustăți) ș.a.m.d. O excepție de la această regulă este dată de diagrama de împrăștiere (scatterplot) pentru care se folosește geom_point.

Fiecare funcție geom are propriile elemente estetice și argumente necesare pentru a ajusta modul în care este creat graficul. De exemplu, funcția geom_histogram necesită doar elementul estetic x pe când dacă dorim să trasăm o diagramă de împrăștiere avem nevoie atât de estetica x cât și de y. În contextul setului de date gapminder_2018, variabila gdpPerCap ne arată produsul intern brut pe cap de locuitor pentru fiecare țară iar variabila lifeExp prezintă speranța medie de viață din țara respectivă. Pentru a vedea cum este distribuit produsul intern brut pentru anul 2018 vom trasa o histogramă a acestuia iar pentru a investiga relația dintre variabilele gdpPerCap și lifeExp vom ilustra o diagramă de împrăștiere:

# histograma
ggplot(gapminder_2018, aes(x = gdpPerCap)) + 
  geom_histogram()

# diagrama de imprastiere - scatterplot
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_point()

Figura 1: Exemplu de utilizare a obiectelor geometrice geom_histogram() și geom_point().

Pentru fiecare funcție geom există elemente estetice obligatorii și opționale. Majoritatea obiectelor grafice necesită elementele estetice x și y dar sunt și excepții precum geom_bar sau geom_histogram. De exemplu, în cazul funcției geom_point, elementele estetice obligatorii sunt x și y iar cele opționale pot include: alpha (transparență), colour, fill, size, shape sau stroke. Trebuie menționat că elementele estetice pot să difere de la geom la geom în funcție de specificul vizual al fiecărui obiect grafic, de exemplu putem utiliza shape ca estetică pentru geom_point dar nu o putem utiliza și pentru geom_line precum putem utiliza linetype pentru geom_line dar nu și pentru geom_point.

În contextul setului de date gapminder_2018 vom utiliza atât estetica colour pentru a diferenția țările în funcție de continent cât și estetica size pentru a scoate în evidență țările cu o populație (pop) mai mare:

Figura 2: Exemplu de utilizare a obiectului geometric geom_point() împreună cu diferite proprietăți estetice.

Pe lângă elementele estetice, funcțiile geom admit și o serie de argumente specifice (care se regăsesc la secțiunea arguments în documentația acestora, e.g. ?geom_point), de exemplu dacă dorim să modificăm numărul de subintervale (bins) folosit pentru trasarea unei histograme atunci putem utiliza argumentul bins =:

# histograma
ggplot(gapminder_2018, aes(x = gdpPerCap)) + 
  geom_histogram(bins = 15)

Figura 3: Exemplu de utilizare a obiectului geometric geom_histogram() împreună cu argumentul bins =.

Următorul tabel prezintă o serie de funcții geom împreună cu elementele estetice obligatorii și o parte din argumentele specifice ale acestora.

Tabelul 1: Funcțiile geom de bază împreună cu elementele estetice obligatorii și o parte din argumentele specifice ale acestora.
Funcția Elemente estetice Argumente opționale Descriere
geom_point x, y Trasează o diagramă de împrăștiere
geom_line x, y arrow, na.rm Trasează o diagramă liniară
geom_segment x, y, xend, yend arrow, na.rm Trasează un segment de dreaptă
geom_path x, y na.rm Trasează o linie poligonală
geom_polygon x, y Trasează o linie poligonală închisă (umplută)
geom_rect xmin, xmax, ymin, ymaxl Trasează un dreptunghi
geom_histogram x bins, binwidth Trasează o histogramă
geom_density x Trasează o diagramă de densitate estimată prin nuclee
geom_dotplot x bins, binwidth Trasează o diagramă cu puncte similară diagramei cu bare
geom_freqpoly x binwidth Trasează o linie poligonală de frecvență
geom_bar x sau x, y width Trasează o diagramă cu bare
geom_abline intercept, slope Trasează drepte în care sunt specificate pantele și ordonatele la origine
geom_hline yintercept Trasează drepte de referință orizontale
geom_vline xintercept Trasează drepte de referință verticale
geom_smooth x, y method, se, span Adaugă o curbă de regresie
geom_text x, y, label Adaugă etichete text la puncte
geom_bin2d x, y bins Ilustrează o estimare a densității bivariate prin dreptunghiuri
geom_hex x, y bins Ilustrează o estimare a densității bivariate prin hexagoane (faguri)

Vom prezenta mai jos o parte dintre graficele generate de aceste funcții în contextul seturilor de date gapminder_all și gapminder_2018. Vom face separarea graficelor după numărul (una sau două) și tipul (discrete sau continue) variabilelor analizate:

  • o variabilă discretă - geom_bar()

Figura 4: Exemplu de diagramă cu bare folosind geom_bar().

  • o variabilă continuă - geom_histogram, geom_density, geom_dotplot și geom_freqpoly

# histograma
ggplot(gapminder_2018, aes(x = gdpPerCap)) + 
  geom_histogram()

# estimarea densitatii
ggplot(gapminder_2018, aes(x = gdpPerCap)) + 
  geom_density()

# dotplot
ggplot(gapminder_2018, aes(x = gdpPerCap)) + 
  geom_dotplot()

# diagrama de frecvente 
ggplot(gapminder_2018, aes(x = gdpPerCap)) + 
  geom_freqpoly()

Figura 5: Exemple de utilizare a funcțiilor geom_histogram, geom_density, geom_dotplot și geom_freqpoly.

  • două variabile ambele continue - geom_point, geom_line, geom_smooth, geom_bin2d, geom_hex, etc.

# Diagrama de imprastiere
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_point()

# Functia de regresie - default loess
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_smooth()

# Densitate bivariata
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_bind2d()

# Densitate bivariata
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_hex()

(ref:ggplot-c3-fig6) Exemple de utilizare a funcțiilor geom_point, geom_line, geom_smooth, geom_bin2d și geom_hex.

Figura 6: Exemple de utilizare a funcțiilor geom_point, geom_line, geom_smooth, geom_bin2d și geom_hex.

  • o variabilă continuă și una discretă - geom_bar(stat = "identity") (sau geom_col), geom_boxplot, geom_violin, etc.

# datele
gap1 = gapminder_2018 %>%
  filter(country %in% c("Romania", "United States", "France"))

# barplot
ggplot(gap1, aes(x = country, y = gdpPerCap)) + 
  geom_bar(stat = "identity")
# sau 
ggplot(gap1, aes(x = country, y = gdpPerCap)) + 
  geom_col()

# boxplot
ggplot(gapminder_2018, aes(x = continent, y = gdpPerCap)) + 
  geom_boxplot()

Figura 7: Exemple de utilizare a funcțiilor geom_bar(stat = "identity") (sau geom_col), geom_boxplot și geom_violin.

  • o variabilă continuă și alta de tip temporal: geom_line, geom_area

# diagrama liniara
ggplot(gapminder_all %>% filter(country == "Romania"), 
       aes(x = as.numeric(year), y = gdpPerCap)) + 
  geom_line()

# area plot
ggplot(gapminder_all %>% filter(country == "Romania"), 
       aes(x = as.numeric(year), y = gdpPerCap)) + 
  geom_line()

Figura 8: Exemple de utilizare a funcțiilor geom_line și geom_area.

Ceea ce face pachetul ggplot2 cu adevărat puternic este că acesta permite construcția de figuri complexe prin adăugarea mai multor obiecte grafice la aceeași figură, suprapunând straturile determinate de ele. Să considerăm setul de date gapminder_2018 și să adăugăm la diagrama de împrăștiere a variabilelor gdpPerCap și lifeExp relația liniară determinată de dreapta de regresie:

Figura 9: Exemplu de utilizare a funcțiilor geom_point() și geom_smooth() pe aceeași figură.

Trebuie remarcat faptul că putem utiliza elemente estetice diferite pentru fiecare obiect geometric folosit, de exemplu în figura anterioară putem schimba culoarea punctelor și a dreptei de regresie.

Figura 10: Exemplu de schimbare a culorii punctelor și a dreptei de regresie.

De asemenea, este posibil să atribuim fiecărui strat geom propriul set de date astfel încât să putem utiliza mai multe seturi de date pentru a scoate în evidență caracteristicile de interes ale graficului (variabilelor). În contextul diagramei de împrăștiere dintre produsul intern brut pe cap de locuitor și speranța medie de viață pentru setul de date gapminder_2018 vrem să adăugăm numele (etichetele - label) țărilor care au mai mult de 200 milioane de locuitori și să colorăm punctele în roșu. Pentru început, vom construi setul de date cu țările corespunzătoare și apoi vom adăuga informația folosind geom_text. Etichetarea elementelor grafice se poate face cu geom_text sau geom_label dar atunci când punctele sunt foarte aglomerate se pot folosi și funcții alternative precum cele din pachetul ggrepel (geom_text_repel sau geom_label_repel). Pentru a colora punctele vom folosi estetica colour într-un nou strat geom_point. :

tari_mari <- gapminder_2018 %>% 
  filter(pop > 2e8)

ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_point() +
  geom_point(data = tari_mari, 
             aes(x = gdpPerCap, y = lifeExp), 
             colour = "brown3", size = 3) + 
  geom_text(data = tari_mari, aes(label = country))

Figura 11: Exemplu de folosire în interiorul unui strat geom a unui set de date.

Sunt și situații în care dorim să separăm datele în grupuri dar vrem să le redăm în același mod, de exemplu atunci când avem un studiu longitudinal (studiu care presupune observații repetate asupra acelorași variabile) cu mai mulți subiecți. Acest tip de situație, întâlnit în cazul în care un geom afișează observații multiple printr-un singur obiect geometric (e.g. geom_boxplot), necesită separarea pe grupe a observațiilor, fapt realizat prin intermediul elementului estetic group. Pentru o mai bună înțelegere vom ilustra acest concept folosind setul de date gapminder_all. Să presupunem că dorim să afișăm evoluția duratei medii de viață după anul 1900 pentru o submulțime de țări (Romania, Moldova și France).

gapminder_all %>% 
  filter(as.numeric(year) > 1900) %>%
  filter(country %in% c("Romania", "Moldova", "France")) %>%
ggplot(aes(x = year, y = lifeExp)) + 
  geom_point()+
  geom_line()

gapminder_all %>% 
  filter(as.numeric(year) > 1900) %>%
  filter(country %in% c("Romania", "Moldova", "France")) %>%
ggplot(aes(x = year, y = lifeExp, group = country, colour = country)) + 
  geom_point()+
  geom_line()

Figura 12: Exemplu de folosire a elementului estetic group.