日本地図を作成する際に,北海道や沖縄県の位置を変更して表現する場合がある.位置関係は不正確になるが,地図をコンパクトにまとめることができる.一番下にRコードの圧倒的に少ない方法を示す.
NipponMap
の沖縄県(ジオメトリはポリゴン)の位置を移動して表現.次に,沖縄県の位置の移動に加えて北海道の位置も移動.
ライブラリ:sf
,tidyverse
,Nipponmap
シェープファイル
作業フォルダに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 | 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,… |
沖縄県の形状はポリゴン.
緯度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
とする.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_map1
はcrs
(座標参照系)が付されていない.
crs
をNippon_map
と揃えるため,EPSG:4326:WGS84を選択(st_crs(データ名)=EPSG系番号
).SP_ID | jiscode | name | population | region | geometry |
---|---|---|---|---|---|
47 | 47 | Okinawa | 1392818 | Kyushu / Okinawa | POLYGON ((132.4461 40.6758,… |
移動前と移動後の地図(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
)や太さ(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.
作成した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()
位置移動のためのコード
#沖縄県の位置の移動
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()
ジオメトリの直接変更
これまで,移動前の北海道・沖縄県の地図を切り抜き,移動後の地図を合併するという手順を踏んだ.最後に当初のNippon_map
の北海道・沖縄県のジオメトリを直接変更する,Rコードのより少ない方法を紹介する.
Nippon_map$geometry[#]
:Nippon_map
のgeometry
列の#
行を意味する.$
と[]
を忘れずに.
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
コードが圧倒的に少なくて済む.
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による地理空間データの可視化