1 目的

日本地図を作成する際に,北海道や沖縄県の位置を変更して表現する場合がある.位置関係は不正確になるが,地図をコンパクトにまとめることができる.最後により少ないRコードによる可視化を示す.

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

パッケージ: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 MULTIPOLYGON (((130.1848 32…
43 43 Kumamoto 1817426 Kyushu / Okinawa MULTIPOLYGON (((130.416 33….
44 44 Oita 1196529 Kyushu / Okinawa MULTIPOLYGON (((131.5693 32…
45 45 Miyazaki 1135233 Kyushu / Okinawa MULTIPOLYGON (((131.5693 32…
46 46 Kagoshima 1706242 Kyushu / Okinawa MULTIPOLYGON (((130.7114 32…
47 47 Okinawa 1392818 Kyushu / Okinawa MULTIPOLYGON (((127.6461 26…

沖縄県の形状は(マルチ)ポリゴン.

  • 緯度と経度から成る点(ポイント)を結び,ポリゴンが作られる.
    • 例えば,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とする.
#沖縄県の選抜
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 MULTIPOLYGON (((132.4461 40…
#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)や太さ(linewidth)を指定.
    • 沖縄の位置が変更したため,誤解を与えないようにtheme_void()を選択し,緯度経度の表記を削除.
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", linewidth=1)+
  annotate("segment", x=133.5, xend=134.8,
           y=39.8, yend=41.5,
           color="gray", linewidth=1)+
  labs(caption="出典:NipponMap")+
  ggtitle("日本地図")+
  theme_void()+
  theme(legend.position="none")

3 応用

3.1 人口分布の可視化

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

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

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

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,
              color=population/10000))+
  scale_fill_viridis_c(option="G",
                       direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  scale_color_viridis_c(option="G",
                       direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  annotate("segment", x=129, xend=134.2, y=37, yend=37,
            color="gray", linewidth=1)+
  annotate("segment", x=134.2, xend=138.5, y=37, yend=41,
           color="gray", linewidth=1)+
  annotate("segment", x=139.8, xend=141, y=32.2, yend=32.2,
            color="gray", linewidth=1)+
  annotate("segment", x=138.5, xend=139.8, y=31, yend=32.2,
           color="gray", linewidth=1)+
  labs(fill="万人", color="万人",
       caption="出典:NipponMap")+
  ggtitle("都道府県別人口")+
  theme_void()

4 replace()の利用

ジオメトリの直接変更

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

  • replace()を用いて変更.
    • replace():第1引数に列名(変数名),第2引数に置き換える位置や条件,第3引数に置き換える値を示す.
#replaceの使い方

replace(列名, 置き換える位置, 置き換える値)
  • []:要素の抽出に使う.geometry[]geometry列にある要素を抽出.[]内にSP_ID==47なので,都道府県識別番号(SP_ID)が沖縄県(47)を満たすgeometry列の要素を抽出している.
#ジオメトリの変更
Nippon_map <- Nippon_map %>%
  mutate(geometry=replace(
    geometry, SP_ID==1, geometry[SP_ID==1]+c(-11, -4))) %>%
  mutate(geometry=replace(
    geometry, SP_ID==47, geometry[SP_ID==47]+c(12, 5))) 

完成地図

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

  • 少ないRコードで上と同じ地図が完成(色をあえて変更).
ggplot()+ 
  geom_sf(data=Nippon_map, 
          aes(fill=population/10000,
              color=population/10000))+
  scale_fill_viridis_c(direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  scale_color_viridis_c(direction=-1,
                       trans="log10",
                       breaks=my_breaks)+
  annotate("segment", x=129, xend=134.2, y=37, yend=37,
            color="gray", linewidth=1)+
  annotate("segment", x=134.2, xend=138.5, y=37, yend=41,
           color="gray", linewidth=1)+
  annotate("segment", x=139.8, xend=141, y=32.2, yend=32.2,
            color="gray", linewidth=1)+
  annotate("segment", x=138.5, xend=139.8, y=31, yend=32.2,
           color="gray", linewidth=1)+
  labs(fill="万人", color="万人",
       caption="NipponMap")+
  ggtitle("都道府県別人口")+
  theme_void()

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