1 目的

国土数値情報のDID人口集中地区(ポリゴンデータ)を用いて国内の人口分布を可視化(コロプレスマップ).また,ポリゴンデータからポイントデータを導き,バブルマップを作成.

  • 国内の人口が集まっている地域,人口集中地区(DID:Densely inhabited districtの略),の位置(分布)と人口密度を示す.
  • 日本地図にDID人口集中地区を示してもポリゴンの大きさが相対的に小さいため,色分けに注意が必要.
  • コロプレスマップはポイントデータを色分けしたような地図になる.そこで,ポイントデータを目立たせるバブルマップを作成する.1この際,ポリゴンの重心を計算し,重心のポイントを導く.
  • 奄美群島,沖縄県は日本地図の左上(北西)方向に移動.この際,奄美群島,沖縄県の地図を作成し,ファイル形式PNGで保存し,日本地図に貼り付ける.

ライブラリ:sftidyversernaturalearthcowplot

library(sf)
library(tidyverse)

#日本地図利用のため
library(rnaturalearth)

#画像貼り付けのため
library(cowplot)

2 国内の人口集中地区と人口密度分布

シェープファイルのダウンロード

最初に,背景になる日本地図のシェープファイルをダウンロード.

  • 今回は,世界各国の無料のベクターデータを提供するNatural Earthを利用.
    • Natural Earthの利用方法の詳細はNatural Earthの地理空間データの可視化参照.
    • 世界地図(World_map)から日本地図(Japan_map)を切り抜き.読込のRコードがいつもと異なるため,注意.  
World_map<-
  ne_countries(scale="medium", returnclass="sf")

#日本の選抜 
World_map %>% 
  filter(brk_name=="Japan") ->
  Japan_map

次に,2015年の人口集中地区データをダウンロード.

  • 国土数値情報ダウンロードサービス > DID人口集中地区(ポリゴン) > 全国 > 世界測地系 平成27年

    • ダウンロードしたZIPファイルは同じフォルダ(ディレクトリ)に納め,ZIPファイルを選択 > 右クリック > すべて展開 > 展開先の選択とファイルの選択 > 展開を実行する.展開後は最初にダウンロードしたZIPファイルを削除.
    • read_sf:データ読込.DID_mapと名付ける.
    • crs="WGS84"crs(Coordinate ReferenceSystem,座標参照系)を1984年に定められた世界測地系(World Geodetic System)に投影を意味.日本地図(Japan_map)とcrsを揃える.
    • options="ENCODING=CP932":文字化けを防ぐため.
DID_map<-
  read_sf("A16-15_GML/A16-15_GML/A16-15_00_DID.shp",
          crs="WGS84", options="ENCODING=CP932")

以下の2つの人口集中地区を削除.

  • 所属未定地.
  • 東員町(三重県).人口に記載の誤りがあるため.2
#所属未定地のため削除
DID_map %>% 
  filter(A16_001!=1200001) ->
  DID_map 

#東員町の削除
DID_map %>% 
 filter(A16_001!=2432401) ->
 DID_map

人口集中地区の位置を可視化

日本地図に比べ人口集中地区のポリゴンが相対的に小さいことに注意.ポリゴンが点(ポイント)のように見える.

ggplot()+
  geom_sf(data=Japan_map, fill="white")+
  geom_sf(data=DID_map)+
  ggtitle("国内の人口集中地区")+
  theme_bw()

人口密度の計算

  • 人口集中地区内の人口(A16_005,単位:人)を面積(A16_006,単位:㎢)で割り,人口密度(pop_den)を計算.
DID_map %>% 
  mutate(pop_den=A16_005/A16_006) -> 
  DID_map

コロプレスマップによる人口密度分布の可視化

ポリゴンが相対的に小さいときに,ポリゴンの枠内を用いて色分けしても識別不能(枠の黒い線の方が目立つ).この場合,ポリゴンの枠も色を付けることが考える.

  • aes()の引数はfillだけでなくcolorも指示.
    • 枠線の太さ(size)を細くする.
  • scale_fill_viridis_c()scale_color_viridis_c()で枠内と枠の色を指示.ここでは同色に指示.
  • 地図の作成(色合い,背景,凡例の位置など)についてはBubble map with ggplot2(アクセス日:2022-08-21)を参考.
    • datum=NAにより緯線・経線を削除(透明に指示).
    • theme()を利用して,凡例を制御.位置(legend.position.inside)を(地図中に)移動.凡例の背景(legend.background)を透明に指示(枠,枠内をNA). 
ggplot()+
  geom_sf(data=Japan_map, fill="gray", 
          alpha=0.3, color="gray")+
  geom_sf(data=DID_map, 
          aes(fill=pop_den, color=pop_den),
          linewidth=0.01)+
  scale_fill_viridis_c(option="G", direction=-1)+
  scale_color_viridis_c(option="G", direction=-1)+
  labs(fill="人/㎢", color="人/㎢",
       x="", y="",
       caption="出典:Natural Earth,国土交通省国土数値情報")+
  ggtitle("コロプレスマップによる人口密度分布(2015年)")+
  coord_sf(datum=NA)+
  theme(legend.position.inside=c(0.85, 0.2),
        legend.background=element_rect(fill=NA, color=NA))

3 バブルマップ作成準備

重心の計算と緯度経度の抜き出し

ポリゴンが小さい場合,地図はまるでポイントデータを色分けしたように見える.そこで,ポイントデータの大小を目立たせる方法であるバブルマップを活用.

  • ポリゴンの重心(ポイント)を抜き出し,ポイント(バブル)の色,大きさ,透過度で人口密度の高さを表現.
    • DID_mapWGS84に投影していることに伴い,重心の計算の際 にエラーメッセージが出現し,先に進めなくなる.
    • st_make_valid failing to make geometries valid #1732(アクセス日:2022-08-21)に解決方法が掲載.
    • S2:球状のジオメトリが問題の模様.
      • warningが出るが,正しく重心は計算される.エラーを回避するには,DID_mapcrsオプションを外せば良い(この場合,crsはJGD2011)が,オプションを外すと,japan_mapとの併用の際に,別のエラー発生.
#球体無視,平面描写
sf_use_s2(FALSE)

#重心の計算
DID_map %>% 
  mutate(centroid=st_centroid(geometry),
         x=st_coordinates(centroid)[, 1],
         y=st_coordinates(centroid)[, 2]) ->
  DID_map

人口密度の順番変更

バブルが重なり合うため,人口密度が高いバブルが地図の上に表れるように順番を変更(arrange).

DID_map %>% 
  arrange(pop_den) ->
  DID_map

奄美群島と沖縄県を切り離した日本地図の作成

日本地図をコンパクトに示すために,ここでは奄美群島と沖縄県を切り離し,地図の右上(北西)方向に移して描写する.

  • 地図名はBase mapとする(Base_map <-).
  • coord_sf()を用いて,地図の範囲を東経128°から148°,北緯30°から45°に制限.
    • この作業に伴い,日本地図の右下(南東)方向に位置する小笠原諸島も削除されるが,小笠原諸島に人口集中地区は存在しないため,再び地図に示さないことにする.
  • バブルマップの作成(色合い,背景,凡例の位置など)についてはBubble map with ggplot2(アクセス日:2022-08-21)に依存.Base_mapと名付ける.
    • バブルマップを表現するポイントデータはgeom_point()aes()に示される.ここでは人口密度(pop_den)を色(color),大きさ(size)だけでなく,透過度(alpha)でも表現する.
    • scale_color_viridis_c()で色分け,scale_size_continuous()で描写する大きさの範囲,scale_alpha_continuous()で描写する透過度の範囲を指示.
      • 大きさは人口密度が高いほど,大きくなり,透過度は人口密度が高いほど,不透明になるように指示.
Base_map <-
  ggplot()+
  geom_sf(data=Japan_map, fill="gray", 
          alpha=0.3, color="gray")+
  geom_point(data=DID_map, 
             aes(x=x, y=y, color=pop_den,
                 size=pop_den, alpha=pop_den))+
  scale_color_viridis_c(option="G", direction=-1, 
                        guide="legend")+
  scale_size_continuous(range=c(-1, 4))+
  scale_alpha_continuous(range=c(0.1, 0.8))+
  labs(color="人/㎢", size="人/㎢", alpha="人/㎢",
       x="", y="",
       caption="出典:Natural Earth,国土交通省国土数値情報")+
  ggtitle("人口集中地区の人口密度分布(2015年)")+
  coord_sf(xlim=c(128, 148), ylim=c(30, 45), datum=NA)+
  theme(legend.position.inside=c(0.85, 0.2),
        legend.background=element_rect(fill=NA, color=NA))

#Base_mapのプロット
Base_map

区切り線

あらかじめ,奄美群島・沖縄県の区切り線を作成しておく.

  • 位置を区切る線を引く(annotate()).
    • 線の出発点(座標)と終点を示し,線の色(color)や太さ(size)を指定.
    • 地図名は-> Base_mapのまま.
Base_map + 
  annotate("segment", x=128.5, xend=132.2, 
           y=38.5, yend=38.5,
           color="gray", linewidth=1)+
  annotate("segment", x=132.2, xend=136.7,
           y=38.5, yend=43.2,
           color="gray", linewidth=1) ->
  Base_map

奄美群島と沖縄県の地図の作成

  • 地図名はAmami_Okinawa_mapとする.
  • coord_sf()を用いて,地図の範囲を東経123.5°から129.5°,北緯23.5°から28.5°に制限.
    • 後ほど縮小して,base_mapに表現するため,奄美群島と沖縄県のポリゴンの枠線(geom_sf()size)が細くならように変更.
      • legend.position="none":凡例削除.
Amami_Okinawa_map <-
  ggplot()+
  geom_sf(data=Japan_map, fill="gray", alpha=0.3, 
          color="gray", linewidth=0.8)+
  geom_point(data=DID_map, 
             aes(x=x, y=y, color=pop_den,
                 size=pop_den, alpha=pop_den))+
  scale_color_viridis_c(option="G", direction=-1, 
                        guide="legend")+
  scale_size_continuous(range=c(-1, 4))+
  scale_alpha_continuous(range=c(0.1, 0.8))+
  labs(color="人/㎢", size="人/㎢", alpha="人/㎢",
       x="", y="")+
  coord_sf(xlim= c(123.5, 129.5), ylim=c(23.5, 28.5),
           datum=NA)+
  theme(legend.position="none")

背景の無色化

ここでは,Amami_Okinawa_mapの背景を無色にして,Base_map上に表現したい.

  • theme():図の体裁を変更する際に利用.
    • fill="transparent":背景の枠内透明.
    • color=NA:背景の枠を削除.
    • 主グリッド(grid.major)と補助グリッド(grind.minor)のの線(line)の色を削除(color=NA).
    • 上記Rコードで枠内は透明になるが,余白を含む背景は白いまま.すなわち白い背景(①)に,透明な背景(②)の地図を作成していることになる.
    • ①も無色にするため,plot.backgroundで無色にするように指示.
    • 背景の無色化に関するRコードは,ggplot2で透明な背景にする方法(アクセス日:2022-08-21)を参考にした.
Amami_Okinawa_map + 
  theme(
  panel.background=element_rect(fill="transparent", color=NA),
  panel.grid.major=element_line(color=NA),
  panel.grid.minor=element_line(color=NA), 
  plot.background=element_rect(fill="transparent", color=NA)
  ) -> 
  Amami_Okinawa_map

奄美群島・沖縄県可視化

#Amami_Okinawa_mapのプロット
Amami_Okinawa_map + 
  ggtitle("奄美群島,沖縄県の人口集中地区の人口密度分布") 

地図の保存

PNGで保存.

  • 拡張子を.pngにすることでPNGで保存される.
    • 地図は,特に指定がなければ,同じフォルダに保存される.
    • 背景(bg)が無色(transparent)であることを認識させる.
ggsave("Amami_Okinawa_map.png", 
       Amami_Okinawa_map, bg="transparent")

4 バブルマップによる人口密度分布の可視化

完成図形

Base_map上に地図画像Amami_Okinawa_map.pngを貼り付ける.

  • set_null_device("png"):問題を引き起こさせないため.
  • ggdraw():下地になる図の指示.
    • draw_image():貼り付ける図の指示.
      • 倍率scale,貼り付け位置(水平方向(halign),垂直方向(valign))の指定.
set_null_device("png")

#完成図形       
ggdraw(Base_map)+
  draw_image("Amami_Okinawa_map.png", 
             scale=0.3,
             halign=0.15, valign=0.8)

参考ウェブサイト

参考文献

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


  1. 国内の都市人口をバブルマップで表現する方法はBrakman et al.(2019)のテキスト18頁,図1.6参照.↩︎

  2. 誤:122,113人,正:12,213人.三重の統計情報:みえDATABOX,平成27年国勢調査結果の概要(アクセス日:2022-08-21)で確認.↩︎