日本地図を作成する際に,北海道や沖縄県の位置を変更して表現する場合がある.位置関係は不正確になるが,地図をコンパクトにまとめることができる.最後により少ない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による地理空間データの可視化