日本地図を作成する際に,北海道や沖縄県の位置を変更して表現する場合がある.位置関係は不正確になるが,地図をコンパクトにまとめることができる.最後により少ないR
コードによる可視化を示す.
NipponMap
の沖縄県(ジオメトリはポリゴン)の位置を移動して表現.次に,沖縄県の位置の移動に加えて北海道の位置も移動.
パッケージ:sf
,tidyverse
,Nipponmap
geometry
(ポリゴンの座標)の変更シェープファイル
作業フォルダにjpn.shp
などが含まれるshapes
と示されるフォルダがあることを前提とする.
Nippon_map
と名付け,read_sf()
でデータを読込.
Nippon_map<-
以降のコマンドをread_sf(system.file("shapes/jpn.shp"), package="NipponMap")
にしても可能.この場合,移す作業は必要ない.crs="WGS84"
を今回は指定.移動前の日本地図
日本地図を描写.白地図ではなく,都道府県に色を付ける.
aes(fill=name)
を指定.色分けはviridis
(mako(G
)色)を指定.
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行のデータの中身を確認.
geometry
).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… |
沖縄県の形状は(マルチ)ポリゴン.
緯度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((...))
の経度,緯度に数値を加えることにより,沖縄県のポリゴンの位置を移動させる.
Okinawa_map1
とする.#沖縄県の選抜
Nippon_map %>%
filter(name=="Okinawa") ->
Okinawa_map
#沖縄県の位置の移動
Okinawa_map %>%
mutate(geometry=geometry+c(4.8, 14.5)) ->
Okinawa_map1
表と地図による移動確認
表でgeometry
が変更されているか確認.
Okinawa_map1
はcrs
(座標参照系)が付されていない.
crs
をNippon_map
と揃えるため,EPSG:4326:WGS84を選択(st_crs(データ名)=EPSG系番号
).SP_ID | jiscode | name | population | region | geometry |
---|---|---|---|---|---|
47 | 47 | Okinawa | 1392818 | Kyushu / Okinawa | MULTIPOLYGON (((132.4461 40… |
移動前と移動後の地図(Rコードは示さない)を比較.
データの結合
位置前の沖縄県と位置後の沖縄県を入れ替える.
Nippon_map
に移動後の沖縄県を加える.
filter(name!="Okinawa")
で沖縄県を除いた日本地図を作成.地図名はNippon_map1
に変更.rbind()
でNippon_map
とOkinawa_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")
作成した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()
位置移動のためのコード
#沖縄県の位置の移動
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()
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による地理空間データの可視化