Tema (themes)

Til at justere tema og layout findes funktionen theme(), som har en lang række argumenter, der kan angives for at påvirke stort set alle aspekter af layout og tema. Der findes desuden færdige temaer, som eksempelvis theme_bw(), der giver grafen en bestemt stil. At bruge et færdigt tema (eksempelvis theme_bw()) betyder som regel, at færre justeringer skal foretages manuelt.

Det er ikke nødvendigt at justere temaet, når man udforsker data. Det bør derimod gøres ved præsentation for at optimere det endelige resultat. De fleste fagfolk arbejder med et fåtal forskellige typer visualiseringer, og derfor kan det med fordel betale sig at investere tid i at udvikle passende temaer.

I dette kapitel arbejder vi med data fra gapminder, som findes i pakken med samme navn. Indlæs gapminder med følgende kode:

library(gapminder)

## Inspicér de første 5 rækker
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 begynder med en graf uden nogen justeringer af temaet (bemærk, at vi logaritmerer pop og lifeExp, for at grafen bliver tydeligere):

ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje, standardtemaet med grå baggrund

Vi vil nu ændre dette tema ved at demonstrere 8 komplette temaer. For at skrive effektiv kode opretter vi derfor et objekt (base_plot), som indeholder ovenstående graf:

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

Nu tilføjer vi temaer til base_plot. Vi tilføjer også en titel, så det fremgår af grafen, hvilket tema der er brugt (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()
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_void, uden akser og gitterlinjer
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_light med lysegrå gitterlinjer
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_dark med mørkegråt panel
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_linedraw med sort ramme og gitterlinjer
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje, titlen Theme Grey med hvid baggrund og lyse gitterlinjer
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_minimal med hvid baggrund uden ramme
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_classic med akselinjer uden gitterlinjer
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje i theme_bw med hvid baggrund og sort ramme

Ggthemes

Pakken ggthemes (https://jrnold.github.io/ggthemes/) indeholder endnu flere komplette themes, scales og geoms til ggplot2. I ggthemes findes flere muligheder end i nogen anden eksisterende pakke. Desuden findes der muligheder, som er særligt udviklet til forskning, videnskabelig publikation, farveblindhed, specifikke tidsskrifter, applikationer osv. Installér pakken med følgende kommando:

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

Vi afprøver et færdigt tema udformet efter Wall Street Journal:

base_plot +
  labs(title="Theme Wall Street Journal") +
  theme_wsj()
Punktdiagram af gapminder-data i theme_wsj fra ggthemes med beige baggrund, prikkede linjer og forklaring øverst

Justér specifikke elementer

Alle ovenstående eksempler var færdige temaer, som ændrer mange elementer på én gang. Du kan ændre stort set alle elementer i temaet ved hjælp af theme(). Denne funktion tager et stort antal elementer, som har elementfunktioner. Eksempelvis bruges elementet title til at justere alle titlerne. Da titler er tekst, har de elementfunktionen element_text(). I element_text() kan vi eksempelvis ændre størrelsen og farven på titlerne med følgende kode:

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

I grafen ser det sådan ud:

base_plot +
theme(title = element_text(size=15, color="gold1"))
Punktdiagram af log(lifeExp) mod log(pop) farvet efter kontinent med regressionslinje, hvor aksetitler og forklaringstitel er gule og større
Her følger en liste over elementerne i theme(), efterfulgt af et billede, der viser de mest almindelige elementer og deres elementfunktioner.
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,
)

Elementfunktioner:

Oversigt over ggplot2-temaelementer med pile til akse-, plot-, facet- og forklaringselementer og deres elementfunktioner

Nedenfor laver vi en figur med labels (labs()) for x, y og titel; nye skalaer for x og y; samt justering af en række theme()-elementer.

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

  # Ændrer 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"))
Punktdiagram af forventet levetid mod befolkning med beige baggrund, stiplede gitterlinjer i to farver og brune forklaringstekster