Skalaer, akser, legends (guides)

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()
Spredningsdiagram av motorvolum (displ) mot drivstofforbruk på motorvei (hwy) i mpg, farget etter bilklasse (class)

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()
Det samme spredningsdiagrammet av displ mot hwy farget etter bilklasse, tegnet med eksplisitt angitte standardskalaer

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 med scale_x_continuous().
  • Hvis y-aksen er en numerisk variabel, justeres den med scale_y_continuous().
  • Hvis x-aksen er en kategorisk variabel, justeres den med scale_x_discrete().
  • Hvis y-aksen er en kategorisk variabel, justeres den med scale_y_discrete().
  • Hvis color er en kategorisk variabel, justeres den med scale_color_continuous().
  • Hvis color er en kategorisk variabel, justeres den med scale_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)
Spredningsdiagram av displ mot hwy der skalamerker, skalaverdier og rutenett på x- og y-aksen er fjernet

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))
Spredningsdiagram av displ mot hwy der x-aksen har bruddpunkter med 0,5 enheters mellomrom fra 2,0 til 7,0

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))
Spredningsdiagram av displ mot hwy der x-aksens grenser er utvidet slik at punktene samles midt i figuren

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"))
Spredningsdiagram av displ mot hwy der x-aksens skalaverdier er erstattet med etikettene A til 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"))
Spredningsdiagram av displ mot hwy farget etter bilklasse der figurforklaringen bare viser én klasse med etiketten 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")
Spredningsdiagram av displ mot hwy farget etter bilklasse der figurforklaringen er fjernet helt

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")
Spredningsdiagram av displ mot hwy farget etter bilklasse med figurforklaringen plassert under diagrammet i to rader

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())
Spredningsdiagram av displ mot hwy med figurforklaringen plassert inne i diagrammets øvre høyre hjørne
Med guides() er det mulig å justere enkelte legends i en figur. La oss justere plasseringen og utseendet på legends for bilprodusenter (manufacturer) ovenfor. Dette gjør vi ved å endre antall rader (nrow) som legends presenteres på, samt størrelsen (size) på formene i legends.
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))
Spredningsdiagram av displ mot hwy med farge etter produsent og form etter drift, figurforklaringer over diagrammet i tre rader

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")
Spredningsdiagram av displ mot hwy der bare figurforklaringen for produsent vises, med overskriften Biltillverkare og større symboler

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)
To spredningsdiagrammer av befolkning mot forventet levealder i gapminder, uten og med logaritmiske akser

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()
Oversikt over alle ColorBrewer-paletter i R: sekvensielle, kvalitative og divergerende fargeskalaer

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")
Spredningsdiagram av displ mot hwy der bilklassene er farget med en kvalitativ ColorBrewer-palett

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")
Spredningsdiagram av befolkning mot forventet levealder der punktene farges etter år med den kontinuerlige viridis-skalaen
Spredningsdiagram av befolkning mot forventet levealder der punktene farges etter år med viridis-paletten 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"))
Spredningsdiagram av befolkning mot forventet levealder med manuelt valgte farger for hvert kontinent

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()
Spredningsdiagram av befolkning (logaritmert) mot forventet levealder med en tretrinns fargegradient etter år, gult via hvitt til svart