Sisteme de coordonate (coordinate systems)

Pachetul ggplot2 pune la dispoziție și o serie de funcții care fac referire la sistemul de coordonate în care sunt trasate elementele grafice. Sistemele de coordonate sunt specificate prin funcții care încep prin coord_ și sunt adăugate ca straturi la graficul existent. Pachetul dispune de mai multe sisteme de coordonate printre care enumerăm:

  • coord_cartesian - sistemul cartezian care este și cel de default și în care trebuie specificare valorile pe x și y
  • coord_flip - sistemul cartezian în care axele sunt schimbate între ele
  • coord_fixed - un sistem cartezian care păstrează fixat aspectul (aspect ratio - numărul de unități pe axa y care corespund unei unități pe axa x) cu raportul de bază de 1
  • coord_polar - sistemul de coordonate polar
  • coord_quickmap - un sistem de coordonate care aproximează sistemul sferic al planeti în vederea trasării hărților

Folosind sistemul cartezian cu opțiunea xlim (respectiv ylim) putem vizualiza doar acea regiune a graficului care ne interesează (putem face zoom). Diferența majoră dintre utilizarea limitelor în interiorul funcției coord_cartesian și utilizarea limitelor în funcțiile de scală (e.g. scale_x_continuous) este că în primul caz utilizăm tot setul de date pe când în cel de al doilea caz sunt folosite doar observațiile care se află între limitele setate, toate celelalte puncte fiind excluse.

# folosind scala - fitam curba de regresie pe datele ramase
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) + 
  geom_point() +
  geom_smooth() +
  scale_x_continuous(limits = c(25000, 50000))

# folosind sistemul de coordonate - fitam curba de regresie
# pe toate datele si evidentiem doar zona de interes
ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) + 
  geom_point() +
  geom_smooth()+
  coord_cartesian(xlim = c(25000, 50000))

Figura 1: Exemplu de utilizare a opțiunilor limits și xlim.

Sunt multe situațiile în care suntem interesați de valorile variabilei de pe axa x condiționate la variabila de pe axa y și în acest caz este recomandată schimbarea (întoarcerea) sistemului de coordonate prin apelarea funcției coord_flip(). De asemenea, o altă situație în care se recomandă rotirea coordonatelor cu 90 de grade este în cazul trasării unei diagrame cu bare sau a unui boxplot în funcție de o variabilă calitativă cu un număr mare de categorii sau cu categorii a căror denumire este lungă. Vom ilustra această transformare a sistemului de coordonate folosind diagrama cu bare pentru a evidenția numărul țărilor din setul de date gapminder_2018 de pe fiecare continent.

# coordonate carteziene
gapminder_2018 %>%
  ggplot(aes(x = continent)) +
  geom_bar() 

# coordonate flip
gapminder_2018 %>%
  ggplot(aes(x = continent)) +
  geom_bar() + 
  coord_flip()

Figura 2: Exemplu de inversare a axelor de coordonate prin intermediul funcției coord_flip() în contextul unei diagrame cu bare.

În mod similar putem vizualiza prin intermediul unui boxplot diferențele dintre duratele medii de viață de pe fiecare continent:

Figura 3: Exemplu de inversare a axelor de coordonate prin intermediul funcției coord_flip() în contextul unei diagrame boxplot.

Un alt mod de vizualizare a datelor calitative (categoriale), frecvent utilizat în practică, este reprezentat de diagrama circulară (pie chart). Trebuie menționat că acest tip de grafic nu este recomandat având în vedere că oamenii tind să supraestimeze unghiurile mai mari de 90 de grade și să subestimeze unghiurile mai mici de 90 de grade astfel fiind dificilă compararea mărimii relative a două sectoare din diagrama circulară (robbins2013?). Pentru a crea o diagramă circulară în ggplot2 vom folosi transformarea în coordonate polare coord_polar. Ideea este de a pleca de la o diagramă cu bare suprapuse (stacked barchart) și apoi să o transpunem în coordonate polare.
Figura de mai jos prezintă o diagramă circulară pentru proporția țărilor de pe fiecare continent care depășesc produsul intern brut median global.

gapminder_2018 %>%
  mutate(gdp_avg = median(gdpPerCap)) %>%
  filter(gdpPerCap > gdp_avg) %>%
  mutate(n_all = n()) %>%
  group_by(continent) %>%
  summarize(rel = n() / unique(n_all)) %>%
  ggplot(aes(x = "", y = rel)) +
  geom_col(aes(fill = continent)) + 
  coord_polar("y")

Figura 4: Exemplu de diagramă circulară folosind funcția coord_polar().

Mai multe detalii despre sistemele de coordonate se pot găsi în lucrarea de referință (Wickham 2016).

Referințe

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.