# -----------------------------
# 1) HISTORICAL EPOCHS
# -----------------------------
hist <- tribble(
~label, ~start, ~end,
"Early UK Industrialization", "1760-01-01", "1830-01-01",
"French Revolution", "1789-07-14", "1799-11-09",
"Revolutions of 1848", "1848-01-01", "1849-12-31",
"2nd Industrial Revolution", "1870-01-01", "1914-07-27",
"World War I", "1914-07-28", "1918-11-11",
"Mass production / Fordism", "1913-01-01", "1973-12-31",
"Great Depression", "1929-10-01", "1939-09-01",
"World War II", "1939-09-01", "1945-09-02",
"Cold War", "1947-01-01", "1991-12-26",
"Oil shocks (I + II)", "1973-01-01", "1980-12-31",
"Int.Platforms & Soc.networks", "2007-01-01", "2030-12-31"
) %>%
mutate(panel = "Historical epochs",
start = as.Date(start),
end = as.Date(end))
# -----------------------------
# 2) SCIENCE
# -----------------------------
science <- tribble(
~label, ~start, ~end,
"Probability & statistics", "1770-01-01", "1933-01-01",
"Electricity & magnetism", "1820-01-01", "1873-12-31",
"Theory of evolution", "1859-01-01", "1871-12-31",
"Informatics / CS foundations", "1936-01-01", "1950-12-31",
"DNA / molecular biology", "1953-01-01", "1970-12-31",
"Social network theory", "1934-01-01", "1973-12-31"
) %>%
mutate(panel = "Science",
start = as.Date(start),
end = as.Date(end))
# -----------------------------
# 3) ECONOMICS (add Marxism)
# -----------------------------
schools <- tribble(
~label, ~start, ~end,
"Classical Economics", "1776-01-01", "1870-12-31",
"Malthusianism", "1798-01-01", "1850-12-31",
"Marxism", "1848-01-01", "1917-12-31",
"Neoclassical Economics", "1870-01-01", "1936-12-31",
"Keynesianism", "1936-01-01", "1975-12-31",
"Monetarism", "1950-01-01", "1985-12-31",
"New Classical Economics", "1970-01-01", "1995-12-31",
"Game Theory", "1944-01-01", "2030-12-31",
"Behavioral Economics", "1970-01-01", "2030-12-31"
) %>%
mutate(panel = "Economics",
start = as.Date(start),
end = as.Date(end))
bars <- bind_rows(hist, science, schools) %>%
group_by(panel) %>%
mutate(label = forcats::fct_reorder(label, start, .desc = TRUE)) %>%
ungroup()
# -----------------------------
# TECHNOLOGICAL MILESTONES
# -----------------------------
milestones <- tribble(
~id, ~tech, ~date,
1, "Steam engine (1769)", "1769-01-01",
2, "Telegraph (1844)", "1844-05-24",
3, "Electricity (1882)", "1882-09-04",
4, "Car invention (1886)", "1886-01-29",
5, "Radio – mass diffusion (1920)","1920-01-01",
6, "1st nuclear reactor (1942)", "1942-12-02",
7, "1st computer (1946)", "1946-02-14",
8, "Transistor (1947)", "1947-12-16",
9, "Television – mass diffusion (1950)", "1950-01-01",
10, "ARPANET (1969)", "1969-10-29",
11, "Internet TCP/IP (1983)", "1983-01-01",
12, "Smartphone era (2007)", "2007-01-09"
) %>%
mutate(date = as.Date(date))
# decade ticks ending with 0
xmin <- min(bars$start, milestones$date)
xmax <- max(bars$end, milestones$date)
xmin_year <- floor(year(xmin)/10)*10
xmax_year <- ceiling(year(xmax)/10)*10
decade_breaks <- seq(as.Date(paste0(xmin_year,"-01-01")),
as.Date(paste0(xmax_year,"-01-01")),
by="10 years")
# 2-line caption legend for milestones
legend_vec <- paste0(milestones$id," = ",milestones$tech)
half <- ceiling(length(legend_vec)/2)
legend_vec <- paste0(milestones$id, " = ", milestones$tech)
# split into 2 lines
third <- ceiling(length(legend_vec) / 3)
legend_text <- paste0(
paste(legend_vec[1:third], collapse = " | "),
"\n",
paste(legend_vec[(third+1):(2*third)], collapse = " | "),
"\n",
paste(legend_vec[(2*third+1):length(legend_vec)], collapse = " | ")
)
panel_colors <- c(
"Historical epochs" = "steelblue4",
"Science" = "darkred",
"Economics" = "purple4"
)
panel_bg <- c(
"Historical epochs" = "#EDF3FF",
"Science" = "#FDECEC",
"Economics" = "#F3EDFF"
)
ggplot(bars, aes(y = label)) +
facet_grid2(
panel ~ .,
scales = "free_y",
space = "free_y",
strip = strip_themed(
background_y = elem_list_rect(fill = panel_bg, colour = NA),
text_y = elem_list_text(face = "bold")
)
) +
geom_vline(
data = milestones,
aes(xintercept = date),
colour = "darkgreen",
linewidth = 0.6,
inherit.aes = FALSE
) +
geom_text(
data = milestones,
aes(x = date, y = Inf, label = id),
angle = 90, vjust = 1.2, hjust = 0,
colour = "darkgreen",
size = 3,
inherit.aes = FALSE
) +
geom_segment(
aes(x = start, xend = end, yend = label, colour = panel),
linewidth = 0.9,
lineend = "round"
) +
scale_colour_manual(values = panel_colors, guide = "none") +
scale_x_date(
breaks = decade_breaks,
date_labels = "%Y",
expand = expansion(mult = c(0.02, 0.05))
) +
labs(x = "Year", y = NULL, caption = legend_text) +
theme_minimal(base_size = 12.5) +
theme(
axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
plot.caption = element_text(size = 8, hjust = 0.5, margin = margin(t = 15)),
panel.spacing.y = unit(0.8, "lines"),
plot.margin = margin(40, 80, 80, 60)
) +
coord_cartesian(clip = "off")

LS0tCnRpdGxlOiAiS8OzZCBrIMSMYXNvdmVqIG9zaSIKYXV0aG9yOiAiVmxhZGltw61yIEdhemRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdnaDR4KQpgYGAKCi0tLQoKYGBge3IgdGltZWxpbmUtcGxvdCwgaW5jbHVkZT1UUlVFLCBlY2hvPVRSVUV9CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxKSBISVNUT1JJQ0FMIEVQT0NIUwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmhpc3QgPC0gdHJpYmJsZSgKICB+bGFiZWwsIH5zdGFydCwgfmVuZCwKICAiRWFybHkgVUsgSW5kdXN0cmlhbGl6YXRpb24iLCAiMTc2MC0wMS0wMSIsICIxODMwLTAxLTAxIiwKICAiRnJlbmNoIFJldm9sdXRpb24iLCAgICAgICAgICAiMTc4OS0wNy0xNCIsICIxNzk5LTExLTA5IiwKICAiUmV2b2x1dGlvbnMgb2YgMTg0OCIsICAgICAgICAiMTg0OC0wMS0wMSIsICIxODQ5LTEyLTMxIiwKICAiMm5kIEluZHVzdHJpYWwgUmV2b2x1dGlvbiIsICAiMTg3MC0wMS0wMSIsICIxOTE0LTA3LTI3IiwKICAiV29ybGQgV2FyIEkiLCAgICAgICAgICAgICAgICAiMTkxNC0wNy0yOCIsICIxOTE4LTExLTExIiwKICAiTWFzcyBwcm9kdWN0aW9uIC8gRm9yZGlzbSIsICAiMTkxMy0wMS0wMSIsICIxOTczLTEyLTMxIiwKICAiR3JlYXQgRGVwcmVzc2lvbiIsICAgICAgICAgICAiMTkyOS0xMC0wMSIsICIxOTM5LTA5LTAxIiwKICAiV29ybGQgV2FyIElJIiwgICAgICAgICAgICAgICAiMTkzOS0wOS0wMSIsICIxOTQ1LTA5LTAyIiwKICAiQ29sZCBXYXIiLCAgICAgICAgICAgICAgICAgICAiMTk0Ny0wMS0wMSIsICIxOTkxLTEyLTI2IiwKICAiT2lsIHNob2NrcyAoSSArIElJKSIsICAgICAgICAiMTk3My0wMS0wMSIsICIxOTgwLTEyLTMxIiwKICAiSW50LlBsYXRmb3JtcyAmIFNvYy5uZXR3b3JrcyIsICAgICAgICAgICAiMjAwNy0wMS0wMSIsICIyMDMwLTEyLTMxIgopICU+JQogIG11dGF0ZShwYW5lbCA9ICJIaXN0b3JpY2FsIGVwb2NocyIsCiAgICAgICAgIHN0YXJ0ID0gYXMuRGF0ZShzdGFydCksCiAgICAgICAgIGVuZCAgID0gYXMuRGF0ZShlbmQpKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIpIFNDSUVOQ0UKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzY2llbmNlIDwtIHRyaWJibGUoCiAgfmxhYmVsLCB+c3RhcnQsIH5lbmQsCiAgIlByb2JhYmlsaXR5ICYgc3RhdGlzdGljcyIsICAgICAgIjE3NzAtMDEtMDEiLCAiMTkzMy0wMS0wMSIsCiAgIkVsZWN0cmljaXR5ICYgbWFnbmV0aXNtIiwgICAgICAgIjE4MjAtMDEtMDEiLCAiMTg3My0xMi0zMSIsCiAgIlRoZW9yeSBvZiBldm9sdXRpb24iLCAgICAgICAgICAgIjE4NTktMDEtMDEiLCAiMTg3MS0xMi0zMSIsCiAgIkluZm9ybWF0aWNzIC8gQ1MgZm91bmRhdGlvbnMiLCAgIjE5MzYtMDEtMDEiLCAiMTk1MC0xMi0zMSIsCiAgIkROQSAvIG1vbGVjdWxhciBiaW9sb2d5IiwgICAgICAgIjE5NTMtMDEtMDEiLCAiMTk3MC0xMi0zMSIsCiAgIlNvY2lhbCBuZXR3b3JrIHRoZW9yeSIsICAgICAgICAgIjE5MzQtMDEtMDEiLCAiMTk3My0xMi0zMSIKKSAlPiUKICBtdXRhdGUocGFuZWwgPSAiU2NpZW5jZSIsCiAgICAgICAgIHN0YXJ0ID0gYXMuRGF0ZShzdGFydCksCiAgICAgICAgIGVuZCAgID0gYXMuRGF0ZShlbmQpKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMykgRUNPTk9NSUNTIChhZGQgTWFyeGlzbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzY2hvb2xzIDwtIHRyaWJibGUoCiAgfmxhYmVsLCB+c3RhcnQsIH5lbmQsCiAgIkNsYXNzaWNhbCBFY29ub21pY3MiLCAgICAgICAgIjE3NzYtMDEtMDEiLCAiMTg3MC0xMi0zMSIsCiAgIk1hbHRodXNpYW5pc20iLCAgICAgICAgICAgICAgIjE3OTgtMDEtMDEiLCAiMTg1MC0xMi0zMSIsCiAgIk1hcnhpc20iLCAgICAgICAgICAgICAgICAgICAgIjE4NDgtMDEtMDEiLCAiMTkxNy0xMi0zMSIsCiAgIk5lb2NsYXNzaWNhbCBFY29ub21pY3MiLCAgICAgIjE4NzAtMDEtMDEiLCAiMTkzNi0xMi0zMSIsCiAgIktleW5lc2lhbmlzbSIsICAgICAgICAgICAgICAgIjE5MzYtMDEtMDEiLCAiMTk3NS0xMi0zMSIsCiAgIk1vbmV0YXJpc20iLCAgICAgICAgICAgICAgICAgIjE5NTAtMDEtMDEiLCAiMTk4NS0xMi0zMSIsCiAgIk5ldyBDbGFzc2ljYWwgRWNvbm9taWNzIiwgICAgIjE5NzAtMDEtMDEiLCAiMTk5NS0xMi0zMSIsCiAgIkdhbWUgVGhlb3J5IiwgICAgICAgICAgICAgICAgIjE5NDQtMDEtMDEiLCAiMjAzMC0xMi0zMSIsCiAgIkJlaGF2aW9yYWwgRWNvbm9taWNzIiwgICAgICAgIjE5NzAtMDEtMDEiLCAiMjAzMC0xMi0zMSIKKSAlPiUKICBtdXRhdGUocGFuZWwgPSAiRWNvbm9taWNzIiwKICAgICAgICAgc3RhcnQgPSBhcy5EYXRlKHN0YXJ0KSwKICAgICAgICAgZW5kICAgPSBhcy5EYXRlKGVuZCkpCgpiYXJzIDwtIGJpbmRfcm93cyhoaXN0LCBzY2llbmNlLCBzY2hvb2xzKSAlPiUKICBncm91cF9ieShwYW5lbCkgJT4lCiAgbXV0YXRlKGxhYmVsID0gZm9yY2F0czo6ZmN0X3Jlb3JkZXIobGFiZWwsIHN0YXJ0LCAuZGVzYyA9IFRSVUUpKSAlPiUKICB1bmdyb3VwKCkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBURUNITk9MT0dJQ0FMIE1JTEVTVE9ORVMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptaWxlc3RvbmVzIDwtIHRyaWJibGUoCiAgfmlkLCB+dGVjaCwgICAgICAgICAgICAgICAgICAgICAgICAgfmRhdGUsCiAgMSwgICJTdGVhbSBlbmdpbmUgKDE3NjkpIiwgICAgICAgICAgIjE3NjktMDEtMDEiLAogIDIsICAiVGVsZWdyYXBoICgxODQ0KSIsICAgICAgICAgICAgICIxODQ0LTA1LTI0IiwKICAzLCAgIkVsZWN0cmljaXR5ICgxODgyKSIsICAgICAgICAgICAiMTg4Mi0wOS0wNCIsCiAgNCwgICJDYXIgaW52ZW50aW9uICgxODg2KSIsICAgICAgICAgIjE4ODYtMDEtMjkiLAogIDUsICAiUmFkaW8g4oCTIG1hc3MgZGlmZnVzaW9uICgxOTIwKSIsIjE5MjAtMDEtMDEiLAogIDYsICAiMXN0IG51Y2xlYXIgcmVhY3RvciAoMTk0MikiLCAgICIxOTQyLTEyLTAyIiwKICA3LCAgIjFzdCBjb21wdXRlciAoMTk0NikiLCAgICAgICAgICAiMTk0Ni0wMi0xNCIsCiAgOCwgICJUcmFuc2lzdG9yICgxOTQ3KSIsICAgICAgICAgICAgIjE5NDctMTItMTYiLAogIDksICAiVGVsZXZpc2lvbiDigJMgbWFzcyBkaWZmdXNpb24gKDE5NTApIiwgIjE5NTAtMDEtMDEiLAogIDEwLCAiQVJQQU5FVCAoMTk2OSkiLCAgICAgICAgICAgICAgICIxOTY5LTEwLTI5IiwKICAxMSwgIkludGVybmV0IFRDUC9JUCAoMTk4MykiLCAgICAgICAiMTk4My0wMS0wMSIsCiAgMTIsICJTbWFydHBob25lIGVyYSAoMjAwNykiLCAgICAgICAgIjIwMDctMDEtMDkiCikgJT4lCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUpKQoKIyBkZWNhZGUgdGlja3MgZW5kaW5nIHdpdGggMAp4bWluIDwtIG1pbihiYXJzJHN0YXJ0LCBtaWxlc3RvbmVzJGRhdGUpCnhtYXggPC0gbWF4KGJhcnMkZW5kLCAgIG1pbGVzdG9uZXMkZGF0ZSkKeG1pbl95ZWFyIDwtIGZsb29yKHllYXIoeG1pbikvMTApKjEwCnhtYXhfeWVhciA8LSBjZWlsaW5nKHllYXIoeG1heCkvMTApKjEwCmRlY2FkZV9icmVha3MgPC0gc2VxKGFzLkRhdGUocGFzdGUwKHhtaW5feWVhciwiLTAxLTAxIikpLAogICAgICAgICAgICAgICAgICAgICBhcy5EYXRlKHBhc3RlMCh4bWF4X3llYXIsIi0wMS0wMSIpKSwKICAgICAgICAgICAgICAgICAgICAgYnk9IjEwIHllYXJzIikKCiMgMi1saW5lIGNhcHRpb24gbGVnZW5kIGZvciBtaWxlc3RvbmVzCmxlZ2VuZF92ZWMgPC0gcGFzdGUwKG1pbGVzdG9uZXMkaWQsIiA9ICIsbWlsZXN0b25lcyR0ZWNoKQpoYWxmIDwtIGNlaWxpbmcobGVuZ3RoKGxlZ2VuZF92ZWMpLzIpCmxlZ2VuZF92ZWMgPC0gcGFzdGUwKG1pbGVzdG9uZXMkaWQsICIgPSAiLCBtaWxlc3RvbmVzJHRlY2gpCgojIHNwbGl0IGludG8gMiBsaW5lcwp0aGlyZCA8LSBjZWlsaW5nKGxlbmd0aChsZWdlbmRfdmVjKSAvIDMpCmxlZ2VuZF90ZXh0IDwtIHBhc3RlMCgKICBwYXN0ZShsZWdlbmRfdmVjWzE6dGhpcmRdLCBjb2xsYXBzZSA9ICIgICB8ICAgIiksCiAgIlxuIiwKICBwYXN0ZShsZWdlbmRfdmVjWyh0aGlyZCsxKTooMip0aGlyZCldLCBjb2xsYXBzZSA9ICIgICB8ICAgIiksCiAgIlxuIiwKICBwYXN0ZShsZWdlbmRfdmVjWygyKnRoaXJkKzEpOmxlbmd0aChsZWdlbmRfdmVjKV0sIGNvbGxhcHNlID0gIiAgIHwgICAiKQopCgpwYW5lbF9jb2xvcnMgPC0gYygKICAiSGlzdG9yaWNhbCBlcG9jaHMiID0gInN0ZWVsYmx1ZTQiLAogICJTY2llbmNlIiAgICAgICAgICAgPSAiZGFya3JlZCIsCiAgIkVjb25vbWljcyIgICAgICAgICA9ICJwdXJwbGU0IgopCgpwYW5lbF9iZyA8LSBjKAogICJIaXN0b3JpY2FsIGVwb2NocyIgPSAiI0VERjNGRiIsCiAgIlNjaWVuY2UiICAgICAgICAgICA9ICIjRkRFQ0VDIiwKICAiRWNvbm9taWNzIiAgICAgICAgID0gIiNGM0VERkYiCikKCmdncGxvdChiYXJzLCBhZXMoeSA9IGxhYmVsKSkgKwogIGZhY2V0X2dyaWQyKAogICAgcGFuZWwgfiAuLAogICAgc2NhbGVzID0gImZyZWVfeSIsCiAgICBzcGFjZSAgPSAiZnJlZV95IiwKICAgIHN0cmlwID0gc3RyaXBfdGhlbWVkKAogICAgICBiYWNrZ3JvdW5kX3kgPSBlbGVtX2xpc3RfcmVjdChmaWxsID0gcGFuZWxfYmcsIGNvbG91ciA9IE5BKSwKICAgICAgdGV4dF95ICAgICAgID0gZWxlbV9saXN0X3RleHQoZmFjZSA9ICJib2xkIikKICAgICkKICApICsKICBnZW9tX3ZsaW5lKAogICAgZGF0YSA9IG1pbGVzdG9uZXMsCiAgICBhZXMoeGludGVyY2VwdCA9IGRhdGUpLAogICAgY29sb3VyID0gImRhcmtncmVlbiIsCiAgICBsaW5ld2lkdGggPSAwLjYsCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFCiAgKSArCiAgZ2VvbV90ZXh0KAogICAgZGF0YSA9IG1pbGVzdG9uZXMsCiAgICBhZXMoeCA9IGRhdGUsIHkgPSBJbmYsIGxhYmVsID0gaWQpLAogICAgYW5nbGUgPSA5MCwgdmp1c3QgPSAxLjIsIGhqdXN0ID0gMCwKICAgIGNvbG91ciA9ICJkYXJrZ3JlZW4iLAogICAgc2l6ZSA9IDMsCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFCiAgKSArCiAgZ2VvbV9zZWdtZW50KAogICAgYWVzKHggPSBzdGFydCwgeGVuZCA9IGVuZCwgeWVuZCA9IGxhYmVsLCBjb2xvdXIgPSBwYW5lbCksCiAgICBsaW5ld2lkdGggPSAwLjksCiAgICBsaW5lZW5kID0gInJvdW5kIgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gcGFuZWxfY29sb3JzLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3hfZGF0ZSgKICAgIGJyZWFrcyA9IGRlY2FkZV9icmVha3MsCiAgICBkYXRlX2xhYmVscyA9ICIlWSIsCiAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMiwgMC4wNSkpCiAgKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gTlVMTCwgY2FwdGlvbiA9IGxlZ2VuZF90ZXh0KSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMi41KSArCnRoZW1lKAogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpLApwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGhqdXN0ID0gMC41LCBtYXJnaW4gPSBtYXJnaW4odCA9IDE1KSksCiAgcGFuZWwuc3BhY2luZy55ID0gdW5pdCgwLjgsICJsaW5lcyIpLAogIHBsb3QubWFyZ2luID0gbWFyZ2luKDQwLCA4MCwgODAsIDYwKQopICsKICBjb29yZF9jYXJ0ZXNpYW4oY2xpcCA9ICJvZmYiKQpgYGAK