scale_[nume estetică]_[tip]
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
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:
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)
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):
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):
Î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:
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
):
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))
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
.
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()
.
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")
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.
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ă
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
<- ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp, colour = gdpPerCap,
baza 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")
Î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.
<- gapminder_all %>%
baza 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)
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:
<- ggplot(gapminder_2018, aes(x = gdpPerCap, y = lifeExp, colour = continent,
baza 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 = "")
<- baza +
p1 scale_color_brewer(palette = "Set1") +
labs(subtitle = "Paleta: Set1")
<- baza +
p2 scale_color_brewer(palette = "Dark2") +
labs(subtitle = "Paleta: Dark2")
<- baza +
p3 scale_color_brewer(palette = "Accent") +
labs(subtitle = "Paleta: Accent")
<- baza +
p4 scale_color_brewer(palette = "Spectral") +
labs(subtitle = "Paleta: Spectral")
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
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"))