1 目的

日本地図を作成する際に,北海道や沖縄県の位置を変更して表現する場合がある.位置関係は不正確になるが,地図をコンパクトにまとめることができる.一番下にRコードの圧倒的に少ない方法を示す.

  • ここでは,NipponMapの沖縄県(ジオメトリはポリゴン)の位置を移動して表現.次に,沖縄県の位置の移動に加えて北海道の位置も移動.
    • 注意:ただし,注意しなければならないのは,移動はコピー&ペーストによる移動ではなく,ジオメトリ(ここではポリゴン)の緯度経度の変更による移動のため,沖縄県の形状が変化
  • 最後にRコードのより少ない(簡易な)方法も示す.

ライブラリ:sftidyverseNipponmap

library(sf)
library(tidyverse)
library(NipponMap)

2 geometry(ポリゴンの座標)の変更

シェープファイル

作業フォルダにjpn.shpなどが含まれるshapesと示されるフォルダがあることを前提とする.

  • Nippon_mapと名付け,read_sf()でデータを読込.
    • シェープファイルを作業フォルダに移すのが面倒だと思う場合は,Nippon_map<-以降のコマンドをread_sf(system.file("shapes/jpn.shp"), package="NipponMap")にしても可能.この場合,移す作業は必要ない.
    • crs="WGS84"を今回は指定.
Nippon_map<-
  read_sf("shapes/jpn.shp", crs="WGS84")

移動前の日本地図

日本地図を描写.白地図ではなく,都道府県に色を付ける.

  • 統計値を色分けするわけではなく,都道府県名で色分けするため,aes(fill=name)を指定.色分けはviridis(mako(G)色)を指定.
    • 色に対応して凡例が47都道府県分出現して,煩雑になるため,theme(legend.position="none")を用いて凡例削除.
ggplot()+ 
  geom_sf(data=Nippon_map, aes(fill=name))+
  scale_fill_viridis_d(option="G")+
  ggtitle("日本地図")+
  theme_bw()+
  theme(legend.position="none")

ジオメトリの確認

tail()を用いて下から6行のデータの中身を確認.

  • 最終行の6列目が沖縄県のジオメトリ(形状,geometry).
#下から6行のデータの中身
Nippon_map %>%
  tail()
SP_ID jiscode name population region geometry
42 42 Nagasaki 1426779 Kyushu / Okinawa POLYGON ((130.1848 32.96691…
43 43 Kumamoto 1817426 Kyushu / Okinawa POLYGON ((130.416 33.00455,…
44 44 Oita 1196529 Kyushu / Okinawa POLYGON ((131.5693 32.75108…
45 45 Miyazaki 1135233 Kyushu / Okinawa POLYGON ((131.5693 32.75108…
46 46 Kagoshima 1706242 Kyushu / Okinawa POLYGON ((130.7114 32.05825…
47 47 Okinawa 1392818 Kyushu / Okinawa POLYGON ((127.6461 26.1758,…

沖縄県の形状はポリゴン.

  • 緯度と経度から成る点(ポイント)を結び,ポリゴンが作られる.
    • 例えば,3点から成る三角形の場合は次のように表現される.
    • 緯度1 経度1の座標から出発し,緯度2 経度2緯度3 経度3の座標を通り,緯度1 経度1の座標に戻る.
POLYGON((緯度1 経度1,緯度2 経度2,緯度3 経度3,緯度1 経度1))

沖縄県の選抜と位置の移動

沖縄県の位置だけを移動すれば良いため,日本地図から沖縄県のみを抜き出し,沖縄県の位置を移動した地図を作成する.

  • Nippon_mapからfilter()を用いて,沖縄県(name=="Okinawa")を選抜.Okinawa_mapと名付ける.
  • geometry(POLYGON((...))の経度,緯度に数値を加えることにより,沖縄県のポリゴンの位置を移動させる.
    • ここでは,ポリゴンを構成する座標を東経方向に4.8°E,北緯方向に14.5°N移動.
    • 地図名はOkinawa_map1とする.
    • geometry(POLYGON((...))の変更についてはシェープファイルを読む(アクセス日:2022-08-17)を参照した.
#沖縄県の選抜
Nippon_map %>% 
  filter(name=="Okinawa") ->
  Okinawa_map

#沖縄県の位置の移動
Okinawa_map %>% 
  mutate(geometry=geometry+c(4.8, 14.5)) ->
  Okinawa_map1

表と地図による移動確認

表でgeometryが変更されているか確認.

  • 移動後のOkinawa_map1crs(座標参照系)が付されていない.
    • ここでは,crsNippon_mapと揃えるため,EPSG:4326:WGS84を選択(st_crs(データ名)=EPSG系番号).
#表の確認
Okinawa_map1 %>% 
  head()
SP_ID jiscode name population region geometry
47 47 Okinawa 1392818 Kyushu / Okinawa POLYGON ((132.4461 40.6758,…
#crs
st_crs(Okinawa_map1)=4326

移動前と移動後の地図(Rコードは示さない)を比較.

  • 注意:異なる緯度経度に移動したことによって,ポリゴン(この場合,沖縄県)の形状が変化(見た目をまったく変化させないためには,移動前のポリゴンをコピー&ペーストする方法が考えられる).

データの結合

位置前の沖縄県と位置後の沖縄県を入れ替える.

  • 移動前の沖縄県を除いたNippon_mapに移動後の沖縄県を加える.
    • filter(name!="Okinawa")で沖縄県を除いた日本地図を作成.地図名はNippon_map1に変更.
    • rbind()Nippon_mapOkinawa_map1を縦方向に結合.地図名はNippon_map2
#移動前の沖縄県を除く日本地図
Nippon_map %>% 
  filter(name!="Okinawa") ->
  Nippon_map1

#移動後の沖縄県を加えた日本地図
Nippon_map2<-
  rbind(Nippon_map1, Okinawa_map1)

完成地図

沖縄県の位置が移動した地図の可視化.

  • 位置を区切る線を引く(annotate()).
    • 線の出発点(座標)と終点を示し,線の色(color)や太さ(size)を指定.
    • labs(x="", y="")を指示しない場合,横軸にx,縦軸にyが表現される(任意).
ggplot()+ 
  geom_sf(data=Nippon_map2, aes(fill=name))+
  scale_fill_viridis_d(option="G")+
  annotate("segment", x=131, xend=133.5, 
           y=39.8, yend=39.8,
           color="gray", size=1)+
  annotate("segment", x=133.5, xend=134.8,
           y=39.8, yend=41.5,
           color="gray", size=1)+
  labs(x="", y="",
       caption="出典:NipponMap")+
  ggtitle("日本地図")+
  theme_bw()+
  theme(legend.position="none")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

3 応用

3.1 人口分布の可視化

作成したNippon_map1に人口分布を可視化.

#閾値
my_breaks<-c(100, 200, 500, 1000)

#可視化  
ggplot()+ 
  geom_sf(data=Nippon_map2, aes(fill=population/10000))+
  scale_fill_viridis_c(option="G",
                       direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  annotate("segment", x=131, xend=133.5,
           y=39.8, yend=39.8,
           color="gray", size=1)+
  annotate("segment", x=133.5, xend=134.8,
           y=39.8, yend=41.5,
           color="gray", size=1)+
  labs(fill="万人", x="", y="",
       caption="出典:NipponMap")+
  ggtitle("都道府県別人口")+
  theme_bw()

3.2 北海道と沖縄県を移動した日本地図

位置移動のためのコード

#沖縄県の位置の移動
Okinawa_map %>% 
  mutate(geometry=geometry+c(12, 5)) ->
  Okinawa_map2

#北海道の選抜
Nippon_map %>% 
  filter(name=="Hokkaido") ->
  Hokkaido_map

#北海道の位置の移動
Hokkaido_map %>% 
  mutate(geometry=geometry+c(-11, -4)) ->
  Hokkaido_map

#北海道と沖縄県を除いた日本地図
Nippon_map1 %>% 
  filter(name!="Hokkaido") ->
  Nippon_map3

#crs
st_crs(Okinawa_map2)=4326
st_crs(Hokkaido_map)=4326

#データの結合
Nippon_map3 <-
  rbind(Hokkaido_map, Nippon_map3) %>% 
  rbind(Nippon_map3, Okinawa_map2)

完成地図

作成したNippon_map3に人口分布を可視化.

ggplot()+ 
  geom_sf(data=Nippon_map3, aes(fill=population/10000))+
  scale_fill_viridis_c(option="G",
                       direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  annotate("segment", x=129, xend=134.2, y=37, yend=37,
            color="gray", size=1)+
  annotate("segment", x=134.2, xend=138.5, y=37, yend=41,
           color="gray", size=1)+
  annotate("segment", x=139.8, xend=141, y=32.2, yend=32.2,
            color="gray", size=1)+
  annotate("segment", x=138.5, xend=139.8, y=31, yend=32.2,
           color="gray", size=1)+
  labs(fill="万人", x="", y="",
       caption="出典:NipponMap")+
  ggtitle("都道府県別人口")+
  theme_bw()

4 簡易な方法

ジオメトリの直接変更

これまで,移動前の北海道・沖縄県の地図を切り抜き,移動後の地図を合併するという手順を踏んだ.最後に当初のNippon_mapの北海道・沖縄県のジオメトリを直接変更する,Rコードのより少ない方法を紹介する.

  • Nippon_map$geometry[#]Nippon_mapgeometry列の#行を意味する.$[]を忘れずに.
    • 北海道が1行目,沖縄県が47行目.
    • geometry(POLYGON((...))の変更についてシェープファイルを読む(アクセス日:2022-08-17)をより忠実に再現.
#ジオメトリの直接変更
Nippon_map$geometry[1]=Nippon_map$geometry[1]+c(-11, -4) 
Nippon_map$geometry[47]=Nippon_map$geometry[47]+c(12, 5) 

完成地図

地図はNippon_mapのまま(data=Nippon_map).

  • Rコードが圧倒的に少なくて済む.
    • 上と同じ地図が完成(色をあえて変更,デフォルトのviridis).
ggplot()+ 
  geom_sf(data=Nippon_map, aes(fill=population/10000))+
  scale_fill_viridis_c(direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  annotate("segment", x=129, xend=134.2, y=37, yend=37,
            color="gray", size=1)+
  annotate("segment", x=134.2, xend=138.5, y=37, yend=41,
           color="gray", size=1)+
  annotate("segment", x=139.8, xend=141, y=32.2, yend=32.2,
            color="gray", size=1)+
  annotate("segment", x=138.5, xend=139.8, y=31, yend=32.2,
           color="gray", size=1)+
  labs(fill="万人", x="", y="",
       caption="NipponMap")+
  ggtitle("都道府県別人口")+
  theme_bw()

参考ウェブサイト

Rによる地理空間データの可視化