I ggplot2 finnes automatiske funksjoner som optimaliserer skalaer for x-akse, y-akse, color, fill og figurforklaringer (eng. figure legends). Ved å justere skalaer kan vi endre utseendet på x-aksen og y-aksen. Skalaer brukes også til å endre innholdet i figurforklaringer. Det betyr at skalaer brukes til å endre både akser og figurforklaringer. Til sammen kalles aksene og figurforklaringene figurens guides.
I dette kapittelet skal vi bruke data fra undersøkelsen mpg. Sørg for at tidyverse er aktivert, noe som gjør at også ggplot2 og mpg blir aktivert:
library(tidyverse)
## Inspiser de første 5 radene i mpg
head(mpg)| manufacturer <chr> | model <chr> | displ <dbl> | year <int> | cyl <int> | trans <chr> | drv <chr> | cty <int> | hwy <int> | fl <chr> |
|---|---|---|---|---|---|---|---|---|---|
| audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p |
| audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p |
| audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p |
| audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p |
| audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p |
| audi | a4 | 2.8 | 1999 | 6 | manual(m5) | f | 18 | 26 | p |
mpg-data.
I følgende eksempel lages en graf med x-akse, y-akse og fargekoding (color) basert på kolonnen class:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point()
Av grafen ovenfor fremgår det at ggplot() automatisk har laget en skala for x-aksen, y-aksen og en skala for fargene på datapunktene. Dette gjør ggplot() med funksjonene scale_x_continuous(), scale_y_continuous() og scale_colour_discrete(). Vi trenger ikke å spesifisere disse funksjonene i koden ovenfor, fordi ggplot() gjør det automatisk. Hvis vi legger til disse funksjonene, får vi en identisk graf:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_x_continuous() +
scale_y_continuous() +
scale_colour_discrete()
Disse funksjonene og navnene deres tolkes slik:
| Funksjon | Forklaring |
|---|---|
scale_x_continuous() |
Endrer en kontinuerlig (numerisk) x-akse. I eksemplet ovenfor endres skalaen for displ. |
scale_x_continuous() |
Endrer en kontinuerlig (numerisk) y-akse. I eksemplet ovenfor endres skalaen for hwy. |
scale_colour_discrete |
Endrer colour (color)-argument som er en diskret variabel. I eksemplet ovenfor endres skalaen for class. |
Andre scale-funksjoner brukes på samme måte og følger samme prinsipp for navngiving:
- Hvis
x-aksen er en numerisk variabel, justeres den medscale_x_continuous(). - Hvis
y-aksen er en numerisk variabel, justeres den medscale_y_continuous(). - Hvis
x-aksen er en kategorisk variabel, justeres den medscale_x_discrete(). - Hvis
y-aksen er en kategorisk variabel, justeres den medscale_y_discrete(). - Hvis
colorer en kategorisk variabel, justeres den medscale_color_continuous(). - Hvis
colorer en kategorisk variabel, justeres den medscale_color_discrete().
Guides: akser og legends
Figurens guides (no. guider) består av aksenes (x, y) skala og figurforklaringene. Akser og figurforklaringer (legends) endres med følgende argumenter:
breaks: endrer hvilke tall som vises på en akse, henholdsvis hvilke kategorier som vises i en figurforklaring.labels: endrer labels som vises på en akse eller i en figurforklaring.limits: endrer aksenes intervall.
Akser (x, y)
Vi fortsetter med den forrige grafen, der vi nå fjerner skalaen på x-aksen og y-aksen. Dette gjøres ved å angi breaks=NULL, slik:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_x_continuous(breaks = NULL) +
scale_y_continuous(breaks = NULL)
I den første figuren så vi at x-aksen går fra 2 til 7 med intervaller på 1,0. Vi endrer skalaen slik at den går fra 2 til 7 med med intervaller på 0,5. Dette gjøres ved at breaks får en sekvens (med funksjonen seq()) fra 2 til 7 med 0,5 mellomrom, slik:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_x_continuous(breaks = seq(from=2, to=7, by=0.5))
I neste eksempel endrer vi slik at x-aksens begrensning utvides fra 0 til 15:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_x_continuous(breaks = seq(from=2, to=7, by=.5),
limits = c(0, 10))
I neste eksempel begrenser vi x-aksen til intervallet 1 til 5, og vi erstatter tallene med nye labels, nemlig de fem første bokstavene:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_x_continuous(breaks = seq(1, 5, by=1),
limits = c(1, 5),
labels = c("A", "B", "C", "D", "E"))
Figurforklaringer (legends)
Som nevnt ovenfor har breaks og limits også effekt på figurforklaringer. Selve figurforklaringen lages ut fra den estetiske mappingen. I eksemplet nedenfor brukes color=class i aes(). For å endre denne skalaen bruker vi funksjonen scale_color_discrete(). Vi angir at breaks bare inneholder "pickup", og at den får labelen "Pickup car".
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_color_discrete(breaks=c("pickup"),
labels=c("Pickup car"))
På denne måten kan også rekkefølgen i figurforklaringen justeres.
Plassering av figurforklaring (figur legends)
Plasseringen av figurforklaringen påvirker ikke dataene som presenteres i grafen. Slike komponenter justeres med theme(). Figurforklaringen kan plasseres hvor som helst i figuren. Nedenfor følger flere eksempler med justeringer av forklaringens plassering.
I det første eksemplet fjerner vi figurforklaringen med argumentet legend.position = "none".
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
theme(legend.position = "none")
Argumentet legend.position aksepterer også spesifikasjonene "bottom", "top", "right", "left". Dette demonstreres nå med "bottom" som valg:
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
theme(legend.position = "bottom")
Andre alternative plasseringer med tekststrenger følger:
theme(legend.position = "top")theme(legend.position = "bottom")theme(legend.position = "left")theme(legend.position = "right")
Du kan også plassere legends med koordinater, der både x- og y-aksen går fra 0 til 1. For å få legends plassert nederst til høyre er koordinatene x=1 og y=0, som angis i en numerisk vektor (c(1, 1)).
Du kan også plassere legends med koordinater, der både x- og y-aksen går fra 0 til 1. For å få legends plassert øverst til høyre er koordinatene x=1 og y=1, som angis i en numerisk vektor (c(1, 1)). I theme() har legend flere argumenter (legend.justification, legend.margin osv.) som vi også skal bruke nedenfor for å optimalisere plasseringen av legend. I koden følger kommentarer som forklarer hva hvert argument gjør.
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
theme(
# Legend plasseres øverst til høyre
legend.position = c(1, 1),
# Legend tillates ikke å gå utenfor grafens begrensning
legend.justification = c("right", "top"),
# Margin lager en marg mellom legend og omgivelsene.
# 10 mm margin brukes på alle 4 kanter
legend.margin = margin(10, 10, 10, 10),
# Bakgrunnen fjernes ved å spesifisere den som et blankt element
legend.background = element_blank())
ggplot(mpg, aes(x=displ,
y=hwy,
color=manufacturer,
shape=drv)) +
geom_point(size=3) +
# Plasser legends over grafen
theme(legend.position = "top") +
# Endrer enkelte legends
guides(colour = guide_legend(nrow = 3, #antall rader
override.aes = list(size = 4), # størrelse på forklaringene
order = 2), # rekkefølgen
shape = guide_legend(nrow = 3,
override.aes = list(size = 4),
order = 1))
Vi kan bruke guides() til å skjule en enkelt legend. Nedenfor skjuler vi legends for shapes, og vi bytter label for legend for color til "Biltillverkare".
ggplot(mpg, aes(x=displ,
y=hwy,
color=manufacturer,
shape=drv)) +
geom_point() +
theme(legend.position = "top") +
guides(colour = guide_legend(title="Biltillverkare",
nrow = 3,
override.aes = list(size = 5)),
# Skjul legend for shape
shape = "none")
Erstatte eller transformere en skala
En numerisk skala kan transformeres for å vise sammenhenger i data tydeligere. I neste eksempel bruker vi data fra gapminder for å visualisere hvordan befolkningsstørrelse (pop) og forventet levealder (lifeExp) korrelerer. Vi gjør dette med og uten logaritmering av aksene. For å plassere figurene ved siden av hverandre sender vi ggplot()-objektene til to nye objekter (plot_1, plot_2), som vi deretter bruker i plot_grid() fra pakken cowplot.
library(gapminder)
## Uten logaritme
plot_1 <- ggplot(gapminder, aes(x=pop,
y=lifeExp,
color=year)) +
geom_point() +
labs(title="Utan logaritmerade axlar") +
theme(legend.position = "bottom")
## Med logaritme
plot_2 <- ggplot(gapminder, aes(x=pop,
y=lifeExp,
color=year)) +
geom_point() +
scale_x_log10() +
scale_y_log10() +
labs(title="Med logaritmerade axlar") +
theme(legend.position = "bottom")
library(cowplot)
plot_grid(plot_1, plot_2)
Endre fargeskala og fargepalett
R Colorbrewer
Scale brukes også til å fargelegge diskrete variabler. I ggplot finnes innebygde fargepaletter der fargene er valgt med omhu. I tillegg finnes andre fargepaletter med mer spesifikke formål. For eksempel finnes R ColorBrewer, som består av en rekke fargepaletter som er særlig egnet for fargeblinde. For å se alle fargepalettene i R ColorBrewer skriver du følgende kommando:
RColorBrewer::display.brewer.all()
Du kan bruke disse fargepalettene i ggplot gjennom funksjonen scale_color_brewer(). Som det fremgår av figuren ovenfor, finnes det en fargepalett som heter "Set3". Nedenfor bruker vi "Set3" i scale_color_brewer().
ggplot(mpg, aes(x=displ,
y=hwy,
color=class)) +
geom_point() +
scale_color_brewer(palette = "Set1")
På https://colorbrewer2.org/ kan du lese mer om ColorBrewer.
Viridis
I pakken viridis finnes scale_color_viridis() og scale_fill_viridis(), som kan brukes både for kontinuerlige og diskrete variabler. For kontinuerlige variabler er viridis å foretrekke fremfor ColorBrewer.
library(viridis)
## Viridis standardfarger
ggplot(gapminder, aes(x=pop,
y=lifeExp,
color=year)) +
geom_point() +
scale_color_viridis_c()
## Viridis plasma
ggplot(gapminder, aes(x=pop,
y=lifeExp,
color=year)) +
geom_point() +
scale_color_viridis_c(option = "plasma")

Manuelle fargeskalaer
Hvis de innebygde fargepalettene og paletter i pakker som for eksempel viridis ikke passer, kan du lage fargepaletten manuelt. Dette gjøres med scale_colour_manual() eller scale_fill_manual(). Her følger et eksempel der scale_colour_manual() brukes til å lage farger manuelt for biler basert på class.
ggplot(gapminder, aes(x=pop,
y=lifeExp,
color=continent)) +
geom_point() +
scale_colour_manual(values = c(Africa="darkblue",
Asia="pink",
Europe="green",
Oceania="purple",
Americas="cyan"))
Med funksjonene scale_fill_gradient2() og scale_colour_gradient2() kan kontinuerlige variabler få en fargegradient med et midtpunkt. I eksemplet nedenfor brukes scale_colour_gradient2() til å farge datapunkter etter år 1980 med svarte punkter og datapunkter før 1980 med gule punkter, med en gradient fra 1980 i begge tilfeller. Merk at også aksene er logaritmiske.
ggplot(gapminder, aes(x=pop,
y=lifeExp,
color=year)) +
geom_point() +
scale_colour_gradient2(midpoint=1980,
high = "black",
low = "gold") +
scale_x_log10() +
scale_y_log10()