Overplotting med tidsserier og en løsningsmodel (i R!)

Søren Skotte Bjerregaard

Overplotting er ofte et problem, hvis man gerne vil visualisere mange tidsserier. Hvis ikke du stiller dig tilfreds med at tage et subset af dit data fordi alt skal med, så er her en løsningsmodel (i R!).

Fra tid til anden løber jeg ind i problemer med tidsserieplot, hvis jeg eksempelvis skal se på, hvordan befolkningen grupperer sig på uddannelsesgrupper, kommuner, arbejdsmarkedsgrupper osv. over tid, fordi linjerne klumper sig sammen overpå hinanden. Et fænomen som også kaldes “overplotting”. I The Truthful Art (2016) kommer Cairo med en godt forslag til en visualiseringsteknik, som kan løse dette problem. Jeg vil her illustrere, hvordan man forholdsvist nemt kan bruge denne teknik med ggplot2 pakken i R.

Først henter jeg de relevante pakker (hvis du er interesseret i at se koden, der henter pakker, data, laver grafer osv. så tryk på “Code” ude til højre). De mest centrale pakker her er tidyverse, der indeholder relevante funktioner til datamanipulation samt grafik og gapminder-pakken, som indeholder gapminder-datasættet.

library(tidyverse)
library(gapminder)
library(scales)
library(countrycode)
library(DT)
library(ggthemes)

Gapminder-datasættet indeholder BNP per capita, befolkningstal og forventet levetid for hvert femte år i perioden 1952-2007 for en lang række lande. For at begrænse eksemplet her en smule, afgrænser jeg datasættet til europæiske lande og bruger i øvrigt countrycode-pakken, til at danne variablen country med ISO3-landeforkortelser (fx Denmark = DNK)

gapminder <- 
  gapminder::gapminder %>% 
  filter(continent == "Europe") %>% 
  mutate(country_name = country,
         country = countrycode(country, 'country.name', 'iso3c'))

Hvis du ligesom mig er lidt rusten i dine ISO3-landeforkortelse, så har du (ligesom jeg) muligvis gavn af den interaktive tabel nedenfor, som jeg laver med DT-pakken. Her kan du dels se hele datasættet, men mere belejligt kan du søge på landeforkortelserne og finde det tilsvarende land.

datatable(gapminder)

Ok - tilbage til problemet. Nedenfor laver jeg en tidsserie for alle europæiske lande inkluderet i datasættet. De tre første linjer i koden laver grafen, mens det resterende er til for at gøre figuren lidt pænere1. Resultatet er dog nedslående. Selvom alle lande tildeles en unik farve, så benytter jeg så bred en palette af farveskalaen, at nogle af farverne nærmest er umulige at skelne mellem2. Kan du eksempelvis se hvilken linje, som Belgien (BEL) udgør på figuren? Et andet problem er, at stregerne ligger oveni hinanden, hvilket kan gøre det svært bare at følge en enkelt serie.

gapminder %>% 
  ggplot(aes(x = year, y = gdpPercap, col = country)) +
  geom_line() +
  labs(title = "Growth in Europe",
       subtitle = "Development in GDP pr. capita across Europe, 1952-2007",
       y = "") +
  theme_minimal() +
  theme(panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank(),
        axis.ticks.x = element_line(colour = "black")) +
  scale_y_continuous(breaks = pretty_breaks(5), 
                       labels = dollar_format()) +
  scale_x_continuous(breaks = 
                       c(seq(min(gapminder$year), 
                             max(gapminder$year),11)))