Tema (themes)

For å justere tema og layout finnes funksjonen theme(), som har en lang rekke argumenter som kan spesifiseres for å påvirke i prinsippet alle aspekter ved layout og tema. Det finnes dessuten ferdige temaer, som for eksempel theme_bw(), som gir grafen en bestemt stil. Å bruke et ferdig tema (for eksempel theme_bw()) innebærer som regel at færre justeringer må gjøres manuelt.

Det er ikke nødvendig å justere temaet når man utforsker data. Det bør derimot gjøres ved presentasjon for å optimalisere det endelige resultatet. De fleste yrkesutøvere arbeider med et fåtall ulike typer visualiseringer, og derfor kan det lønne seg å investere tid i å utvikle passende temaer.

I dette kapittelet arbeider vi med data fra gapminder, som finnes i pakken med samme navn. Last inn gapminder med følgende kode:

library(gapminder)

## Inspiser de første 5 radene
head(gapminder)
country <fctr> continent <fctr> year <int> lifeExp <dbl> pop <int> gdpPercap <dbl>
Afghanistan Asia 1952 28.801 8425333 779.4453
Afghanistan Asia 1957 30.332 9240934 820.8530
Afghanistan Asia 1962 31.997 10267083 853.1007
Afghanistan Asia 1967 34.020 11537966 836.1971
Afghanistan Asia 1972 36.088 13079460 739.9811
Afghanistan Asia 1977 38.438 14880372 786.1134

Gapminder

Vi begynner med en graf uten noen justeringer av temaet (merk at vi logaritmerer pop og lifeExp fordi grafen da blir tydeligere):

ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje, standardtemaet med grå bakgrunn

Vi skal nå modifisere dette temaet ved å demonstrere 8 komplette temaer. For å skrive effektiv kode skal vi derfor lage et objekt (base_plot) som inneholder grafen ovenfor:

base_plot <- ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()

Nå legger vi temaer til base_plot. Vi legger også til en tittel, slik at det fremgår av grafen hvilket tema som er brukt (se nedenfor).

base_plot +
  labs(title="Theme Background White (theme_bw)") +
  theme_bw()

base_plot +
  labs(title="Theme Classic (theme_classic)") +
  theme_classic()

base_plot +
  labs(title="Theme Minimal (theme_minimal)") +
  theme_minimal()

base_plot +
  labs(title="Theme Grey (theme_grey)") +
  theme_minimal()

base_plot +
  labs(title="Theme Linedraw (theme_linedraw)") +
  theme_linedraw()

base_plot +
  labs(title="Theme Dark (theme_dark)") +
  theme_dark()

base_plot
  labs(title="Theme Light (theme_light)") +
  theme_light()

base_plot +
  labs(title="Theme Void (theme_void)") +
  theme_void()
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_void, uten akser og rutenett
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_light med lysegrått rutenett
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_dark med mørkegrått panel
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_linedraw med svart ramme og rutenett
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje, tittelen Theme Grey med hvit bakgrunn og lyst rutenett
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_minimal med hvit bakgrunn uten ramme
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_classic med akselinjer uten rutenett
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje i theme_bw med hvit bakgrunn og svart ramme

Ggthemes

Pakken ggthemes (https://jrnold.github.io/ggthemes/) inneholder enda flere komplette themes, scales og geoms for ggplot2. I ggthemes finnes flere alternativer enn i noen annen eksisterende pakke. Videre finnes alternativer som er spesielt utviklet for forskning, vitenskapelig publisering, fargeblindhet, bestemte tidsskrifter, applikasjoner osv. Installer pakken med følgende kommando:

install.packages("ggthemes")
library(ggthemes)

Vi prøver et ferdig tema laget etter Wall Street Journal:

base_plot +
  labs(title="Theme Wall Street Journal") +
  theme_wsj()
Spredningsdiagram av gapminder-data i theme_wsj fra ggthemes med beige bakgrunn, prikkede linjer og tegnforklaring øverst

Justere spesifikke elementer

Alle eksemplene ovenfor var ferdige temaer som modifiserer mange elementer samtidig. Du kan modifisere i prinsippet alle elementer i temaet ved hjelp av theme(). Denne funksjonen tar et stort antall elementer som har elementfunksjoner. For eksempel brukes elementet title til å justere alle titlene. Fordi titler er tekst, har de elementfunksjonen element_text(). I element_text() kan vi for eksempel endre størrelsen og fargen på titlene med følgende kode:

title = element_text(size=12, color="purple")

I grafen blir det slik:

base_plot +
theme(title = element_text(size=15, color="gold1"))
Spredningsdiagram av log(lifeExp) mot log(pop) farget etter kontinent med regresjonslinje der aksetitler og tittelen på tegnforklaringen er gule og større
Her følger en liste over elementene i theme(), etterfulgt av et bilde som viser de vanligste elementene og deres elementfunksjoner.
theme(
  line,
  rect,
  text,
  title,
  aspect.ratio,
  axis.title,
  axis.title.x,
  axis.title.x.top,
  axis.title.x.bottom,
  axis.title.y,
  axis.title.y.left,
  axis.title.y.right,
  axis.text,
  axis.text.x,
  axis.text.x.top,
  axis.text.x.bottom,
  axis.text.y,
  axis.text.y.left,
  axis.text.y.right,
  axis.ticks,
  axis.ticks.x,
  axis.ticks.x.top,
  axis.ticks.x.bottom,
  axis.ticks.y,
  axis.ticks.y.left,
  axis.ticks.y.right,
  axis.ticks.length,
  axis.ticks.length.x,
  axis.ticks.length.x.top,
  axis.ticks.length.x.bottom,
  axis.ticks.length.y,
  axis.ticks.length.y.left,
  axis.ticks.length.y.right,
  axis.line,
  axis.line.x,
  axis.line.x.top,
  axis.line.x.bottom,
  axis.line.y,
  axis.line.y.left,
  axis.line.y.right,
  legend.background,
  legend.margin,
  legend.spacing,
  legend.spacing.x,
  legend.spacing.y,
  legend.key,
  legend.key.size,
  legend.key.height,
  legend.key.width,
  legend.text,
  legend.text.align,
  legend.title,
  legend.title.align,
  legend.position,
  legend.direction,
  legend.justification,
  legend.box,
  legend.box.just,
  legend.box.margin,
  legend.box.background,
  legend.box.spacing,
  panel.background,
  panel.border,
  panel.spacing,
  panel.spacing.x,
  panel.spacing.y,
  panel.grid,
  panel.grid.major,
  panel.grid.minor,
  panel.grid.major.x,
  panel.grid.major.y,
  panel.grid.minor.x,
  panel.grid.minor.y,
  panel.ontop,
  plot.background,
  plot.title,
  plot.title.position,
  plot.subtitle,
  plot.caption,
  plot.caption.position,
  plot.tag,
  plot.tag.position,
  plot.margin,
  strip.background,
  strip.background.x,
  strip.background.y,
  strip.clip,
  strip.placement,
  strip.text,
  strip.text.x,
  strip.text.y,
  strip.switch.pad.grid,
  strip.switch.pad.wrap,
)

Elementfunksjoner:

Oversikt over temaelementer i ggplot2 med piler til akse-, plot-, fasett- og tegnforklaringselementer og deres elementfunksjoner

Nedenfor lager vi en figur med labels (labs()) for x, y og titel; nye skalaer for x og y; samt justering av en rekke theme()-elementer.

base_plot +
  # Endrer labels på x, y og tittel
  labs(x="Population",
       y="Life expectancy (years)",
       title="Life expectancy and population size") +

  # Endrer skalaen på x-aksen og y-aksen
  scale_y_continuous(breaks=seq(3, 5, by=0.5),
                     limits=c(2, 5)) +
  scale_x_continuous(breaks=seq(10, 20, by=1),
                     limits=c(10, 20)) +

  # Justerer temaet
  theme(legend.text = element_text(color="brown4"),
        legend.title = element_blank(),
        legend.key = element_blank(),
        panel.grid.major.x=element_line(color = "lightgoldenrod3",
                                        size = 0.5,
                                        linetype = 2),
        panel.grid.minor.x=element_line(color = "palevioletred3",
                                        size = 0.5,
                                        linetype = 2),
        plot.background = element_rect(fill="wheat3"))
Spredningsdiagram av forventet levealder mot befolkning med beige bakgrunn, stiplet rutenett i to farger og brune tegnforklaringstekster