Abstract

This project presents an advanced, dual-mode data visualization of GDP per capita (PPP-adjusted USD) across six high-income OECD countries—USA, Canada, Germany, France, Japan, and South Korea—over the period 1970 to 2022. By integrating both faceted static plots and interactive web-based graphics, the visualization explores the temporal dynamics of economic performance, annotating global shocks such as the 1997 Asian Crisis and 2008 Global Financial Crisis. This approach bridges narrative storytelling and empirical analysis to provide a comprehensive tool for understanding macroeconomic resilience, divergence, and recovery. The project is positioned to inform academic discourse, public policy, and economic literacy at both national and international levels.

Data Source and Motivation

The data were obtained from the OECD National Accounts dataset and filtered to retain GDP per capita (constant USD PPP) for six representative countries. These countries were selected for their distinct economic models, regional diversity, and relevance in global financial governance. The research questions guiding this visualization were:

Static Visualization: Crisis-Aware Faceted Plot

library(tidyverse)
library(ggtext)
library(showtext)
library(patchwork)
library(scales)

font_add_google("Roboto Condensed", "roboto")
showtext_auto()

df <- read.csv("OECD.SDD.NAD,DSD_NAAG@DF_NAAG_I+ALL (1).csv")

df_filtered <- df %>%
  filter(MEASURE == "B1GQ", UNIT_MEASURE == "USD_PPP") %>%
  select(Country = REF_AREA, Year = TIME_PERIOD, GDP = OBS_VALUE) %>%
  filter(Country %in% c("USA", "FRA", "DEU", "JPN", "CAN", "KOR")) %>%
  mutate(
    Year = as.integer(Year),
    GDP = as.numeric(GDP),
    Country = recode(Country,
                     "USA" = "United States",
                     "CAN" = "Canada",
                     "DEU" = "Germany",
                     "FRA" = "France",
                     "JPN" = "Japan",
                     "KOR" = "South Korea"),
    Country = factor(Country, levels = c("United States", "Canada", "Germany", "France", "Japan", "South Korea"))
  )

events <- data.frame(
  Year = c(2008, 1997),
  Label = c("Global Recession", "Asian Crisis")
)

p1 <- ggplot(df_filtered, aes(x = Year, y = GDP)) +
  geom_line(color = "#1B9E77", size = 1.2) +
  geom_vline(data = events, aes(xintercept = Year), linetype = "dashed", color = "red") +
  geom_text(data = events, aes(x = Year, y = 100000, label = Label),
            inherit.aes = FALSE, angle = 90, vjust = -0.5, hjust = 1, size = 3.5) +
  facet_wrap(~ Country, ncol = 3, scales = "fixed") +
  labs(
    title = "GDP per Capita (USD PPP) in OECD Countries",
    subtitle = "Major economic crises annotated for systemic insight",
    x = "Year", y = "GDP per Capita",
    caption = "Source: OECD National Accounts"
  ) +
  theme_minimal(base_family = "roboto") +
  theme(
    plot.title = element_text(face = "bold", size = 18),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(face = "bold")
  )

p1

Interactive Visualization: Temporal Exploration

library(plotly)
library(htmlwidgets)

interactive_plot <- df_filtered %>%
  plot_ly(
    x = ~Year,
    y = ~GDP,
    color = ~Country,
    type = 'scatter',
    mode = 'lines+markers',
    hoverinfo = 'text',
    text = ~paste(
      "<b>Country:</b>", Country,
      "<br><b>Year:</b>", Year,
      "<br><b>GDP:</b> $", format(round(GDP, 0), big.mark = ",")
    )
  ) %>%
  layout(
    title = list(text = "<b>GDP per Capita (USD PPP): OECD Countries, 1970–2022</b>"),
    xaxis = list(title = "Year", tickformat = "%Y"),
    yaxis = list(title = "GDP per Capita (USD, PPP)", tickprefix = "$"),
    legend = list(title = list(text = "<b>Country</b>")),
    hoverlabel = list(bgcolor = "white", font = list(family = "Arial", size = 12))
  )

interactive_plot

Reflection and Visual Design Rationale

# This dual-plot design adheres to advanced visualization standards:
# - Faceted charts use consistent y-axis scales and crisis markers to emphasize historical context.
# - Interactivity allows the audience to compare trends dynamically and explore specific country-year combinations.
# - Replacing abbreviations with full country names (e.g., DEU → Germany) increases accessibility.
# - Minimalist themes and narrative labels improve legibility and reduce cognitive load.
# - Colorblind-friendly palettes and annotated temporal disruptions make patterns clearer to a wider audience.
# - This ensures statistical clarity, narrative strength, and reproducibility for academic or policy engagement.