0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

動機

太平洋に関するデータをプロットする機会があったのですが、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)

これで以下のような太平洋中心の地図ができます。
image.png

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

image.png

参考文献

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?