ggplotで東経（西経）180度が中心の地図を描きたい

## 動機
太平洋に関するデータをプロットする機会があったのですが、Rを用いてggplotで普通にプロットをすると常にグリニッジ中心の地図がプロットされてしまいます。東経（西経）180度をまたがない地図なら普通にプロットできるのですが、跨いだ途端に扱いが厄介になるので困っていました。
ちなみにPythonとMatplotlibでは、

```python
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))
```

のようにかけます。

## 準備
以下のパッケージをロードします。

```r
pacman::p_load(tidyverse, 
               sf,
               maps, 
               rnaturalearth,
               ocedata)
```

## 方法1
[こちらの記事](https://qiita.com/Yohei__K/items/9122f0b3e3756a7b81cc)で紹介されていた方法です。データフレームの形で保存された緯度経度のうち、西経0〜180度（0から-180度）のものに360度を足し、東経0〜360度に変換することで、太平洋中心の地図を描くものです。

```r
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度へと横軸を変えてやります。

```r
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)
```

これで以下のような太平洋中心の地図ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/bf90fc5d-d34d-b602-d0c4-ff06db87974a.png)

## 方法2
Rで地理情報を扱う際は`sf`パッケージを用いることも多いので、`sf`オブジェクトを使ってそのまま太平洋中心の地図が書けないか探していたところ、`st_break_antimeridian()`関数を使ってやることで描けるようです。

```r
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軸の表示をよしなにしてくれるところが嬉しいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/6909382c-8cdd-43e7-5549-8cec98b3501f.png)

## 追記（2025年3月23日）
方法2でも良かったのですが、`st_shift_longitude()`関数というものの存在を最近知り、こちらの方がシンプルな解決策のようです。
```r
land <- ne_download(scale = 10, type = "land", category = "physical") %>% 
  st_break_antimeridian(lon_0 = 180)

pacific_map_fron_sf <- land %>% 
  sf::st_shift_longitude() %>% 
  ggplot() +
  geom_sf() +
  coord_sf(xlim = c(100, 260), ylim = c(0, 70))

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/e8827885-ad04-4dab-9010-1b3c7e0a35d6.png)


### 参考文献
- https://qiita.com/Yohei__K/items/9122f0b3e3756a7b81cc
- https://r-spatial.github.io/sf/reference/st_break_antimeridian.html?q=st_brea#null
- https://stackoverflow.com/questions/76589595/recenter-projections-over-pacific-with-sf-package