11 Graafilised lahendused

R-s on kaks olulisemat graafikasüsteemi, mida võib vaadata nagu kaht eraldi dialekti, mis mõlemad elavad R keele sees.

  • Baasgraafika võimaldab lihtsate vahenditega teha kiireid ja suhteliselt ilusaid graafikuid. Seda kasutame sageli enda tarbeks kiirete plottide tegemiseks. Baasgraafika abil saab teha ka väga keerukaid ja kompleksseid publitseerimiskavaliteedis graafikuid.
  • “ggplot2” raamatukogu on hea ilupiltide vormistamiseks ja keskmiselt keeruliste visualiseeringute tegemiseks.

Kuigi “ggplot2” ja tema sateliit-raamatukogud on meie põhilised huviobjekid, alustame siiski baasgraafikast. Ehki me piirdume vaid väga lihtsate näidetega tasub teada, et baasgraafikas saab teha ka komplekseid visualiseeringuid: http://shinyapps.org/apps/RGraphCompendium/index.php

Laadime peatükis edaspidi vajalikud libraryd:

library(tidyverse)
library(ggthemes)
library(ggrepel)
library(wesanderson)
library(ggridges)
library(viridis)
library(zoo)
library(graphics)

11.1 Baasgraafika

Kõigepealt laadime tabeli, mida me visuaalselt analüüsima hakkame:

iris <- as_tibble(iris)
iris
#> # A tibble: 150 x 5
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#>          <dbl>       <dbl>        <dbl>       <dbl>
#> 1          5.1         3.5          1.4         0.2
#> 2          4.9         3            1.4         0.2
#> 3          4.7         3.2          1.3         0.2
#> 4          4.6         3.1          1.5         0.2
#> 5          5           3.6          1.4         0.2
#> 6          5.4         3.9          1.7         0.4
#> # … with 144 more rows, and 1 more variable:
#> #   Species <fct>

See sisaldab mõõtmistulemusi sentimeetrites kolme iirise perekonna liigi kohta. Esimest korda avaldati need andmed 1936. aastal R.A. Fisheri poolt.

Baasgraafika põhiverb on plot(). See püüab teie poolt ette antud andmete pealt ära arvata, millist graafikut te soovite. plot() põhiargumendid on x ja y, mis määravad selle, mis väärtused asetatakse x-teljele ja mis läheb y-teljele. Esimene argument on vaikimisi x ja teine y.

Kui te annate ette faktorandmed, on vastuseks tulpdiagramm, kus tulbad loevad üles selle faktori kõigi tasemete esinemiste arvu. Antud juhul on meil igast liigist mõõdetud 50 isendit.

plot(iris$Species)

Kui te annate ette ühe pideva muutuja:

plot(iris$Sepal.Length)

Nüüd on tulemuseks graafik, kus on näha mõõtmisete rea (ehk tabeli) iga järgmise liikme (tabeli rea) väärtus. Siin on meil kokku 150 mõõtmist muutujale Sepal.Length.

Alternatiiv sellele vaatele on stripchart()

stripchart(iris$Sepal.Length)

Enam lihtsamaks üks joonis ei lähe!

Mis juhtub, kui me x-teljele paneme faktortunnuse ja y-teljele pideva tunnuse?

plot(iris$Species, iris$Sepal.Length)

Vastuseks on boxplot. Sama graafiku saame ka nii:

boxplot(iris$Sepal.Length ~ iris$Species).

Siin on tegu R-i mudeli notatsiooniga: y-telje muutuja, tilde, x-telje muutuja. Tilde näitab, et y sõltub x-st stohhastiliselt, mitte deterministlikult. Deterministliku seost tähistatakse võrdusmärgiga (=).

Aga vastupidi?

plot(iris$Sepal.Length, iris$Species)

Pole paha, see on üsna informatiivne scatterplot.

Järgmiseks kahe pideva muutuja scatterplot, kus me veel lisaks värvime punktid liikide järgi.

plot(iris$Sepal.Length, iris$Sepal.Width, col = iris$Species)

Ja lõpuks tõmbame läbi punktide punase regressioonijoone:

plot(iris$Sepal.Length, iris$Sepal.Width)
model <- lm(iris$Sepal.Width ~ iris$Sepal.Length)
abline(model, col = "red", lwd = 2)

“lwd” parameeter reguleerib joone laiust. lm() on funktsioon, mis fitib sirge vähimruutude meetodil.

Mis juhtub, kui me anname plot() funktsioonile sisse kogu irise tibble?

plot(iris, col = iris$Species)

Juhhei, tulemus on paariviisiline graafik kõigist muutujate kombinatsioonidest.

Ainus mitte-plot verb, mida baasgraafikas vajame, on hist(), mis joonistab histogrammi.

hist(iris$Sepal.Length)

Histogrammi tegemiseks jagatakse andmepunktid nende väärtuste järgi bin-idesse ja plotitakse igasse bin-i sattunud andmepunktide arv. Näiteks esimeses bin-is on “Sepal.Length” muutuja väärtused, mis jäävad 4 ja 4.5 cm vahele ja selliseid väärtusi on kokku viis. Histogrammi puhul on oluline teada, et selle kuju sõltub bin-ide laiusest. Bini laiust saab muuta kahel viisil, andes ette bin-ide piirid või arvu:

hist(iris$Sepal.Length, breaks = seq(4, 9, by = 0.25))

või

hist(iris$Sepal.Length, breaks = 15)

See viimane on kiire viis bin-i laiust reguleerida, aga arvestage, et sõltuvalt andmetest ei pruugi “breaks = 15” tähendada, et teie histogrammil on 15 bin-i.

Ja lõpuks veel üks histogramm, et demonstreerida baas R-i võimalusi (samad argumendid töötavad ka plot() funktsioonis):

hist(iris$Sepal.Length,
     freq = FALSE, 
     col="red",
     breaks = 15,
     xlim = c(3, 9), 
     ylim = c(0, 0.6), 
     main = "Iris",
     xlab = "Sepal length",
     ylab = "Probability density")

abline(v = median(iris$Sepal.Length), col = "blue", lwd = 2) 
abline(h = 0.3, col = "cyan", lwd = 2)

11.2 ggplot2

Ggplot on avaldamiseks sobiva tasemega lihtne aga võimas graafikasüsteem. Näiteid selle abil tehtud visualiseeringutest leiab näiteks järgnevatelt linkidelt:

“ggplot2” paketi põhiverb on ggplot(). See graafikasüsteem töötab kiht-kihi-haaval ja uusi kihte lisatakse pluss-märgi abil. See annab modulaarsuse kaudu lihtsuse ja võimaluse luua ka keerulisi taieseid. Tõenäoliselt on ggplot hetkel kättesaadavatest graafikasüsteemidest parim (kaasa arvatud tasulised programmid!).

11.2.1 graafika “keel”

Millised elemendid on igal endast lugupidaval graafikul?

Esiteks teljestik ehk graafiku ruum. Isegi siis, kui telgi pole välja joonistatud, on nad tegelikult alati olemas ja määravad akna, milles olevaid andmeid graafikul kuvatakse. Teljed võivad olla andmetega samas “ruumis” või transformeeritud (näit. logaritmitud). Lisaks on teljedel on suund (vasakult paremale, ülevalt alla, ringiratast, jms). Vastavalt teljestikule võib graafiku kuju olla 1D sirge, 2D ruut, 3D kuup, kera, ristkülik, trapets vms.

Teiseks graafikule kaardistatud muutujad. Näit võib x teljele kaardistada pideva muutuja “Sepal.Width” ja y teljele pideva muutuja Sepal.Length. Lisaks võime igale andmepunktile kaardistada näiteks värvi, mis vastab faktormuutuja Species tasemele. Aga võib ka x teljele kaardistada muutuja Sepal.Length ja y telje kaardistamata jätta. Esimesel juhul on võimalik joonistada näiteks scatter plot või line plot, teisel juhul aga histogramm või tihedusplot. Seega on graafiku tüüp veel lahtine.

Kolmandaks graafiku tüüp. Osad tüübid kasutavad andmeid otse (n scatter plot), teised arvutavad andmete pealt statistiku, ja plotivad selle (n histogramm). Graafikul on see nn data ink.

Neljandaks graafiku esteeetika. Siia kuuluvad telgede paksused, värvid, tähistused, abijooned, taustavärvid ja kõik muu, mis otseselt ei kajasta andmeid. Graafikul on see nn non-data ink. Oluline on suhe data ink/non-data ink. Kui see suhe on väga madal, siis on teie graafiku teaduslik sisu raskesti leitav ja ilmselt peaks graafikut muutma. Samas, kui see suhe on väga kõrge, tekib oht, et puudu on tähelepanu õigesse kohta juhtivad abijooned ja muu selline, mistõttu andmed ripuvad nagu õhus.

Ongi kõik. Teljestik sinna kaardistatud muutujatega, graafiku tüüp ja teema on kõik, mida me vajame, et teha ükskõik milline joonis

ggploti töövoog kajastab seda kiht-kihi haaval ideoloogiat. Kihid eraldatakse omavahel “+” märgiga. Minimaalselt pead ggplot() funktsioonile andma kolm asja:

  1. andmed, mida visualiseeritakse,

  2. aes() funktsiooni, mis määrab, milline muutuja läheb x-teljele ja milline y-teljele, ning

  3. geom, mis määrab, mis tüüpi visualiseeringut sa tahad.

Lisaks määrad sa aes()-is, kas ja kuidas sa tahad grupeerida pidevaid muutujaid faktori tasemete järgi.

Lisakihtides saab dikteerida,

  1. kuidas joonise elemendid jagada erinevate paneelide (facet, small multiple) vahel, kasutades facet_wrap() ja facet_grid() funktsioone.

  2. määrata joonise teema theme() funktsiooni abil ning manipuleerida värve, telgi jms erinevate abifunktsioonidega.

Kõigepealt suuname oma andmed ggplot() funktsiooni:

ggplot(iris)

Saime tühja ploti. ggplot() loob vaid koordinaatsüsteemi, millele saab kihte lisada. Erinevalt baasgraafikast, ggplot-i puhul ainult andmetest ei piisa, et graafik valmis joonistataks. Vaja on lisada kiht-kihilt instruktsioonid, kuidas andmed graafikule paigutada ja missugust graafikutüüpi visualiseerimiseks kasutada.

Nüüd ütleme, et x-teljele pannakse “Sepal.Length” ja y-teljele “Sepal.Width” andmed. Pane siin tähele, et me suuname kõigepealt selle ploti objekti p ja alles siis trükime selle ggplot objekti välja. Meie näites lisame edaspidi kihte sellele ggplot objektile.

p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width))
p

Graafik on ikka tühi sest me pole ggplotile öelnud, millist visualiseeringut me tahame. Teeme seda nüüd ja lisame andmepunktid kasutades geom_point-i ja lineaarse regressioonijoone kasutades geom_smooth funktsiooni koos argumendiga method = lm. Ka nüüd täiendame ggplot objekti p uute kihtidega:

p <- p + geom_point() + geom_smooth(method = lm)
p

Veelkord, me lisasime kaks kihti: esimene kiht geom_point() visualiseerib andmepunktid ja teine geom_smooth(method = "lm") joonistab regressioonisirge koos usaldusintervalliga (standardviga).

Plussmärk peab ggplot-i koodireas olema vana rea lõpus, mitte uue rea (kihi) alguses

11.2.2 Lisame plotile sirgjooni

Horisontaalsed sirged saab graafikule lisada geom_hline() abil. Pane tähele, et eelnevalt me andsime oma ggplot-i põhikihtidele nime “p” ja seega panime selle alusploti oma töökeskkonda, et saaksime seda korduvkasutada.

Lisame graafikule p horisontaaljoone y = 20:

# Add horizontal line at y = 2O
p + geom_hline(yintercept = 20)

Vertikaalseid sirgeid saab lisada geom_vline() abil, näiteks vertikaalne sirge asukohas x = 3:

# Add a vertical line at x = 3
p + geom_vline(xintercept = 3)

11.2.3 Segmendid ja nooled

“ggplot2” funktsioon geom_segment() lisab joonejupi, mille algus ja lõpp on ette antud.

# Add a vertical line segment
p + geom_segment(aes(x = 4, y = 15, xend = 4, yend = 27))

# Add horizontal line segment
p + geom_segment(aes(x = 2, y = 15, xend = 3, yend = 15))

Saab joonistada ka nooli, kasutades arumenti “arrow” funktsioonis geom_segment()

p + geom_segment(aes(x = 5, y = 30, xend = 3.5, yend = 25),
                 arrow = arrow(length = unit(0.5, "cm")))

11.2.4 Joongraafikud

“ggplot2”-s on näiteks joonetüübid on “blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”.

meals <- data.frame(sex = rep(c("Female", "Male"), each = 3),
                  time = c("Breakfeast", "Lunch", "Dinner"),
                  bill = c(10, 30, 15, 13, 40, 17) )

# Change line colors and sizes
ggplot(data = meals, aes(x = time, y = bill, group = sex)) +
  geom_line(linetype = "dotted", color = "red", size = 2) +
  geom_point(color = "blue", size = 3)

Järgneval graafikul muudame joonetüüpi automaatselt muutuja sex taseme järgi:

# Change line types + colors
ggplot(meals, aes(x = time, y = bill, group = sex)) +
  geom_line(aes(linetype = sex, color = sex)) +
  geom_point(aes(color = sex)) +
  theme(legend.position = "top")

Muuda jooni käsitsi:

  • scale_linetype_manual(): joone tüüp

  • scale_color_manual(): joone värv

  • scale_size_manual(): joone laius

ggplot(meals, aes(x = time, y = bill, group = sex)) +
  geom_line(aes(linetype = sex, color = sex, size = sex)) +
  geom_point() +
  scale_linetype_manual(values = c("twodash", "dotted")) +
  scale_color_manual(values = c('#999999', '#E69F00')) +
  scale_size_manual(values = c(1, 1.5)) +
  theme(legend.position = "top")

11.2.5 Punktide tähistamise trikid

aes() töötab nii ggplot() kui geom_ funktsioonides.

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, size = Petal.Length, color = Species))

Kui me kasutame color argumenti aes()-st väljaspool, siis värvime kõik punktid sama värvi.

ggplot(iris) +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, size = Petal.Length), color = "red")

Kasulik trikk on kasutada mitut andmesetti sama ploti tegemiseks. Uus andmestik – “mpg” – on autode kütusekulu kohta.

head(mpg, 2)
#> # A tibble: 2 x 11
#>   manufacturer model displ  year   cyl trans drv  
#>   <chr>        <chr> <dbl> <int> <int> <chr> <chr>
#> 1 audi         a4      1.8  1999     4 auto… f    
#> 2 audi         a4      1.8  1999     4 manu… f    
#> # … with 4 more variables: cty <int>, hwy <int>,
#> #   fl <chr>, class <chr>

best_in_class <- mpg %>%
  group_by(class) %>%
  top_n(1, hwy)

head(best_in_class)
#> # A tibble: 6 x 11
#> # Groups:   class [2]
#>   manufacturer model displ  year   cyl trans drv  
#>   <chr>        <chr> <dbl> <int> <int> <chr> <chr>
#> 1 chevrolet    corv…   5.7  1999     8 manu… r    
#> 2 chevrolet    corv…   6.2  2008     8 manu… r    
#> 3 dodge        cara…   2.4  1999     4 auto… f    
#> 4 dodge        cara…   3    1999     6 auto… f    
#> 5 dodge        cara…   3.3  2008     6 auto… f    
#> 6 dodge        cara…   3.3  2008     6 auto… f    
#> # … with 4 more variables: cty <int>, hwy <int>,
#> #   fl <chr>, class <chr>

Siin läheb kitsam andmeset uude geom_point() kihti ja teeb osad punktid teistsuguseks. Need on oma klassi parimad autod.

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour = class))+
  geom_point(size = 3, shape = 1, data = best_in_class) 

Lõpuks toome graafikul eraldi välja nende parimate autode mudelite nimed. Selleks kasutame “ggrepel” raamatukogu funktsiooni geom_label_repel().

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour = class))+
  geom_point(size = 3, shape = 1, data = best_in_class) +
  geom_label_repel(aes(label = model), data = best_in_class, cex = 2)

11.3 Facet – pisigraafik

Kui teil on mitmeid muutujaid või nende alamhulki, on teil kaks võimalust.

  1. grupeeri pidevad muutujad faktormuutujate tasemete järgi ja kasuta color, fill, shape, size alpha parameetreid, et erinevatel gruppidel vahet teha.

  2. grupeeri samamoodi ja kasuta facet-it, et iga grupp omaenda paneelile panna.

# here we separate different classes of cars into different colors
p <- ggplot(mpg, aes(displ, hwy)) 
p + geom_point(aes(colour = class))

p + geom_point() + 
  facet_wrap(~ class)

p + geom_point() +
  facet_wrap(~ class, nrow = 2)

Kui me tahame kahe muutuja kõigi kombinatsioonide vastu paneele, siis kasuta facet_grid() funktsiooni.

p + geom_point() +
  facet_grid(drv ~ cyl)

  • “drv” – drive - 4(-wheel), f(orward), r(ear).
  • “cyl” – cylinders - 4, 5, 6, or 8.

Kasutades punkti . on võimalik asetada kõik alamgraafikud kõrvuti (. ~ var) või üksteise peale (var ~ .).

p + geom_point() +
  facet_grid(. ~ drv)

p + geom_point() +
  facet_grid(drv ~ .)

11.4 Mitu graafikut paneelidena ühel joonisel

Kõigepealt tooda komponentgraafikud ggplot() abil ja tee nendest graafilised objektid. Näiteks nii:

library(tidyverse)
i1 <- ggplot(data= iris, aes(x=Sepal.Length)) + geom_histogram()
i2 <- ggplot(data= iris, aes(x=Sepal.Length)) + geom_density()

Seejäral, kasuta funktsioon gridExtra::grid.arrange() et graafikud kõrvuti panna

library(gridExtra)
grid.arrange(i2, i1, nrow = 1) # ncol = 2 also works

11.5 Teljed

11.5.1 Telgede ulatus

Telgede ulatust saab määrata kolmel erineval viisil

  1. filtreeri andmeid, mida plotid

  2. pane x- ja y-teljele piirangud xlim(), ylim()

  3. kasuta coord_cartesian() ja xlim, ylim parameetritena selle sees: coord_cartesian(xlim = c(5, 7), ylim = c(10, 30))

Telgede ulatust saab muuta ka x- ja y-teljele eraldi:

  • scale_x_continuous(limits = range(mpg$displ))
  • scale_y_continuous(limits = range(mpg$hwy))

11.5.2 Log skaalas teljed

  1. Lineaarsed andmed lineaarsetel telgedel.
ggplot(cars, aes(x = speed, y = dist)) + 
  geom_point() + 
  ggtitle("Lineaarsed andmed ja teljed")

  1. Logaritmi andmed aes()-s.
ggplot(cars, aes(x = log2(speed), y = log2(dist))) + 
  geom_point() +
  ggtitle("Andmed ja teljed on logaritmitud")

  1. Andmed on logaritmitud, aga teljed mitte.
ggplot(cars, aes(x = speed, y = dist)) + 
  geom_point() + 
  coord_trans(x = "log2", y = "log2") + 
  ggtitle("Andmed on logaritmitud, aga teljed mitte")

11.5.3 Pöörame graafikut 90 kraadi

ggplot(iris, mapping = aes(x = Species, y = Sepal.Length)) + 
  geom_boxplot() +
  coord_flip()

11.5.4 Muudame telgede markeeringuid

Muudame y-telje markeeringut:

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  scale_y_continuous(breaks = seq(15, 40, by = 5)) +
  ggtitle("y-telje markeeringud\n15 kuni 40, viieste vahedega")

Muudame x-telje markeeringute nurka muutes theme() funktsiooni argumenti “axis.text.x”:

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Eemaldame telgede markeeringud, ka läbi theme() funktsiooni:

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  theme(axis.text = element_blank())

Muudame teljemarkeeringute järjekorda

p <- ggplot(iris, aes(Species, Sepal.Length)) + geom_boxplot()
p
p + scale_x_discrete(breaks=c("versicolor", "setosa"))

Muuda teljemarkeeringuid ja kustuta telje nimi.

p + scale_x_discrete(labels=c("setosa" = "sp 1", "versicolor" = "sp2"), name=NULL)

11.5.5 telgede ja legendi nimed

p <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) + 
  geom_point()
p + labs(
     x = "Length",
     y = "Width",
     color = "Iris sp."
     )

Eemaldame telgede nimed:

p + theme(axis.title = element_blank())

11.6 Graafiku pealkiri, alapeakiri ja allkiri

ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) + 
  geom_point() + 
  labs(
     title = "Main Title",
     subtitle = "Subtitle",
     caption = "Figure caption"
      )

ggtitle() annab graafikule pealkirja

11.6.1 Täpitähed jms graafikutel

R-s on sümbolid tavapäraselt UTF-8 kodeeringus. Mitte-inglise tähestikku kuuluvaid sümboleid saab lisada, andes ette nende kodeeringu, millele eelneb backslash. Täisnimekirja UTF-8 kodeeringutest leiab https://www.fileformat.info/info/charset/UTF-8/list.htm

11.7 Graafiku legend

Legend erinevalt graafikust endast ei ole pool-läbipaistev.

norm <- tibble(x = rnorm(1000), y = rnorm(1000))
norm$z <- cut(norm$x, 3, labels = c( "a" ,  "b" ,  "c" )) #creates a new column

ggplot(norm, aes(x, y)) +
  geom_point(aes(colour = z), alpha = 0.3) +
  guides(colour = guide_legend(override.aes = list(alpha = 1)))

legend graafiku sisse

df <- data.frame(x = 1:3, y = 1:3, z = c( "a" ,  "b" ,  "c" ))
base <- ggplot(df, aes(x, y)) +
  geom_point(aes(colour = z), size = 3) +
  xlab(NULL) +
  ylab(NULL)

base + theme(legend.position = c(0, 1), legend.justification = c(0, 1))
base + theme(legend.position = c(0.5, 0.5), legend.justification = c(0.5, 0.5))
base + theme(legend.position = c(1, 0), legend.justification = c(1, 0))

legendi asukoht graafiku ümber:

base + theme(legend.position = "left")
base + theme(legend.position = "top")
base + theme(legend.position = "bottom")
base + theme(legend.position = "right") # the default

eemalda legend

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour = class))+
  theme(legend.position = "none")

11.8 Värviskaalad

ColorBreweri skaala “Set1” on hästi nähtav värvipimedatele. colour_brewer skaalad loodi diskreetsetele muutujatele, aga nad näevad sageli head välja ka pidevate muutujate korral.

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = drv)) +
  scale_colour_brewer(palette = "Set1")

11.8.1 Värviskaalad pidevatele muutujatele

Pidevatele muutujatele töötab scale_colour_gradient() or scale_fill_gradient(). scale_colour_gradient2() võimaldab eristada näiteks positiivseid ja negatiivseid väärtusi erinevate värviskaaladega.

df <- data.frame(x = 1, y = 1:5, z = c(1, 3, 2, NA, 5))
p <- ggplot(df, aes(x, y)) + geom_tile(aes(fill = z), size = 5)
p
# Make missing colours invisible
p + scale_fill_gradient(na.value = NA)
# Customise on a black and white scale
p + scale_fill_gradient(low =  "black" , high =  "white" , na.value =  "red" )

#gradient between n colours
p+scale_color_gradientn(colours = rainbow(5))
# Use distiller variant with continous data
ggplot(faithfuld) +
  geom_tile(aes(waiting, eruptions, fill = density)) + 
  scale_fill_distiller(palette = "Spectral")

11.8.2 Värviskaalad faktormuutujatele

Tavaline värviskaala on scale_colour_hue() ja scale_fill_hue(), mis valivad värve HCL värvirattast. Töötavad hästi kuni u 8 värvini.

ToothGrowth <- ToothGrowth
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
mtcars <- mtcars
mtcars$cyl <- as.factor(mtcars$cyl)

#bp for discrete color scales
bp<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
  geom_boxplot()
bp
#sp for continuous scales
sp<-ggplot(mtcars, aes(x=wt, y=mpg, color=cyl)) + geom_point()
sp

#You can control the default chroma and luminance, and the range 
#of hues, with the h, c and l arguments
bp + scale_fill_hue(l=40, c=35, h = c(180, 300)) #boxplot
sp + scale_color_hue(l=40, c=35) #scatterplot

Halli varjunditega töötab scale_fill_grey().

bp + scale_fill_grey(start = 0.5, end = 1)

Järgmine võimalus on käsitsi värve sättida

#bp for discrete color scales
bp<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
  geom_boxplot()
bp
#sp for continuous scales
sp<-ggplot(mtcars, aes(x=wt, y=mpg, color=cyl)) + geom_point()
sp
bp + scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
sp + scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))

Colour_brewer-i skaalad on loodud faktormuutujaid silmas pidades.

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
d <- ggplot(dsamp, aes(carat, price)) +
  geom_point(aes(colour = clarity))
d + scale_colour_brewer()

# Change scale label
d + scale_colour_brewer("Diamond\nclarity")

# Select brewer palette to use, see ?scales::brewer_pal for more details
d + scale_colour_brewer(palette = "Greens")
d + scale_colour_brewer(palette = "Set1")

# scale_fill_brewer works just the same as
# scale_colour_brewer but for fill colours
p <- ggplot(diamonds, aes(x = price, fill = cut)) +
  geom_histogram(position = "dodge", binwidth = 1000)
p + scale_fill_brewer()
# the order of colour can be reversed
# the brewer scales look better on a darker background
p + scale_fill_brewer(direction = -1) + theme_dark()

Väga lahedad värviskaalad, mis eriti hästi sobivad diskreetsetele muutujatele, on wesanderson paketis. Enamus skaalasid on küll ainult 3-5 värviga. Sealt saab siiski ekstrapoleerida rohkematele värvidele (?wes_palette; ?wes_palettes).

#install.packages("wesanderson")
#library(wesanderson)

#bp for discrete color scales
bp<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
  geom_boxplot()
bp

#wes_palette(name, n, type = c("discrete", "continuous"))
#n - the nr of colors desired, type - do you want a continious scalle?
bp+scale_fill_manual(values=wes_palette(n=3, name="GrandBudapest"))

wes_palette("Royal1")
wes_palette("GrandBudapest")
wes_palette("Cavalcanti")
wes_palette("BottleRocket")
wes_palette("Darjeeling")

wes_palettes #gives the complete list of palettes

Argument breaks kontrollib legendi. Sama kehtib ka teiste scale_xx() funktsioonide kohta.

bp <- ToothGrowth %>% 
  ggplot(aes(x = dose, y = len, fill = dose)) +
  geom_boxplot()
bp
# Box plot
bp + scale_fill_manual(breaks = c("2", "1", "0.5"), 
                       values = c("red", "blue", "green"))

# color palettes
bp + scale_fill_brewer(palette = "Dark2") 
#sp + scale_color_brewer(palette="Dark2") 

# use graysacle
#Change the gray value at the low and the high ends of the palette :
bp + scale_fill_grey(start = 0.8, end = 0.2) + theme_classic()

The ColorBrewer scales are documented online at http://colorbrewer2.org/ and made available in R via the RColorBrewer package. When you have a predefined mapping between values and colours, use scale_colour_manual().

scale_colour_manual(values = c(factor_level_1 = "red", factor_level_2 = "blue")

scale_colour_viridis() provided by the viridis package is a continuous analog of the categorical ColorBrewer scales.

11.9 A complex ggplot

Let’s pretend that we are measuring the same quantity by immunoassay at baseline and after 1 year of storage at -80 degrees. We’ll add some heteroscedastic error and create some apparent degradation of about 20%:

set.seed(10)
baseline <- rlnorm(100, 0, 1)
post <- 0.8 * baseline + rnorm(100, 0, 0.10 * baseline)
my_data <- tibble(baseline, post)
my_data %>% 
  ggplot(aes(baseline, post)) +
  geom_point(shape = 1) + # Use hollow circles
  geom_smooth(method = "lm") + # Add linear regression line 
  geom_abline(slope = 1, intercept = 0, linetype = 2, colour = "red")

Now we will prepare the difference data:

diff <- (post - baseline)
diffp <- (post - baseline) / baseline * 100
sd.diff <- sd(diff)
sd.diffp <- sd(diffp)
my.data <- data.frame(baseline, post, diff, diffp)

In standard Bland Altman plots, one plots the difference between methods against the average of the methods, but in this case, the x-axis should be the baseline result, because that is the closest thing we have to the truth.

library(ggExtra)
diffplot <- ggplot(my.data, aes(baseline, diff)) + 
  geom_point(size=2, colour = rgb(0,0,0, alpha = 0.5)) + 
  theme_bw() + 
  #when the +/- 2SD lines will fall outside the default plot limits 
  #they need to be pre-stated explicitly to make the histogram line up properly. 
  ylim(mean(my.data$diff) - 3*sd.diff, mean(my.data$diff) + 3*sd.diff) +
  geom_hline(yintercept = 0, linetype = 3) +
  geom_hline(yintercept = mean(my.data$diff)) +
  geom_hline(yintercept = mean(my.data$diff) + 2*sd.diff, linetype = 2) +
  geom_hline(yintercept = mean(my.data$diff) - 2*sd.diff, linetype = 2) +
  ylab("Difference pre and post Storage (mg/L)") +
  xlab("Baseline Concentration (mg/L)")
 
#And now for the magic - we'll use 25 bins
ggMarginal(diffplot, type = "histogram", bins = 25)