動機
太平洋に関するデータをプロットする機会があったのですが、Rを用いてggplotで普通にプロットをすると常にグリニッジ中心の地図がプロットされてしまいます。東経(西経)180度をまたがない地図なら普通にプロットできるのですが、跨いだ途端に扱いが厄介になるので困っていました。
ちなみにPythonとMatplotlibでは、
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
projection = ccrs.PlateCarree(central_longitude = 180)
ax = plt.axes(projection = projection)
ax.set_extent((-100, 100, 0, 70))
のようにかけます。
準備
以下のパッケージをロードします。
pacman::p_load(tidyverse,
sf,
maps,
rnaturalearth,
ocedata)
方法1
こちらの記事で紹介されていた方法です。データフレームの形で保存された緯度経度のうち、西経0〜180度(0から-180度)のものに360度を足し、東経0〜360度に変換することで、太平洋中心の地図を描くものです。
world <- map_data("world") %>%
dplyr::mutate(long = dplyr::case_when(
long > 180 ~ 360 - long,
TRUE ~ long
))
world_new <- world %>%
dplyr::mutate(long = dplyr::case_when(
long > 0 ~ long,
long < 0 ~ long + 360
))
pacific_map <- world_new %>%
ggplot() +
coord_quickmap(xlim = c(100, 260), ylim = c(0, 70)) +
geom_polygon(aes(x = long, y = lat, group = group),
fill = "lightgrey", color = "black")
これだけだと図の横軸が100度から260度で表示されてしまうので、0度から180度、-180度から-100度へと横軸を変えてやります。
lon_map <- seq(100, 260, by = 20)
lon_east <- seq(100, 180, by = 20)
lon_west <- seq(-160, -100, by = 20)
new_lon_label <- as.character(append(lon_east, lon_west))
new_lon_label[5] <- "180/-180"
pacific_map <- pacific_map +
scale_x_continuous(breaks = lon_map,
labels = new_lon_label)
方法2
Rで地理情報を扱う際はsf
パッケージを用いることも多いので、sf
オブジェクトを使ってそのまま太平洋中心の地図が書けないか探していたところ、st_break_antimeridian()
関数を使ってやることで描けるようです。
world_sf <- rnaturalearth::ne_countries(scale = "small",
returnclass = "sf")
crs = "+proj=longlat +lon_0=-180 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +no_defs"
pacific_map_fron_sf <- world_sf %>%
sf::st_break_antimeridian(lon_0 = 180) %>%
sf::st_transform(crs = crs) %>%
ggplot() +
geom_sf() +
coord_sf(xlim = c(-100, 100), ylim = c(0, 70))
座標参照系を指定するproj4stringが少々厄介ですが、これで以下のような太平洋中心の地図が描けます。デフォルトのままでもx軸の表示をよしなにしてくれるところが嬉しいですね。