日本白地図を書く

都道府県の白地図を描きたい

おそらく最も簡単な方法

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番号(0147)と値の入った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::readOGRsf::st_readRegionsに置き換えろ,と警告が出る.sfパッケージ系で,shapeデータをパッケージ内に読み込んで,コンパクトな日本地図が描けるように,だれか改変してください.