Tema (themes)

För att justera tema och layout finns funktionen theme(), vilken har en lång rad argument som kan specificeras för att påverka i princip alla aspekter av layout och tema. Det finns dessutom färdiga teman, som exempelvis theme_bw(), vilka ger grafen en särskild stil. Att använda ett färdigt tema (exempelvis theme_bw()) innebär som regel att färre justeringar behöver göras manuellt.

Att justera temat är inte nödvändigt för exploration av data. Det bör däremot göras vid presentation för att optimera det slutgiltiga resultatet. De flesta yrkesutövare arbetar med ett fåtal olika typer av visualiseringar och därför kan man med fördel investera tid i att utveckla passande teman.

I detta kapitel arbetar vi med data från gapminder, som finns i paketet med samma namn. Ladda gapminder med följande kod:

library(gapminder)

## Inspektera första 5 rader
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 börjar med en graf utan några justeringar av temat (notera att vi logaritmerar pop och lifeExp för att grafen blir tydligare):

ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje, standardtemat med grå bakgrund

Vi ska nu modifiera detta tema genom att demonstrera 8 kompletta teman. För att skriva effektiv kod kommer vi därför skapa ett objekt (base_plot) som innehåller ovanstående graf:

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

Nu adderar vi teman på base_plot. Vi adderar även en titel för att det skall framgå på grafen vilket tema som har använts (se nedan).

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()
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_void, utan axlar och rutnät
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_light med ljusgrått rutnät
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_dark med mörkgrå panel
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_linedraw med svart ram och rutnät
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje, titeln Theme Grey med vit bakgrund och ljust rutnät
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_minimal med vit bakgrund utan ram
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_classic med axellinjer utan rutnät
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje i theme_bw med vit bakgrund och svart ram

Ggthemes

Paketet ggthemes (https://jrnold.github.io/ggthemes/) innehåller ännu fler kompletta themes, scales och geoms för ggplot2. I ggthemes finns fler alternativ än i något annat existerande paket. Vidare finns alternativ särskilt framtagna för forskning, vetenskaplig publikation, färgblindhet, specifika tidskrifter, applikationer, osv. Installera paket med följande kommando:

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

Vi provar ett färdigt tema skapat efter Wall Street Journal:

base_plot +
  labs(title="Theme Wall Street Journal") +
  theme_wsj()
Spridningsdiagram av gapminder-data i theme_wsj från ggthemes med beige bakgrund, prickade linjer och förklaring överst

Justera specifika element

Samtliga ovanstående exempel utgjordes av färdiga teman som modifierar många element samtidigt. Du kan modifiera i princip samtliga element i temat med hjälp av theme(). Denna funktion tar ett stort antal element som har elementfunktioner. Exempelvis används elementet title för att justera alla titlarna. Eftersom titlar är text så har de elementfunktionen element_text(). I element_text() kan vi exempelvis ändra storleken och färgen på titlarna med följande kod:

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

I grafen blir det som följer:

base_plot +
theme(title = element_text(size=15, color="gold1"))
Spridningsdiagram av log(lifeExp) mot log(pop) färgat efter kontinent med regressionslinje där axeltitlar och förklaringstitel är gula och större
Här följer en lista på elementen i theme(), följt av en bild som visar de vanligaste elementen och deras 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:

Översikt över ggplot2-temaelement med pilar till axel-, plot-, facett- och förklaringselement och deras elementfunktioner

Nedan skapar vi en figur med labels (labs()) för x, y och titel; nya skalor för x och y; samt justering av ett antal theme() element.

base_plot +
  # Ändrar labels på x, y och titel
  labs(x="Population",
       y="Life expectancy (years)",
       title="Life expectancy and population size") +

  # Ändrar skalan på x-axel och y-axel
  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)) +

  # Justerar teat
  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"))
Spridningsdiagram av förväntad livslängd mot befolkning med beige bakgrund, streckat rutnät i två färger och bruna förklaringstexter