Maps are a powerful tool for presenting data. Because igoR focuses on intergovernmental organizations, mapping and IGOs are a natural fit.
This vignette provides geospatial visualizations using the IGO data sets (Pevehouse et al. 2020) included in this package. It uses these packages for geospatial data:
The countrycode package is useful for translating between coding schemes (COW, ISO3, NUTS and FIPS) and country names.
library(igoR)
# Helper packages.
library(dplyr)
library(ggplot2)
library(countrycode)
# Geospatial packages.
library(giscoR)
library(sf)The following map shows the evolution of United Nations membership. First, extract the data.
# Extract shapes.
world <- gisco_get_countries()
# Extract three dates. Some errors occur because ISO does not include every COW
# code.
un_all <- igo_members("UN", c(1950, 1980, 2010), status = "Full Membership") %>%
# Add the ISO3 code.
mutate(ISO3_CODE = countrycode(ccode, "cown", "iso3c", warn = FALSE)) %>%
select(year, orgname, ISO3_CODE, category)
# Build an auxiliary data frame to collect every ISO3-year pair.
base_df <- expand.grid(
ISO3_CODE = unique(world$ISO3_CODE),
year = unique(un_all$year),
stringsAsFactors = FALSE
) %>%
as_tibble()
# Merge everything with the spatial object.
un_all_sf <- world %>%
# Expand to all cases.
left_join(base_df, by = "ISO3_CODE") %>%
# Add information.
left_join(un_all, by = c("ISO3_CODE", "year"))The map is not completely accurate because the base shapefile contains countries that existed in 2016. Some countries, such as Czechoslovakia, East Germany and West Germany, are not included.
Now we are ready to plot with ggplot2:
ggplot(un_all_sf) +
geom_sf(aes(fill = category), color = NA, show.legend = FALSE) +
# Robinson
coord_sf(crs = "ESRI:54030") +
facet_wrap(~year, ncol = 1, strip.position = "left") +
scale_fill_manual(
values = c("Full Membership" = "#74A9CF"),
na.value = "#E0E0E0",
) +
labs(
title = "UN members",
caption = gisco_attributions(),
) +
theme_minimal() +
theme(
plot.caption = element_text(face = "italic", hjust = 0.15),
axis.line = element_blank(),
axis.text = element_blank()
)UN members (1950, 1980, 2010)
Shared memberships are useful for identifying regional patterns. The following code maps how many full memberships each country shared with Australia in 2014.
# Count IGOs shared in 2014.
# Find countries alive in 2014.
states2014 <- states2016 %>%
filter(styear <= 2014 & endyear >= 2014)
# Find shared memberships with Australia.
shared <- igo_dyadic("AUL", as.character(states2014$statenme), year = 2014) %>%
rowwise() %>%
mutate(shared = sum(c_across(aaaid:wassen) == 1)) %>%
mutate(ISO3_CODE = countrycode(ccode2, "cown", "iso3c", warn = FALSE)) %>%
select(ISO3_CODE, shared)
# Merge with the map.
sharedmap <- world %>%
left_join(shared, by = "ISO3_CODE") %>%
select(ISO3_CODE, shared)
# Plot with a custom palette.
pal <- hcl.colors(10, palette = "Lajolla")
# Plot the results.
ggplot(sharedmap) +
geom_sf(aes(fill = shared), color = NA) +
# Highlight Australia.
geom_sf(
data = sharedmap %>% filter(ISO3_CODE == "AUS"),
fill = "black",
color = NA,
) +
# Robinson
coord_sf(crs = "ESRI:54030") +
scale_fill_gradientn(colours = pal, n.breaks = 10) +
guides(fill = guide_legend(nrow = 1)) +
labs(
title = "Shared full memberships with Australia (2014)",
fill = "Number of IGOs shared",
caption = gisco_attributions()
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.caption = element_text(face = "italic", size = 7, hjust = 0.15),
axis.line = element_blank(),
axis.text = element_blank(),
legend.title = element_text(size = 7),
legend.text = element_text(size = 8),
legend.position = "bottom",
legend.direction = "horizontal",
legend.title.position = "top",
legend.text.position = "bottom",
legend.key.width = unit(1.5, "lines"),
legend.key.height = unit(0.5, "lines")
)Shared full memberships with Australia (2014)
The following map shows how relationships between North American countries evolved over the last 90 years, with one year representing each decade.
# Select years.
years <- seq(1930, 2010, 10)
# Find shared memberships.
cntries <- c("USA", "CAN", "MEX")
all <- igo_dyadic(cntries, cntries, years) %>%
rowwise() %>%
mutate(value = sum(c_across(aaaid:wassen) == 1)) %>%
mutate(ISO3_CODE = countrycode(ccode1, "cown", "iso3c")) %>%
select(ISO3_CODE, year, value)
# Get shapes for the map.
countries_sf <- gisco_get_countries(country = c("USA", "MEX", "CAN")) %>%
left_join(all, by = "ISO3_CODE")
# Plot the map.
ggplot(countries_sf) +
geom_sf(aes(fill = value), color = NA) +
coord_sf(crs = 9311, xlim = c(-3200000, 3333018)) +
facet_wrap(~year, ncol = 3) +
scale_fill_gradientn(
colors = hcl.colors(10, "YlGn", rev = TRUE),
breaks = seq(0, 100, 5)
) +
guides(fill = guide_legend(reverse = TRUE)) +
labs(
title = "Shared full memberships in North America",
subtitle = "(1930-2010)",
fill = "Shared IGOs",
caption = gisco_attributions()
) +
theme_minimal() +
theme(
panel.grid = element_blank(),
axis.line = element_blank(),
axis.text = element_blank(),
strip.background = element_rect(fill = "grey90", colour = NA)
)Shared full memberships in North America (1930-2010)