Gestionarea scalelor (scales)

De fiecare dată când specificăm o corespondență de estetică/aspect (aesthetic mapping), funcția ggplot folosește o anumită scală (predefinită în funcție de tipul esteticii) pentru a determina intervalul de valori pe care datele trebuie să le verifice. O corespondență estetică (i.e. specificată cu aes()) ne spune doar că o variabilă ar trebui asociată unei caracteristici ce ține de aspect și nu cum trebuie să aibă loc această relație. De exemplu, atunci când folosim estetica colour (aes(colour = x) nu specificăm nicăieri ce culori trebuie folosite pentru trasarea elementelor specifice nivelelor variabilei x. Aceeași observație este valabilă și pentru alte atribute estetice, i.e. size, fill, shape, etc. Pentru a specifica ce culoare, mărime, formă, etc. să fie utilizată trebuie modificată scala corespunzătoare. În pachetul ggplot2, scalele (scales) pot fi modificate prin intermediul funcțiilor de tipul

scale_[nume estetică]_[tip]

unde nume estetică reprezintă numele elementului estetic (i.e. x, y, colour, fill, etc.) iar tip reprezintă tipul scalei folosite pentru elementul ales (i.e. continuous, discrete, manual, gradient, etc.). În funcție de estetică, tipul scalei poate să difere

Trebuie menționat că ggplot asociază în mod automat fiecărui element estetic folosit în trasarea graficului o scală. De exemplu dacă scriem

ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_point(aes(colour = continent))

în realitate are loc

ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp)) +
  geom_point(aes(colour = continent)) + 
  scale_x_continuous() +
  scale_y_continuous() +
  scale_color_discrete()

dar pentru a evita scrierea manuală a fiecărei scale, ggplot2 face lucrurile automat. Este foarte important de menționat că scalele pot modifica unul din cele două elemente de ghidaj (guides) ale unui grafic: axele și legendele. În ggplot2 cele două elemente, chiar dacă vizual sunt diferite, ele sunt tratate în mod similar, legătura fiind evidențiată în tabelul următor:

Tabelul 1: Cele două elemente de ghidaj ale unui grafic: axele și legendele.
Axă Legendă Numele parametrului
Nume (Label) Titlu (Title) name
Markeri (Ticks & grid line) Intrările legendei (Key) breaks
Etichete Markeri (Tick label) Etichetele intrărilor legendei (Key label) labels

În general, scalele disponibile în ggplot2 pot fi împărțite în patru categorii, primele trei fiind cele mai utilizate:

  • scale continue de poziție folosite pentru a face corespondența dintre datele de tip numeric sau de tip temporal (date/time) și poziția pe x sau y (i.e. scale_x_continuous, scale_y_continuous)

  • scale de culori care permit corespondența dintre valorile continue sau discrete ale datelor și culori (i.e. scale_color_discrete, scale_fill_continuous, scale_fill_gradient)

  • scale manuale, utilizate pentru a defini relația dintre valorile discrete ale datelor și mărimea (size), tipul liniei (linetype), forma (shape) sau culoarea (colour) dorită

  • scale identice, folosite pentru a trasa variabilele fără a le scala (de exemplu atunci când avem deja un vector de culori)

O scală continuă va fi folosită cu precădere atunci când vorbim de date numerice (unde există un set continuu de numere), în timp ce o scală discretă va gestiona elemente precum culorile, forma punctelor sau tipul liniilor (deoarece există o listă mică de culori distincte).

În tabelul de mai jos sunt prezentate o parte dintre scalele cele mai utilizate (pentru mai multe detalii se poate consulta documentația pachetului ggplot2)

Tabelul 2: Principalele scale.
Scala Tipul Exemple
scale_color_ identity scale_fill_continuous
scale_fill_ manual scale_color_discrete
scale_size_ continuous scale_size_manual
discrete scale_size_discrete
scale_shape_ discrete scale_shape_discrete
scale_linetype_ identity scale_shape_manual
manual scale_linetype_discrete
scale_x_ continuous scale_x_continuous
scale_y_ discrete scale_y_discrete
reverse scale_x_log
log scale_y_reverse
date scale_x_date
datetime scale_y_datetime

Scale de poziție

Pentru a ajusta scala axei x pentru o variabilă continuă vom folosi scale_x_continuous. Utilizarea funcțiilor de scală permite modificarea mai multor proprietăți ale elementului estetic, de exemplu în cazul scalei pe axa x putem modifica aspecte ale axei precum eticheta/titlul axei (name), poziția (position) sau distanța dintre markeri (breaks sau minor_breaks) și numele acestora (labels). Pentru alte elemente estetice în afara lui x și y, axa va fi de obicei legenda graficului și astfel modificarea scalei unui asemenea element permite modificarea elementelor componente ale legendei (nume, etichete, culori, etc.).

Ca exemplu, vom folosi setul de date gapminder_2018 și folosind scale_x_continuous vom modifica numele axei x, poziția markerilor de separare (breaks) principali și secundari (minor_breaks):

Figura 1: Exemplu de utilizare a scale_x_continuous().

Este posibil să dorim de asemenea schimbarea numelui legendei ce corespunde variabilei pop (populației) din pop în Populația, să afișăm mărimile 1e7, 5e7, 1e8, 2e8, 5e8, 1e9 (breaks) și să schimbăm intervalul de valori (minim-maxim) pentru mărimea simbolului (range):

Figura 2: Exemplu de utilizare a scalelor scale_x_continuous() și scale_size().

În plus, putem să adăugăm funcții ca argument al parametrilor breaks și labels, în primul caz funcția returnând un vector de valori numerice care să corespundă elementelor de marcaj iar în cazul etichetelor va primi ca date de intrare un vector numeric de elemente de marcaj și va returna un vector de etichete. De exemplu, pentru a adăuga simbolul $ în dreptul valorilor produsului intern brut vom folosi funcții din pachetul scales precum dollar_format() iar pentru a modifica axa y vom crea propria funcție:

Figura 3: Exemplu de utilizare a scalelor scale_x_continuous() și scale_y_continuous() și a argumentelor breaks și labels.

Fiecare funcție de scalare permite utilizarea unui număr diferit de parametrii, o parte dintre aceștia regăsindu-se în tabelul de mai jos (pentru a vizualiza toți parametrii disponibili se poate consulta documentația funcției, i.e. ?scale_x_continous):

Tabelul 3: Parametrii scalei de poziție scale_x_continuous.
Parametru Descriere
name Eticheta (label) axei sau numele legendei
breaks Vector de puncte de marcaj
minor_breaks Vector de puncte de marcaj intermediare
labels Etichete folosite pentru fiecare punct de marcaj
limits Limitele intervalului de valori ale axei

Modul de folosire a parametrilor name, breaks, minor.breaks și labels a fost ilustrat în exemplele anterioare. Parametrul limits este derivat din domeniul de valori al setului de date și este folosit cu precădere pentru a scoate în evidență o subregiune a graficului. Atunci când facem referire la scale continue parametrul limits primește ca argument de intrare un vector cu două valori (minim și maxim).

ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp, colour = continent, size = pop)) +
  geom_point() + 
  scale_x_continuous(name = "Produsul intern brut pe cap de locuitor", 
                     breaks = c(500, 5000, 15000, 25000, 
                                50000, 75000, 100000, 125000), 
                     minor_breaks = c(500, 2500, 7500), 
                     limits = c(25000, 50000))

Figura 4: Exemplu de utilizare a scalei scale_x_continuous() împreună cu parametrul limits.

Deoarece modificarea limitelor axelor este o operație des întânlnită atunci când efectuăm analize exploratorii a datelor cu care lucrăm, pachetul ggplot2 pune la dispoziție o serie de funcții predefinite precum xlim(), ylim() sau lims().

Pachetul ggplot2 pune la dispoziție și o serie de scale care permit modificarea axelor, de exemplu, prin inversarea valorilor (i.e. scale_x_reverse) sau prin transformarea acestora într-o scală logaritmică (folosind scale_x_log10 sau scale_x_continuous(trans = "log10")) ori printr-o altă funcție (i.e. scale_x_sqrt sau scale_x_continuous(trans = "sqrt")). Pentru mai multe transformări se poate consulta documentația funcției scale_x_continuous la argumentul trans.

Figura 5: Exemplu de utilizare a scalelor scale_x_reverse(), scale_x_log10() și scale_x_sqrt().

Atunci când avem de-a face cu variabile/date care sunt în format de date de timp (format Date sau POSIXct) este recomandată utilizarea funcțiilor predefinite scale_x_date și respectiv scale_x_datetime care dispun în plus de argumentele date_breaks și date_labels. Argumentul date_breaks permite poziționarea elementelor de marcaj în funcție de unitățile de timp (ani, luni, săptpmâni, etc.), astfel date_breaks = 2 years va pasa marcaje din doi în doi ani. Argumentul date_labels asigură ilustrarea etichetelor pentru marcaje în format strptime().

Tabelul 4: Ilustrarea etichetelor în format strptime().
Sir de caractere Descriere
%S secunde (00-59)
%M minute (00-59)
%l ore, format ceas 12 ore (1-12)
%I ore, format ceas 12 ore (01-12)
%p am/pm
%H ore, format ceas 24 ore (00-23)
%a zilele săptămânii, sub forma (Mon-Sun)
%A zilele săptămânii, sub forma (Monday-Sunday)
%e ziua din lună (1-31)
%d ziua din lună (01-31)
%m luna, format numeric (01-12)
%b luna, format abreviat (Jan-Dec)
%B luna, nume întreg (January-December)
%y an, fără specificarea secolului (00-99)
%Y an, cu specificarea secolului (0000-9999)

De exemplu dacă vrem să afișăm date precum 23/08/1944 vom folosi șirul de caractere "%d/%m/%Y". Următorul cod ilustrează aceste opțiuni în contextul setului de date gapminder_all unde ne interesăm la evoluția duratei medii de viață în țara noastră după anul 1900.

gapminder_all %>% 
  filter(country == "Romania", 
         as.numeric(year) > 1900) %>%
  mutate(year = as.Date(year, format = "%Y")) %>%
ggplot(aes(x = year, y = lifeExp)) +
  geom_point() + 
  scale_x_date(date_labels = "%y", date_breaks = "10 years")

Figura 6: Exemplu de utilizare a scalei scale_x_date().

Scale de culori

O altă clasă de scale des folosite sunt cele care corespund esteticii de culoare (colour - culoarea marginală/exterioară și respectiv fill - culoarea de umplere). Pachetul ggplot2 pune la dispoziție mai multe tipuri de scale diferențiate după cum variabilele de scalare sunt continue sau discrete. Spațiul culorilor din ggplot2 este de tip HCL (hue, chroma și luminance), pentru mai multe detalii se poate consulta http://www.handprint.com/HP/WCL/color7.html, dar se pot folosi si palete de culoare de tip Brewer (pentru explorarea acestora se poate vizita https://colorbrewer2.org/). Acestea din urmă pot fi clasificate în trei categorii: secvențiale, divergente și calitative unde primele două categorii corespund variabilelor continue iar cea de-a treia corespunde variabilelor cu valori discrete.

Figura 7: Exemplu de palete de culori.

Atunci când utilizăm variabile continue se folosesc gradiente de culoare prin intermediul funcțiilor generice de forma scale_[estetică culoare]_[tip], după cum urmează

Tabelul 5: Scale de culori ce folosesc gradiente de culoare.
Funcție generică Scală Tip Descriere
scale_[estetică culoare]_[tip] colour gradient Scală predefinită (similară cu scale_colour_continuous()) care folosește un gradient de culoare bazat pe două culori (low și high)
fill gradient2 Scală care folosește un gradient de culoare cu trei valori (low, high și mid - pentru acesta din urmă se poate selecta valoarea de midpoint)
gradientn Scală care folosește un gradient de culoare bazat pe \(n\) valori
distiller Scală care este bazată pe palete de tip Brewer

Pentru ilustrare vom folosi setul de date gapminder_2018:

# grafic de baza
baza <- ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp, colour = gdpPerCap, 
                           size = pop)) +
  geom_point()

# gradient 2 culori
baza + 
  scale_color_gradient(low = "blue", high = "red")

# gradient 3 culori
baza + 
  scale_color_gradient(low = "blue", high = "red")

# gradient Brewer - RdPu
baza + 
  scale_color_distiller(palette = "RdPu")

Figura 8: Ilustrarea scalelor de culori cu gradient.

În cazul variabilelor discrete, putem folosi patru scale pentru fiecare dintre esteticile colour și fill: scale_[estetică culoare]_hue(), scale_[estetică culoare]_brewer(), scale_[estetică culoare]_gray() și scale_[estetică culoare]_manual(). Scala predefinită în cazul variabilelor discrete este scala scale_[estetică culoare]_hue() care alege culori egal depărtate pe roata de culori de tip HCL. Scala scale_[estetică culoare]_brewer() folosește paletele de culori de tip Brewer iar scala scale_[estetică culoare]_gray() folosește o paletă de griuri, de la gri deschis la gri închis.

Pentru a ilustra scala scale_[estetică culoare]_hue vom folosi setul de date gapminder_all și vom afișa variația produsului intern brut pe cap de locuitor în România după anul 2000.

baza <- gapminder_all %>% 
  filter(country == "Romania", 
         as.numeric(year) > 2010) %>%
  ggplot(aes(x = year, y = gdpPerCap, fill = year)) + 
  geom_bar(stat = "identity") 

baza + 
  scale_fill_hue(c = 50)

baza + 
  scale_fill_hue(h = c(180, 300))

baza + 
  scale_fill_hue(l = 80)

Figura 9: Ilustrarea scalelor de culori pentru variabile discrete.

Următoarele grafice prezintă aceeași figură (situarea țărilor din setul de date gapminder_2018 în funcție de produsul intern brut pe cap de locuitor și durată medie de viață) ilustrată cu ajutorul funcției scale_[estetică culoare]_brewer() pentru patru palete de culori diferite:

baza <- ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp, colour = continent, 
                           size = pop), alpha = 0.7) +
  geom_point() + 
  scale_x_continuous(name = "Produsul intern brut pe cap de locuitor", 
                     breaks = c(500, 5000, 15000, 25000, 
                                50000, 75000, 100000, 125000), 
                     minor_breaks = c(500, 2500, 7500)) + 
  scale_size(name = "Populatia", 
             breaks = c(1e7, 5e7, 1e8, 2e8, 5e8, 1e9),
             range = c(0.1, 10)) + 
  guides(size = "none", colour = "none") +
  labs(x = "", y = "")

p1 <- baza + 
  scale_color_brewer(palette = "Set1") +
  labs(subtitle = "Paleta: Set1")

p2 <- baza + 
  scale_color_brewer(palette = "Dark2") +
  labs(subtitle = "Paleta: Dark2")

p3 <- baza + 
  scale_color_brewer(palette = "Accent") +
  labs(subtitle = "Paleta: Accent")

p4 <- baza + 
  scale_color_brewer(palette = "Spectral") +
  labs(subtitle = "Paleta: Spectral")

Figura 10: Exemplu de utilizare a scalei de culori scale_color_brewer() pentru patru palete diferite.

Funcția scale_[estetică culoare]_manual() este folosită în special atunci când dorim să folosim propria paletă de culori. De exemplu, să presupunem că dorim să colorăm statele de pe fiecare continent cu o culoare corespunzătoare

Figura 11: Exemplu de culori pentru utilizarea scalei manuale.

atunci putem scrie

ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp, colour = continent, size = pop)) +
  geom_point() + 
  scale_colour_manual(values = c("#099DD7","#248E84","#F2583F", "#96503F"))

Figura 12: Exemplu de utilizare a scalei scale_colour_manual().