都道府県の白地図を描きたい
おそらく最も簡単な方法
library(NipponMap)
とりあえず47都道府県の色を白にしよう.
col01 = rep("white", 47)
京都(都道府県IDが26)だけを赤(RBG指定で#FF0000)
col01[26]="#FF0000"
描画
par(mar=c(0,0,0,0)) #マージンを全て0にする
JapanPrefMap(col=col01) #日本地図を描く(47都道府県の色を指定するだけ)
sf::geom_sf()
を使う方法
R入門コースに紹介されていた方法.
正攻法だが・・・ 自分で地図用のデータをダウンロードする必要がある.
私には,沖縄の表示位置をいじるのがたいへん?.
library(tidyverse)
library(sf)
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
地図用データのダウンロード
Natural
Earthのダウンロードページから,Admin
1 – States, Provincesのstates_thumbInternal administrative
boundaries.の Download states and
provincesをダウンロードし,Rで現在使っているワークドライブで解凍(フォルダ構成はいじらない)
states01 <- sf::read_sf(".//ne_10m_admin_1_states_provinces")
日本のデータだけ抽出
japan01 <- states01 %>%
dplyr::filter(adm0_a3 == 'JPN')
白地図を描いてみる
ggplot(data=japan01)+geom_sf()+theme_void()
スケールで色分け
都道府県のID番号(01
~47
)と値の入ったtibbleがあったとする.
d01<-tibble(Pref_ID=sprintf("%02d",1:47),
value=rnorm(47))
これをデータにくっつける.
都道府県IDにあたる数字がiso_3166_2
という変数の最後の2桁にあったので,str_sub()
関数でこれだけ抜き出してPref_ID
という名前で新たな変数を追加し,これを軸にd01
の値を貼り付ける.
japan02<-japan01%>%
mutate(Pref_ID=str_sub(iso_3166_2,start = -2,end=-1))%>%
inner_join(d01,by="Pref_ID")
描画する.経緯線は消した.
ggplot(data=japan02) +
geom_sf(aes(fill = value)) +
scale_fill_gradient2(low = "Gray10",
mid="white",
high = "Red",
space = "Lab") +
theme_void()
うう~ん,きれいなんだが,やはり空白が多すぎる...
いじればちゃんとできるんだろうけど.
ややオーバースペック.
ggJapanPrefecturesMap()
を使う
kzktmer/ggJapanPrefecturesMap.Rを拝借させてもらいました.
library(tidyverse)
library(NipponMap)
library(maptools)
## Loading required package: sp
## Checking rgeos availability: FALSE
## Note: when rgeos is not available, polygon geometry computations in maptools depend on gpclib,
## which has a restricted licence. It is disabled by default;
## to enable gpclib, type gpclibPermit()
ライブラリ NipponMap(オリジナルはライブラリNippon)をggplot化したもの.
地図を描くためのデータを自分でダウンロードしておく必要がない.
引数inset=TRUE
で沖縄県の位置を別置きできる.
都道府県地図を塗りつぶすだけなら,これで十分かも.
関数定義
オリジナルを少しいじっています.
col
: 47都道府県の色を指定する場合の色.fill
:
何かの値に応じてグラデーションを付ける場合の値fillcol
:
グラデーションの+側の色inset
:TRUE
で沖縄の位置をずらす.
ggJapanPrefecturesMap <- function (col = "white",
fill = NULL,
fillcol="Red",
inset = TRUE, ...)
{
require(NipponMap)
require(foreign)
m <- readShapePoly(system.file("shapes/jpn.shp",
package = "NipponMap")[1],
proj4string = CRS("+proj=longlat +datum=WGS84"))
if (inset) {
xy.okinawa <- m@polygons[[47]]@Polygons[[1]]@coords
xy.okinawa[, 1] <- xy.okinawa[, 1] + 7
xy.okinawa[, 2] <- xy.okinawa[, 2] + 14
m@polygons[[47]]@Polygons[[1]]@coords <- xy.okinawa
labpt <- m@polygons[[47]]@labpt
labpt[1] <- labpt[1] + 7
labpt[2] <- labpt[2] + 14
m@polygons[[47]]@labpt <- labpt
m@bbox[1, 1] <- 130
m@bbox[2, 1] <- 31
}
fm <- fortify(m)
fm$id <- as.numeric(fm$id)
d <- read.dbf(system.file("shapes/jpn.dbf",
package="NipponMap"),
as.is=TRUE)
d$id <- as.numeric(d$SP_ID) - 1
g <- ggplot(d) + theme_void()
if(is.null(fill)){
col <- head(rep(col, ceiling(47 / length(col))), 47)
g <- g + geom_map(map = fm,
aes(map_id = id),
fill = col,
colour = "black",
size = 0.1)
}else{
g <- g + geom_map(map = fm,
aes(map_id = id, fill = fill),
colour = "black",
size = 0.1)+
scale_fill_gradient2(low = "Gray10",
mid="white",
high = fillcol,
space = "Lab") +
theme(legend.title=element_blank())
}
g <- g +
expand_limits(x = fm$long, y = fm$lat) +
coord_map() +
theme(axis.title = element_blank())
if (inset) {
g <- g +
geom_line(data = data.frame(long = c(132, 135, 137, 137),
lat = c(38, 38, 40, 43)),
mapping = aes(x = long, y = lat),
colour = "black",
size = 0.2)
}
g
}
色を直接指定して描いてみる
col01 = rep("white", 47) #とりあえず47都道府県の色を白に
col01[26]="#FF0000" #京都だけ赤(RBGで指定してみた)
描画
ggJapanPrefecturesMap(col = col01,
inset =TRUE)
## Loading required package: foreign
## Warning: readShapePoly is deprecated; use rgdal::readOGR or sf::st_read
## Regions defined for each Polygons
値で塗分ける
ggJapanPrefecturesMap(fill=d01$value,
fillcol="blue",
inset =TRUE)
## Warning: readShapePoly is deprecated; use rgdal::readOGR or sf::st_read
## Regions defined for each Polygons
これでよいのだが,readShapePoly()
関数がもう古いらしく,rgdal::readOGR
かsf::st_readRegions
に置き換えろ,と警告が出る.sfパッケージ系で,shapeデータをパッケージ内に読み込んで,コンパクトな日本地図が描けるように,だれか改変してください.