フランスの研究機関CEPIIが作成している、Gravityという無料のデータベースから、2国間の貿易額など必要最小限のデータを抜き出した。2019年の1年間の世界の2国間の貿易額(tradeflow_baci)が収録されている。
Gravityデータベースは定期的に更新されている。本ページで用いるデータは、「Gravity_dta_V202211」版であり、2024年3月に入手した。主な変数は以下の通りである。
library(readr)
gravity_basic2019 <- read_csv("gravity_basic2019.csv")
gravity_basic2019 <- subset(gravity_basic2019, gravity_basic2019$iso3_o == "JPN")
オンラインでデータ読み込む場合は、以下のコード。
gravity_basic2019 <- read_csv("https://ayumu-tanaka.github.io/teaching/gravity_basic2019.csv")
ggplot2のfortify()関数は、地図オブジェクトを、ggplot2で描画できるようにデータ・フレームに変換する関数である。以下のページに簡単な解説がある。fortify()関数は、変数として、国の輪郭の緯度経度(long,
lat)のほかに、groupとして国名を生成する。# 世界地図
library(rworldmap)
worldMap <- getMap()
# ggplot2で地図を描画したり、データ処理を行うため。
library(tidyverse)
mapworld_df <- fortify(worldMap)
head(mapworld_df)
## long lat order hole piece id group
## 1 61.21082 35.65007 1 FALSE 1 Afghanistan Afghanistan.1
## 2 62.23065 35.27066 2 FALSE 1 Afghanistan Afghanistan.1
## 3 62.98466 35.40404 3 FALSE 1 Afghanistan Afghanistan.1
## 4 63.19354 35.85717 4 FALSE 1 Afghanistan Afghanistan.1
## 5 63.98290 36.00796 5 FALSE 1 Afghanistan Afghanistan.1
## 6 64.54648 36.31207 6 FALSE 1 Afghanistan Afghanistan.1
# 世界地図
library(rworldmap)
worldMap <- getMap()
# データ処理のため。
library(tidyverse)
# 空間データを数値データに変換
worldMap_data <- as.data.frame(worldMap)
# 緯度経度のデータ作成
Long_Lat <- worldMap_data[, c(17, 30, 31, 32)]
# エクセルに出力
library(openxlsx)
write.xlsx(Long_Lat, file = "Long_Lat.xlsx")
gravity_map1 <- left_join(gravity_basic2019, Long_Lat,
by = c("iso3_o" = "ISO3"))
gravity_map2 <- left_join(gravity_map1, Long_Lat,
by = c("iso3_d" = "ISO3"),
suffix = c("", "_d"))
rank()関数は、昇順のため、そのままでは、第1位は貿易額が少ない国になってしまう。# 貿易額順のランク
gravity_map2$rank <- rank(1/gravity_map2$tradeflow_baci, na.last = TRUE)
# 上位国
gravity_map2_top <- subset(gravity_map2, gravity_map2$rank<=5)
# 並び替え
gravity_map2_top <- gravity_map2_top[order(gravity_map2_top$rank), ]
# データ確認
head(gravity_map2_top)
## # A tibble: 5 × 12
## year iso3_o iso3_d tradeflow_baci pair NAME LON LAT NAME_d LON_d LAT_d
## <dbl> <chr> <chr> <dbl> <dbl> <fct> <dbl> <dbl> <fct> <dbl> <dbl>
## 1 2019 JPN USA 132881829. 14747 Japan 137. 36.0 United… -99.1 39.5
## 2 2019 JPN CHN 128358138. 14582 Japan 137. 36.0 China 104. 36.6
## 3 2019 JPN KOR 44631166. 14650 Japan 137. 36.0 S. Kor… 128. 36.4
## 4 2019 JPN TWN 41610938. 14742 Japan 137. 36.0 Taiwan 121. 23.7
## 5 2019 JPN THA 28485440. 14732 Japan 137. 36.0 Thaila… 101. 15.0
## # ℹ 1 more variable: rank <dbl>
barplot(gravity_map2_top$tradeflow_baci, names.arg = gravity_map2_top$iso3_d)
scale_colour_distillerで使える色:Blues, BuGn, BuPu,
GnBu, Greens, Greys, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu,
Reds, YlGn, YlGnBu, YlOrBr, YlOrRd
direction = 1で色が濃いいほど、貿易額が増えるように設定。
貿易フローの形を直線にしたい場合は、geom_curve()の代わりにgeom_segment()を使う。
南極などを除くために、coord_sf(xlim = c(-150, 150), ylim = c(90, -60), expand = TRUE)と設定。
貿易フロー(1000 USD)のままでは、値が大きすぎるので、10000000で割っている。貿易額の単位は、100億ドル。
color = tradeflow_baci/10000000
で、貿易額でフローの曲線の色を変えている。
linewidth = tradeflow_baci/10000000で、貿易額でフローの曲線の幅を変えている。
geom_curveでshow.legend = FALSEとすると、凡例を非表示にできる。
国名ラベルと矢印が重ならないように、緯度経度をたし引き補正している。
# 地図作成
ggplot() +
geom_polygon(data = mapworld_df,
aes(long, lat, group = group),
fill = "white", colour = "grey50") +
geom_curve(data = gravity_map2_top,
aes(x = LON, y = LAT,
xend = LON_d + 10, yend = LAT_d + 10,
color = tradeflow_baci/10000000,
linewidth = tradeflow_baci/10000000),
#show.legend = FALSE,
arrow = arrow(length = unit(0.01, "inches"))) +
scale_colour_distiller(palette = "YlGnBu", direction = 1,
name="貿易額(100億ドル)", guide = "colorbar") +
scale_linewidth(name = "貿易額(100億ドル)", guide = "legend") +
geom_text(data = gravity_map2_top,
label = gravity_map2_top$iso3_d,
aes(x = LON_d - 5, y = LAT_d - 5), hjust=0, vjust=0,
fontface='bold', size=3, check_overlap = FALSE) +
coord_sf(xlim = c(-150, 150), ylim = c(100, -60), expand = TRUE)
# 保存
ggsave("trade_flow_ggplot2_baci.png", width = 8, height = 4, dpi = "print")