Load data —————————————————————
file_names <- c(
"composition_subregions",
"composition_continent",
"composition_income",
"composition_continents_ctry_time",
"composition_continents_ctry"
)
# Read CSVs into a named list
df_list <- map(file_names, ~read_csv(paste0("../aggregated_data/", .x, ".csv")))
names(df_list) <- file_names
# Assign each list element to a variable
list2env(df_list, envir = .GlobalEnv)
<environment: R_GlobalEnv>
aggregates <- read_csv("../aggregated_data/aggregates.csv")
Functions: tabulate and plot authors composition by vars of
interest.
plot_composition <- function(df, var1, var2) {
if (is.character(var1) && is.character(var2)) {
var1 <- ensym(var1)
var2 <- ensym(var2)
}
df %>%
ggplot(aes(y = n, axis1 = !!var1, axis2 = !!var2)) +
geom_alluvium(aes(fill = !!var2)) +
geom_stratum() +
geom_label(stat = "stratum",
aes(label = after_stat(stratum)),
size = 3,
label.size = NA) +
theme(legend.position = "none") +
labs(y = "Country salience") +
scale_fill_viridis_d() +
scale_x_continuous(breaks = 1:2, labels = c("Country salience \n by region", "Composition of authors \n by region")) +
coord_cartesian(xlim = c(0.8, 2.13))
}
Alluvial, subregions.
options(scipen = 999)
composition_subregions %>%
plot_composition("subregion_gr", "team_subregion")
ggsave("../output_figures/figure_S3B_subregions_alluvial.png", width = 7, height = 7, dpi = 500, limitsize = F, plot = last_plot())

Continents
# Choose a qualitative palette with up to 8–12 distinct colors
team_continent_cats <- c("Northern America", "Europe", "Asia", "Collaboration", "Africa", "Oceania", "Lat.America & Car.")
n_colors <- length(team_continent_cats)
custom_colors <- brewer.pal(n = n_colors, name = "Set2")
(continents_alluvial <- composition_continent %>%
plot_composition("continents_gr", "team_continent") +
geom_text(stat = "flow",
aes(label = paste0(as.character(round(percent)), '%')),
nudge_x = .25,
check_overlap = T,
size = 3)) +
scale_fill_manual(values = custom_colors)
ggsave("../output_figures/figure_S3A_continents_alluvial.png", width = 7, height = 7, dpi = 500, limitsize = F, plot = last_plot())

# Cumulative percentage of three main authors affiliation mentions.
composition_continent %>% group_by(continents_gr) %>% summarise(cumpercent = sum(percent))
Alluvial: Income
(income_alluvial <- composition_income %>%
plot_composition("income_ISO3", "team_income") +
geom_text(stat = "flow",
aes(label = paste0(as.character(round(percent)), '%')),
nudge_x = .25,
check_overlap = T,
size = 3) +
geom_label(aes(x = 2, y = 10000, label = "Low income"), size = 3, fill = "white", label.size = NA) +
scale_x_continuous(breaks = 1:2, labels = c("Country salience \n by income groups", "Composition of authors \n by income groups")))
ggsave("../output_figures/figure_4_income_alluvial.png", width = 7, height = 7, dpi = 500, limitsize = F, plot = last_plot())

Reviewer’s request. Country analysis.
Bars. Selected countries by continent composition.
# Based on migration relevance.
# CIV removed research salience is very low and plot is not useful.
ei_ctry <- aggregates %>% filter(ISO3 != "CIV") %>% group_by(continent) %>% arrange(-emig_immig) %>% slice(1:1)
sel_alluvial <- c(ei_ctry$ISO3, "SYR", "VEN", "AFG")
sel_alluvial_mig <- c(ei_ctry$ISO3)
sel_alluvial_crisis <- c("SYR", "VEN", "AFG")
bar_countries_time_mig <- composition_continents_ctry_time %>%
filter(ISO3 %in% sel_alluvial_mig) %>%
ggplot() +
geom_bar(mapping = aes(x = pubyear, y = n, group = team_continent, fill = team_continent), stat = "identity") +
facet_wrap(~ country_nm_fct, scales = "free", ncol = 3) +
theme_minimal(base_size = 16) +
scale_fill_manual(values = custom_colors) + # custom_colors defined for previous plot with continents.
theme(
legend.position = "bottom") +
labs(title = "Migration relevance",
fill = "Composition of authors",
y = "Research salience",
x = "Publication year")
bar_countries_time_cri <- composition_continents_ctry_time %>%
filter(ISO3 %in% sel_alluvial_crisis) %>%
ggplot() +
geom_bar(mapping = aes(x = pubyear, y = n, group = team_continent, fill = team_continent), stat = "identity") +
facet_wrap(~ country_nm, scales = "free") +
theme_minimal(base_size = 16) +
scale_fill_manual(values = custom_colors) +
theme(
legend.position = "none") +
labs(title = "Migration crisis",
fill = "Composition of authors",
y = "Research salience",
x = "Publication year")
combined_bar_countries <- bar_countries_time_mig / bar_countries_time_cri
ggsave("../output_figures/figure_5_countries_time.png", width = 10, height = 12, dpi = 600, plot = last_plot())
Alluvial. Selected countries, by continents.
composition_continents_ctry %>%
plot_composition("country_nm", "team_continent") +
scale_fill_manual(values = custom_colors) +
scale_x_continuous(breaks = 1:2, labels = c("Country salience \n in selected countries", "Composition of authors \n by region"))
ggsave("../output_figures/figure_S4_countries_continents_alluvial.png", width = 7, height = 7, dpi = 500, limitsize = F, plot = last_plot())

# Main continent researching about the country
composition_max_labels <- composition_continents_ctry %>%
group_by(country_nm) %>%
slice_max(percent, n = 1, with_ties = FALSE) %>%
ungroup()
composition_max_labels
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KDQpTeXMuc2V0ZW52KExBTkcgPSAiZW4iKQ0KbGlicmFyeSh0aWR5dmVyc2UpICAgICAgIyBJbmNsdWRlcyBkcGx5ciwgZ2dwbG90MiwgcmVhZHIsIHB1cnJyLCBzdHJpbmdyDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeShnZ2FsbHV2aWFsKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmBgYA0KDQojIExvYWQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KYGBge3J9DQpmaWxlX25hbWVzIDwtIGMoDQogICJjb21wb3NpdGlvbl9zdWJyZWdpb25zIiwNCiAgImNvbXBvc2l0aW9uX2NvbnRpbmVudCIsDQogICJjb21wb3NpdGlvbl9pbmNvbWUiLA0KICAiY29tcG9zaXRpb25fY29udGluZW50c19jdHJ5X3RpbWUiLA0KICAiY29tcG9zaXRpb25fY29udGluZW50c19jdHJ5Ig0KKQ0KDQojIFJlYWQgQ1NWcyBpbnRvIGEgbmFtZWQgbGlzdA0KZGZfbGlzdCA8LSBtYXAoZmlsZV9uYW1lcywgfnJlYWRfY3N2KHBhc3RlMCgiLi4vYWdncmVnYXRlZF9kYXRhLyIsIC54LCAiLmNzdiIpKSkNCm5hbWVzKGRmX2xpc3QpIDwtIGZpbGVfbmFtZXMNCg0KIyBBc3NpZ24gZWFjaCBsaXN0IGVsZW1lbnQgdG8gYSB2YXJpYWJsZQ0KbGlzdDJlbnYoZGZfbGlzdCwgZW52aXIgPSAuR2xvYmFsRW52KQ0KDQphZ2dyZWdhdGVzIDwtIHJlYWRfY3N2KCIuLi9hZ2dyZWdhdGVkX2RhdGEvYWdncmVnYXRlcy5jc3YiKQ0KYGBgDQojIyMgRnVuY3Rpb25zOiB0YWJ1bGF0ZSBhbmQgcGxvdCBhdXRob3JzIGNvbXBvc2l0aW9uIGJ5IHZhcnMgb2YgaW50ZXJlc3QuDQpgYGB7cn0NCnBsb3RfY29tcG9zaXRpb24gPC0gZnVuY3Rpb24oZGYsIHZhcjEsIHZhcjIpIHsgIA0KICANCiAgaWYgKGlzLmNoYXJhY3Rlcih2YXIxKSAmJiBpcy5jaGFyYWN0ZXIodmFyMikpIHsgDQogICAgdmFyMSA8LSBlbnN5bSh2YXIxKQ0KICAgIHZhcjIgPC0gZW5zeW0odmFyMikNCiAgfQ0KICANCiAgZGYgJT4lIA0KICAgIGdncGxvdChhZXMoeSA9IG4sIGF4aXMxID0gISF2YXIxLCBheGlzMiA9ICEhdmFyMikpICsNCiAgICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gISF2YXIyKSkgKw0KICAgIGdlb21fc3RyYXR1bSgpICsNCiAgICBnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsDQogICAgICAgICAgICAgIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpLA0KICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IE5BKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogICAgbGFicyh5ID0gIkNvdW50cnkgc2FsaWVuY2UiKSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MiwgbGFiZWxzID0gYygiQ291bnRyeSBzYWxpZW5jZSBcbiBieSByZWdpb24iLCAiQ29tcG9zaXRpb24gb2YgYXV0aG9ycyBcbiBieSByZWdpb24iKSkgKw0KICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLjgsIDIuMTMpKSANCiAgDQp9DQoNCmBgYA0KDQojIyMgQWxsdXZpYWwsIHN1YnJlZ2lvbnMuDQoNCmBgYHtyfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQpjb21wb3NpdGlvbl9zdWJyZWdpb25zICU+JSANCiAgcGxvdF9jb21wb3NpdGlvbigic3VicmVnaW9uX2dyIiwgInRlYW1fc3VicmVnaW9uIikgDQoNCmdnc2F2ZSgiLi4vb3V0cHV0X2ZpZ3VyZXMvZmlndXJlX1MzQl9zdWJyZWdpb25zX2FsbHV2aWFsLnBuZyIsIHdpZHRoID0gNywgaGVpZ2h0ID0gNywgZHBpID0gNTAwLCBsaW1pdHNpemUgPSBGLCBwbG90ID0gbGFzdF9wbG90KCkpDQpgYGANCiMjIyBDb250aW5lbnRzDQpgYGB7cn0NCiMgQ2hvb3NlIGEgcXVhbGl0YXRpdmUgcGFsZXR0ZSB3aXRoIHVwIHRvIDjigJMxMiBkaXN0aW5jdCBjb2xvcnMNCnRlYW1fY29udGluZW50X2NhdHMgPC0gYygiTm9ydGhlcm4gQW1lcmljYSIsICJFdXJvcGUiLCAiQXNpYSIsICJDb2xsYWJvcmF0aW9uIiwgIkFmcmljYSIsICJPY2VhbmlhIiwgIkxhdC5BbWVyaWNhICYgQ2FyLiIpDQoNCm5fY29sb3JzIDwtIGxlbmd0aCh0ZWFtX2NvbnRpbmVudF9jYXRzKQ0KY3VzdG9tX2NvbG9ycyA8LSBicmV3ZXIucGFsKG4gPSBuX2NvbG9ycywgbmFtZSA9ICJTZXQyIikNCg0KKGNvbnRpbmVudHNfYWxsdXZpYWwgPC0gY29tcG9zaXRpb25fY29udGluZW50ICU+JSANCiAgcGxvdF9jb21wb3NpdGlvbigiY29udGluZW50c19nciIsICJ0ZWFtX2NvbnRpbmVudCIpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiZmxvdyIsDQogICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlMChhcy5jaGFyYWN0ZXIocm91bmQocGVyY2VudCkpLCAnJScpKSwNCiAgICAgICAgICAgICAgbnVkZ2VfeCA9IC4yNSwNCiAgICAgICAgICAgIGNoZWNrX292ZXJsYXAgPSBULA0KICAgICAgICAgICAgc2l6ZSA9IDMpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpDQogIA0KZ2dzYXZlKCIuLi9vdXRwdXRfZmlndXJlcy9maWd1cmVfUzNBX2NvbnRpbmVudHNfYWxsdXZpYWwucG5nIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA3LCBkcGkgPSA1MDAsIGxpbWl0c2l6ZSA9IEYsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCg0KIyBDdW11bGF0aXZlIHBlcmNlbnRhZ2Ugb2YgdGhyZWUgbWFpbiBhdXRob3JzIGFmZmlsaWF0aW9uIG1lbnRpb25zLg0KY29tcG9zaXRpb25fY29udGluZW50ICU+JSBncm91cF9ieShjb250aW5lbnRzX2dyKSAlPiUgc3VtbWFyaXNlKGN1bXBlcmNlbnQgPSBzdW0ocGVyY2VudCkpDQpgYGANCiMjIyBBbGx1dmlhbDogSW5jb21lDQpgYGB7cn0NCihpbmNvbWVfYWxsdXZpYWwgPC0gY29tcG9zaXRpb25faW5jb21lICU+JSANCiAgcGxvdF9jb21wb3NpdGlvbigiaW5jb21lX0lTTzMiLCAidGVhbV9pbmNvbWUiKSArDQogIGdlb21fdGV4dChzdGF0ID0gImZsb3ciLA0KICAgICAgICAgICAgICBhZXMobGFiZWwgPSBwYXN0ZTAoYXMuY2hhcmFjdGVyKHJvdW5kKHBlcmNlbnQpKSwgJyUnKSksDQogICAgICAgICAgICAgIG51ZGdlX3ggPSAuMjUsDQogICAgICAgICAgICBjaGVja19vdmVybGFwID0gVCwNCiAgICAgICAgICAgIHNpemUgPSAzKSArDQogIGdlb21fbGFiZWwoYWVzKHggPSAyLCB5ID0gMTAwMDAsIGxhYmVsID0gIkxvdyBpbmNvbWUiKSwgc2l6ZSA9IDMsIGZpbGwgPSAid2hpdGUiLCBsYWJlbC5zaXplID0gTkEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MiwgbGFiZWxzID0gYygiQ291bnRyeSBzYWxpZW5jZSBcbiBieSBpbmNvbWUgZ3JvdXBzIiwgIkNvbXBvc2l0aW9uIG9mIGF1dGhvcnMgXG4gIGJ5IGluY29tZSBncm91cHMiKSkpIA0KDQpnZ3NhdmUoIi4uL291dHB1dF9maWd1cmVzL2ZpZ3VyZV80X2luY29tZV9hbGx1dmlhbC5wbmciLCB3aWR0aCA9IDcsIGhlaWdodCA9IDcsIGRwaSA9IDUwMCwgbGltaXRzaXplID0gRiwgcGxvdCA9IGxhc3RfcGxvdCgpKQ0KDQpgYGANCiMgUmV2aWV3ZXIncyByZXF1ZXN0LiBDb3VudHJ5IGFuYWx5c2lzLg0KDQojIyBCYXJzLiBTZWxlY3RlZCBjb3VudHJpZXMgYnkgY29udGluZW50IGNvbXBvc2l0aW9uLg0KYGBge3J9DQojIEJhc2VkIG9uIG1pZ3JhdGlvbiByZWxldmFuY2UuDQojIENJViByZW1vdmVkIHJlc2VhcmNoIHNhbGllbmNlIGlzIHZlcnkgbG93IGFuZCBwbG90IGlzIG5vdCB1c2VmdWwuDQplaV9jdHJ5IDwtIGFnZ3JlZ2F0ZXMgJT4lIGZpbHRlcihJU08zICE9ICJDSVYiKSAlPiUgZ3JvdXBfYnkoY29udGluZW50KSAlPiUgYXJyYW5nZSgtZW1pZ19pbW1pZykgJT4lIHNsaWNlKDE6MSkNCnNlbF9hbGx1dmlhbCA8LSBjKGVpX2N0cnkkSVNPMywgIlNZUiIsICJWRU4iLCAiQUZHIikNCnNlbF9hbGx1dmlhbF9taWcgPC0gYyhlaV9jdHJ5JElTTzMpDQpzZWxfYWxsdXZpYWxfY3Jpc2lzIDwtIGMoIlNZUiIsICJWRU4iLCAiQUZHIikNCg0KYmFyX2NvdW50cmllc190aW1lX21pZyA8LSBjb21wb3NpdGlvbl9jb250aW5lbnRzX2N0cnlfdGltZSAlPiUNCiAgICBmaWx0ZXIoSVNPMyAlaW4lIHNlbF9hbGx1dmlhbF9taWcpICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gcHVieWVhciwgeSA9IG4sIGdyb3VwID0gdGVhbV9jb250aW5lbnQsIGZpbGwgPSB0ZWFtX2NvbnRpbmVudCksIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogICAgZmFjZXRfd3JhcCh+IGNvdW50cnlfbm1fZmN0LCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAzKSArDQogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNikgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgIyBjdXN0b21fY29sb3JzIGRlZmluZWQgZm9yIHByZXZpb3VzIHBsb3Qgd2l0aCBjb250aW5lbnRzLg0KICAgIHRoZW1lKA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgICBsYWJzKHRpdGxlID0gIk1pZ3JhdGlvbiByZWxldmFuY2UiLA0KICAgICAgICAgZmlsbCA9ICJDb21wb3NpdGlvbiBvZiBhdXRob3JzIiwNCiAgICAgICAgIHkgPSAiUmVzZWFyY2ggc2FsaWVuY2UiLA0KICAgICAgICAgeCA9ICJQdWJsaWNhdGlvbiB5ZWFyIikNCg0KYmFyX2NvdW50cmllc190aW1lX2NyaSA8LSBjb21wb3NpdGlvbl9jb250aW5lbnRzX2N0cnlfdGltZSAlPiUNCiAgICBmaWx0ZXIoSVNPMyAlaW4lIHNlbF9hbGx1dmlhbF9jcmlzaXMpICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gcHVieWVhciwgeSA9IG4sIGdyb3VwID0gdGVhbV9jb250aW5lbnQsIGZpbGwgPSB0ZWFtX2NvbnRpbmVudCksIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogICAgZmFjZXRfd3JhcCh+IGNvdW50cnlfbm0sIHNjYWxlcyA9ICJmcmVlIikgKw0KICAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTYpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArDQogICAgdGhlbWUoDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICBsYWJzKHRpdGxlID0gIk1pZ3JhdGlvbiBjcmlzaXMiLA0KICAgICAgICAgZmlsbCA9ICJDb21wb3NpdGlvbiBvZiBhdXRob3JzIiwNCiAgICAgICAgIHkgPSAiUmVzZWFyY2ggc2FsaWVuY2UiLA0KICAgICAgICAgeCA9ICJQdWJsaWNhdGlvbiB5ZWFyIikNCg0KY29tYmluZWRfYmFyX2NvdW50cmllcyA8LSBiYXJfY291bnRyaWVzX3RpbWVfbWlnIC8gYmFyX2NvdW50cmllc190aW1lX2NyaQ0KDQpnZ3NhdmUoIi4uL291dHB1dF9maWd1cmVzL2ZpZ3VyZV81X2NvdW50cmllc190aW1lLnBuZyIsICB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMiwgZHBpID0gNjAwLCBwbG90ID0gbGFzdF9wbG90KCkpDQpgYGANCg0KDQojIyBBbGx1dmlhbC4gU2VsZWN0ZWQgY291bnRyaWVzLCBieSBjb250aW5lbnRzLg0KYGBge3J9DQpjb21wb3NpdGlvbl9jb250aW5lbnRzX2N0cnkgJT4lIA0KICBwbG90X2NvbXBvc2l0aW9uKCJjb3VudHJ5X25tIiwgInRlYW1fY29udGluZW50IikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjIsIGxhYmVscyA9IGMoIkNvdW50cnkgc2FsaWVuY2UgXG4gaW4gc2VsZWN0ZWQgY291bnRyaWVzIiwgIkNvbXBvc2l0aW9uIG9mIGF1dGhvcnMgXG4gIGJ5IHJlZ2lvbiIpKQ0KDQpnZ3NhdmUoIi4uL291dHB1dF9maWd1cmVzL2ZpZ3VyZV9TNF9jb3VudHJpZXNfY29udGluZW50c19hbGx1dmlhbC5wbmciLCB3aWR0aCA9IDcsIGhlaWdodCA9IDcsIGRwaSA9IDUwMCwgbGltaXRzaXplID0gRiwgcGxvdCA9IGxhc3RfcGxvdCgpKQ0KDQojIE1haW4gY29udGluZW50IHJlc2VhcmNoaW5nIGFib3V0IHRoZSBjb3VudHJ5DQpjb21wb3NpdGlvbl9tYXhfbGFiZWxzIDwtIGNvbXBvc2l0aW9uX2NvbnRpbmVudHNfY3RyeSAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeV9ubSkgJT4lDQogIHNsaWNlX21heChwZXJjZW50LCBuID0gMSwgd2l0aF90aWVzID0gRkFMU0UpICU+JQ0KICB1bmdyb3VwKCkNCg0KY29tcG9zaXRpb25fbWF4X2xhYmVscyANCmBgYA0KDQoNCg0KDQo=