-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPraktikum4.Rmd
427 lines (318 loc) · 18.8 KB
/
Praktikum4.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
---
title: "Praktikum 4 - ggplot2 jätk"
output: html_notebook
---
## Sissejuhatus
Siin praktikumis jätkame ggplot2 võimaluste õppimisega. Selleks, et tööga pihta saaks hakata, loeme sisse vajalikud paketid ja andmestiku.
```{r}
library(ggplot2)
library(tidyverse)
load("linnad.RData", verbose = T)
```
## Graafikute annoteerimine ja mugandamine
### Graafikute annoteerimine
Telgede ja graafiku annoteerimise viise me oleme juba töö käigus näinud. Paljud asjad saab ära lahendada erinevate skaleerimisfunktsioonide parameetritega. Siiski on paljudele neis olemas ka mugavamad vasted eraldiu funktsioonidega mis hoiavad trükkimist kokku. Neist olulisemad on
- `ggtitle()` - määrame graafiku pealkirja
- `xlab()`, `ylab()` - telgede pealkirjad
- `xlim()`, `ylim()` - telgede väärtusvahemiku määramine
### Graafikute stiil
Vahest on vaja muuta `ggplot2` graafikute üleüldist stiili või mõne elemendi väljanägemist. Näiteks on standardne `ggplot2` graafikute taust hall, mis ei ole alati parim lahendus. Seda on lihtne muuta käsuga `theme_bw` mis teeb tausta valgeks ja muudab ka portsu muude graafiku elementide värve ja kuju. Neid funktsioone on veel, tasub vaadata mida RStudio pakub, kui kirjutada algus `theme_` . Veel rohkem erinevaid teemasid on olemas paketis ggthemes või võite proovida näiteks
```{r}
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = birth_class)) +
geom_point() +
theme_bw()
```
Neid funktsioone on veel, tasub vaadata mida RStudio pakub, kui kirjutada algus `theme_` . Veel rohkem erinevaid teemasid on olemas paketis `ggthemes` (<https://yutannihilation.github.io/allYourFigureAreBelongToUs/ggthemes/>).
```{r}
library(ggthemes)
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = birth_class)) +
geom_point() +
theme_wsj()
```
Täpsemalt saab muuta konkreetseid elemente käsuga `theme`. Siin on terve ports parameetreid mis töötavad hierarhiliselt. Olulisemad on toodud järgmisel joonisel.
![](images/Screenshot 2021-02-22 at 10.54.18.png)
Nendele saabväärtuseks anda käske `element_text`, `element_line` ja `element_rect` vastavalt parameetri tüübile. Käskude `element_*` parameetrid vastavad suhteliselt täpselt sarnaste elementide grid paketis kasutatavatele parameetritele. Oluline funktsioon on ka element_blank mis vastava elementi lihtsalt ära kustutab.
```{r}
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = birth_class)) +
geom_point() +
theme(panel.background = element_rect(fill = "pink"), panel.grid.minor = element_blank())
```
Väga oluline parameeter käsus theme on ka `legend.position`. Kui selle väärtuseks on `"none"` kustutatakse legend ära. Väärtused `"left"`, `"right"`, `"top"` ja `"bottom"` käituvad nagu võiks oodata . Andes ette kahe elemendilise vektori paigutab ta legendi graafiku ala sees vastavalt antud koordinaatidele, paralleelselt on hea kasutada ka `legend.justification` argumenti, mis võimaldab legendi paigutust täpsemalt kontollida.
```{r}
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = birth_class)) +
geom_point() +
theme(legend.position = "none")
```
```{r}
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = birth_class)) +
geom_point() +
theme(legend.position = "bottom")
```
```{r}
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = birth_class)) +
geom_point() +
theme(legend.position = c(1,1), legend.justification = c(1, 1))
```
#### Ülesanded
- Proovi saavutada umbes järgmine pilt.
![](images/Screenshot 2021-02-28 at 16.31.54.png)
```{r}
ggplot(linnad, aes(bachelor, high_scl, color = income_class))+
geom_point() +
theme(panel.background = element_rect(fill = "#FFD700"))+
theme(legend.position = c(1,0.398), legend.justification = c(1, 1), legend.box.background = element_rect(color="black", size=1))+
theme(axis.text.x = element_text(angle = 45))+
scale_colour_brewer(type = "div", palette = 2)
```
## Graafikute salvestamine
Grafikuid saab salvestada käsuga `ggsave()`, Kui ette anda vaid faili nimi, siis salvestab see käsk viimase graafiku, mis sai joonistatud, kusjuures suuruse võtab ta akna järgi ning failitüübi määrab faili nime laiendi järgi. Parameetreid `width` ja `height` kasutades on võimalik ära määrata ka täpselt joonise mõõdud (tollides).
```{r}
ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = Poverty_factor)) +
geom_point() +
theme(legend.position = c(1,1), legend.justification = c(1, 1))
ggsave("plot1.png")
ggsave("plot1.pdf")
ggsave("plot1_wide.png", width = 10, height = 5)
```
## Erinevate graafikute kokku panemine
Graafikute tahkudeks jagamine toimib väga hästi, kui me tahame ühte tüüpi graafikut jagada mitmeks. Kuid kui me tahame erinevat tüüpi graafikuid erinevatel muutujatel samal pildil kõrvuti näidata, siis sama lähenemine ei tööta. Siin tulevad appi lisapaketid. Näiteks `patchwork` on üks mis võimaldab `ggplot2` graafikuid kokku panna.
Enne, kui läheme `patchwork`-i enda juurde vaatame ühte kasulikku nippi. Nimelt on võimalik ggplot graafik muutujana salvetada. Joonistatakse see alles siis kui muutuja väärtus on vaja välja trükkida.
```{r}
p = ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = Poverty_factor)) +
geom_point()
p
p + theme_bw()
```
Loeme sisse paketi patchwork ja defineerime kolm graafikut mida kombineerima hakata.
```{r}
library(patchwork)
p1 = ggplot(linnad, aes(x = per_capita_inc)) +
geom_histogram() +
ggtitle("Plot 1")
p2 = ggplot(linnad, aes(x = per_capita_inc, y = unemployment_rate, colour = Poverty_factor)) +
geom_point() +
ggtitle("Plot 2")
p3 = ggplot(linnad, aes(x = State, y = unemployment_rate, fill = State)) +
geom_boxplot() +
ggtitle("Plot 3")
p1
p2
p3
```
Patchworkis tehakse ka graafikutega "tehteid". Selleks, et graafikuid kõrvuti panna on tehe `|`.
```{r}
p1 | p2
```
Üksteise alla saab panna graafikuid tehtega `/` .
```{r}
p1/p2
```
Tehteid saab ka kombineerida, siis tuleb tähelepanu juhtida tehete järjekorrale
```{r}
p1 | p2 / p3
```
```{r}
(p1 | p2) / p3
```
Selleks, et piltide paigutust paremini kontrollida on funktsioon `plot_layout`, millega saab joonise erinevaid aspekte muuta. Näiteks `heights` parameeter võimaldab muuta piltide suhtelisi kõrguseid.
```{r}
p1 / p2 / p3 + plot_layout(heights = c(2, 2, 4))
```
Argument widths töötab sama moodi.
```{r}
(p1 | p2 | p3) + plot_layout(widths = c(2, 2, 4))
```
Eelmine pilt jäi kole sest vastavate laiustega on graafikute andmeid näitavad paneelid. Kuna kahel graafikul on aga legend, siis nende laiust arvesse ei võeta. Küll aga on võimalik argumendiga guides kõikidelt piltidelt legendid kokku koguda.
```{r}
(p1 | p2 | p3) + plot_layout(widths = c(2, 2, 4), guides = "collect")
```
Paketis patchwork on veel palju võimalusi ja tasub uurida paketi kodulehte <https://github.com/thomasp85/patchwork> ja seal viidatud õpetusi.
#### Ülesanded
- Proovige tekitada järgnev pilt
![](images/Screenshot 2021-02-28 at 16.18.22.png)
```{r}
p1 / (p2 | p3) + plot_layout(widths = c(4, 2, 2), guides = "collect")
```
## ggplot2-ga graafikute joonistamise harjutamine
Selle ja eelmise praktikumi põhjal peaks olulisemad oskused ggplot2 kasutamiseks olemas olema. Nüüd proovime neid rakendada, kasutades ka teadmisi teisest loengust, kus sai tutvustatud graafikute valimise põhimõtteid täpsemalt.
Loeme sisse kõigepealt andmestiku, mis kirjeldab siis 2000 inimese kehamassi indekseid ja juhuslikul päeval tehtud sammude arvu. Iga inimese kohta on ka antud sugu, vanus ja vanusegrupp. Loeme andmestiku sisse.
```{r}
load("bmi.RData", verbose = T)
bmi
```
Iga ülesande puhul tasub proovida erinevaid variante ja mõelda milline töötab antud olukorras paremini ja miks. Meeldetuletuseks, siin on olulisemad käsud mida vaja võib minna
- `geom_point`
- `geom_histogram`
- `geom_bar`
- `geom_boxplot`
- `geom_density`
- `geom_violin`
- `geom_smooth`
- `facet_grid`
#### Ülesanded
- Milline tehtud sammude jaotus? Millist geomeetrilist esitust võib selle uurimiseks kasutada?
- Milline on tehtud sammude jaotus sugude kaupa? Vihjed:
- et joonistada histogrammid üksteise peale tasub panna `position = "identity"`
- argument `alpha` kontrollib värvide läbipaistvust
- Kumma soo esindajad teevad mediaanis vähem sammusid?
- Tee läbi see sama võrdlus vanusegruppide kaupa. Kas järeldus on sama?
- Vaata vanusegruppide arvukust sugude kaupa. Kas jaotus on sarnane või erinev?
- Kas vanuse ja tehtud sammude vahel on seos? Kas seos tundub lineaarne?
- Milline on seos kehamassi indeksi ja sammude vahel? Kas seos on lineaarne ja või on tegu millegi keerukamaga?
## Kodune ülesanne
Meil on andmestik erinevate maailma riikide ning nende sotsiaalsete indeksite kohta. See andmestik on failis `countries.RData` mis on kaasas praktikumi materjalidega. Sellel andmestikul tuleks uurida küsimust, kas ja milline on seos laste arvul naise kohta (`child_per_woman`) oodatava elueaga (`life_expectancy`). Sealjuures tuleks pildil arvesse võtta ka riikide populatsiooni (`population_total`), maailmajagu (`region`) ning jaotust sissetuleku järgi (`income_groups`). Kõik muutujad võib panna ühele pildile või võib kombineerida ka mitmest panellist patchworki kasutades. Kuna andmed on keerukad võib pildi salvestada suuremana (kasutades käsku `ggusave` ja argumente `height` ja `width`), et kõigel vajalikul piisavalt ruumi oleks.
Esitada tuleb graafikut genereeriv **kood** ja ka mõne lauseline **järeldus**, mille te pildilt olete välja lugenud.
```{r}
load("countries.RData", verbose = T)
```
Vaadates üldist suhet (muid tunnused pole arvesse võetud) kirjeldavat graafikut, näeme, et suhe laste arvu ja oodata eluea suhe negatiivne (mida suurem on laste arv, seda madalam on oodatav eluiga). Vaadates all vasakul olevat graafikut, näeme, et sissetuleku suurus omab potentsiaalselt mõju laste arvu ja oodatava eluea suhtele (vähemalt kõrgeimal tasemel). Alumine keskmine graafik näitab, et potentsiaalselt omab mõju piirkond, kus riik asub, sest suhe laste arvu ja eluea pikkuse vahel muutub Euroopas vastupidiseks. Samas on pildilt näha, et Euroopas elavad ka kõrgeima sissetulekuga inimesed. Seega on raske eristada piirkonna (sissetulekust eraldi eksisteerivana) ja sissetuleku (piirkonnast eraldi eksisteerivana) mõju. Kuigi kõrge sissetulekuga riikide seas on märgata ka aasia riike, on suurem osa neist siiski madalama sissetulekuga. Populatsiooni suurus ei tundu kvantiilide põhjal kategooriateks jaotatuna mõju avaldavat.
```{r}
library(ggplot2)
library(tidyverse)
library(RColorBrewer)
library(patchwork)
library(sjmisc)
load("countries.RData", verbose = T)
#populatsioonid kvantiilide põhjal 4ks kategooriaks
countries$pop_grouped <- split_var(countries$population_total, n = 4)
#eralduskohad
splits <- prettyNum(quantile(countries$population_total, c(.25,.50,.75,1), names = FALSE),big.mark=",", scientific = FALSE)
#Populatsioonikategooriate nimed
nimed <- c(paste0("0-",splits[1]),
paste0(splits[1],"-",splits[2]),
paste0(splits[2],"-",splits[3]),
paste0(splits[3],"-",splits[4]))
countries$pop_grouped <- factor(countries$pop_grouped, labels = nimed)
#Muude tunnuse faktorite järjestus ja nimed
countries <- countries %>%
mutate(income_groups = factor(income_groups, levels = c("low_income", "lower_middle_income",
"upper_middle_income", "high_income"))) %>%
mutate(income_groups_est = recode(income_groups, low_income = "Madal sissetulek", lower_middle_income = "Madal keskmine sissetulek",
upper_middle_income = "Kõrge keskmine sissetulek", high_income = "Kõrge sissetulek")) %>%
mutate(region_est = recode(region, africa = "Aafrika", americas = "Ameerika",
asia = "Aasia", europe = "Euroopa"))
#Üldine graafik
general <- ggplot(countries, aes(x=child_per_woman, y = life_expectancy))+
geom_point(aes(shape = region_est, size = log(population_total), color = income_groups_est), alpha = 0.7)+
geom_smooth(method="lm")+
xlab(label = "Lapsi naise kohta")+
ylab(label = "Oodatav eluiga")+
scale_colour_manual(values = c("#ffffb2", "#fecc5c", "#fd8d3c", "#e31a1c"))+
theme(panel.background = element_rect(fill = "gray15"))+
theme(plot.background = element_rect(fill = "lightgray",
colour = "gray30",
size = 2))+
theme(legend.background = element_rect(fill= "lightgray"))+
theme(axis.text.x = element_text(face = "bold",
color = "black",
size = 10),
axis.text.y = element_text(face = "bold",
color = "black",
size = 10))+
theme(axis.title.x = element_text(face = "bold", color = "black",
size = 12),
axis.title.y = element_text(face = "bold", color = "black",
size = 12))+
theme(legend.key=element_rect(fill = "gray30"),
legend.key.size = unit(2,"line"),
legend.title=element_text(size=15),
legend.text=element_text(size=13))+
theme(legend.position = c(1,1),
legend.justification = c(1, 1),
legend.box = "horizontal")+
guides(shape = guide_legend(override.aes = list(size=4)))+
guides(colour = guide_legend(override.aes = list(size=4)))+
labs(color = "Sissetulek", fill = "Sissetulek", size = "log(populatsioon)", shape = "Piirkond")+
ggtitle(label = "Suhe laste arvu ja oodatava eluea vahel")
#Sissetulekut arvestav graafik
incm_plt <- ggplot(countries, aes(x=child_per_woman, y = life_expectancy, color = income_groups_est))+
geom_point(alpha = 0.7, size = 3)+
geom_smooth(aes(fill = income_groups_est), method="lm")+
xlab(label = "Lapsi naise kohta")+
ylab(label = "Oodatav eluiga")+
scale_colour_manual(values = c("#ffffb2", "#fecc5c", "#fd8d3c", "#e31a1c"))+
scale_fill_manual(values = c("#ffffb2", "#fecc5c", "#fd8d3c", "#e31a1c"))+
theme(panel.background = element_rect(fill = "gray15"))+
theme(plot.background = element_rect(fill = "lightgray", colour = "gray30", size = 2))+
theme(legend.background = element_rect(fill= "lightgray"))+
theme(legend.position = c(1,1), legend.justification = c(1, 1))+
theme(axis.text.x = element_text(face = "bold", color = "black",
size = 10),
axis.text.y = element_text(face = "bold", color = "black",
size = 10))+
theme(axis.title.x = element_text(face = "bold", color = "black",
size = 12),
axis.title.y = element_text(face = "bold", color = "black",
size = 12))+
theme(legend.key=element_rect(fill = "gray30"),
legend.key.size = unit(2,"line"),
legend.title=element_text(size=12),
legend.text=element_text(size=10))+
guides(size=FALSE)+
labs(color = "Sissetulek", fill = "Sissetulek")+
ggtitle(label = "Suhe laste arvu ja oodatava eluea vahel \narvestades sissetulekuga")
#Piirkonda arvestav graafik
rgn_plt <- ggplot(countries, aes(x=child_per_woman, y = life_expectancy, colour = region_est))+
geom_point(aes(shape = region_est), alpha = 0.7, size = 4)+
geom_smooth(aes(fill = region_est), method="lm")+
xlab(label = "Lapsi naise kohta")+
ylab(label = "Oodatav eluiga")+
scale_colour_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
theme(panel.background = element_rect(fill = "gray15"))+
theme(plot.background = element_rect(fill = "lightgray", colour = "gray30", size = 2))+
theme(legend.background = element_rect(fill= "lightgray"))+
theme(legend.position = c(1,1), legend.justification = c(1, 1), legend.box = "horizontal")+
theme(axis.text.x = element_text(face = "bold", color = "black",
size = 10),
axis.text.y = element_text(face = "bold", color = "black",
size = 10))+
theme(axis.title.x = element_text(face = "bold", color = "black",
size = 12),
axis.title.y = element_text(face = "bold", color = "black",
size = 12))+
theme(legend.key=element_rect(fill = "gray30"),
legend.key.size = unit(2,"line"),
legend.title=element_text(size=15),
legend.text=element_text(size=13))+
theme(legend.key.size = unit(2,"line"))+
labs(colour = "Piirkond", shape = "Piirkond", fill = "Piirkond")+
#guides(colour = guide_legend(override.aes = list(size=4)))+
guides(size = FALSE)+
ggtitle(label = "Suhe laste arvu ja oodatava eluea vahel \narvestades piirkonnaga")
#Populatsiooni arvestav graafik
pop_plt <- ggplot(countries, aes(x=child_per_woman, y = life_expectancy, color = pop_grouped))+
geom_point(aes(size = log(population_total)), alpha = 0.7)+
geom_smooth(aes(fill = pop_grouped), method="lm")+
xlab(label = "Lapsi naise kohta")+
ylab(label = "Oodatav eluiga")+
scale_colour_manual(values = c("#ffffcc", "#a1dab4", "#41b6c4", "#225ea8"))+
scale_fill_manual(values = c("#ffffcc", "#a1dab4", "#41b6c4", "#225ea8"))+
theme(panel.background = element_rect(fill = "gray15"))+
theme(plot.background = element_rect(fill = "lightgray", colour = "gray30", size = 2))+
theme(legend.background = element_rect(fill= "lightgray"))+
theme(legend.position = c(1,1), legend.justification = c(1, 1), legend.box = "horizontal")+
theme(axis.text.x = element_text(face = "bold", color = "black",
size = 10),
axis.text.y = element_text(face = "bold", color = "black",
size = 10))+
theme(axis.title.x = element_text(face = "bold", color = "black",
size = 12),
axis.title.y = element_text(face = "bold", color = "black",
size = 12))+
theme(legend.key=element_rect(fill = "gray30"),
legend.key.size = unit(1,"line"),
legend.title=element_text(size=12),
legend.text=element_text(size=10))+
labs(size = "log(populatsioon)", fill = "Populatsiooni vahemik", color = "Populatsiooni vahemik") +
ggtitle(label = "Suhe laste arvu ja oodatava eluea vahel \narvestades populatsiooniga")
board <- general / (incm_plt | rgn_plt | pop_plt)
ggsave("big_plot.png", board, width = 50, height = 30, units = "cm")
```
Hindame järgnevaid aspekte
- Järelduse asjakohasus ja kui lihtne on seda pildiga kokku viia
- Graafiku(te) joonistamisel tehtud valikute asjakohasus
- Graafilised detailid ja nende valik
- Värviskaalad
- Diskreetsete muutujate järjekord
- Kõik tekstid pildil võiksid olla kergesti loetavad (suurte tähtedega, grammatiliselt korrektsed, piisavalt kirjeldavad)