塗り分け地図1

maptools、classInt ,ggplot2パッケージ


塗り分け地図の作成には、ESRIジャパン株式会社の全国市区町村界データを使用しました。

人口(P_NUM)は
「住民基本台帳に基づく人口、人口動態及び世帯数(平成26年1月1日現在) 総務省」による人口
市町村の面積は
平成25年全国都道府県市区町村別面積調

文字コード変換( SHIFT_JIS -> UTF-8)にはlibreOffice Calcとleafpadを使いました。
(ヘッダーの数値を増やす必要有り)
Rのforeignパッケージを使ってもできるようです。

人口規模に応じて塗り分け(中国地方)

ESRI全日本市区町村ShapeFileだけで描ける

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
library(maptools)
library(classInt)
# ESRI全日本市区町村ShapeFileの読み込み
jpn = readShapePoly("JPN/JPN/japan_ver72.shp")
proj4string(jpn)="+proj=longlat"
city=0; ccex=0.6; lloc="topleft";maintxt="人口規模に応じて塗り分け(中国地方)"
# 県の指定
#jpn.pref <- jpn[jpn$KEN=="鳥取県",]
jpn.pref <- jpn[jpn$KEN=="鳥取県" | jpn$KEN=="島根県" | jpn$KEN=="山口県" | jpn$KEN=="広島県"| jpn$KEN=="岡山県",]
# DBFデータの取り出し
jpn.pref.data = jpn.pref@data
###########
# 地図描画 #
###########
#png("population01.png", width=1000, height=800)
par(cex = 0.9,family="Takao P明朝")
DD= jpn.pref$P_NUM
# 塗りつぶしの色
#col_grad <- c("white","magenta4")
col_grad <- rev(heat.colors(8))
intvl <- classIntervals(DD,n=8,style="fixed",fixedBreaks=c(0,5000,10000,30000,100000,200000,300000,400000,500000))
cols <- findColours(intvl,col_grad)
plot(jpn.pref, col=cols, axes=T,xlim=c(130,135),ylim=c(33.5,36.5))
legend(lloc, fill=attr(cols,"palette"), cex=2, legend=names(attr(cols,"table")))
# 図タイトルの記入
mtext(maintxt, side=3, cex=1.5, line=1)
# 市町村名の追加
if (city ==1) {
text(getSpPPolygonsLabptSlots(jpn.pref), labels=as.character(jpn.pref$SIKUCHOSON), cex=ccex)
}
#dev.off()
summary(jpn.pref$P_NUM)

人口密度に応じて塗り分け(鳥取県)

tottori.csvを読み込んで塗り分け。JCODE(市区町村コード)が必要

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
library(maptools)
library(classInt)
# ESRI全日本市区町村ShapeFileの読み込み
## ShapeFileをSpatialPolygonsDataFrameに
jpn = readShapePoly("JPN/JPN/japan_ver72.shp")
proj4string(jpn)="+proj=longlat"
#読み込むデータはJCODE(市区町村コード)が必要
Dataset <- read.table("/home/user/R/work/tottori.csv", header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
mdata=Dataset;mvar="人口密度"; city=1; ccex=1.2; lloc="topleft";maintxt="人口密度に応じて塗り分け(鳥取県)"
# 県の指定
jpn.pref <- jpn[jpn$KEN=="鳥取県",]
# DBFデータの取り出し
jpn.pref.data = jpn.pref@data
###########
# 地図描画 #
###########
#png("PopulationDensity01.png", width=1000, height=800)
par(cex = 0.9,family="Takao P明朝")
# DBFデータに他のデータをJCODEをキーにしてマージ
# all=T を指定し,データを全て残す
# 凡例
DD = merge(mdata, jpn.pref.data, sort=F, by="JCODE", all=T)
DD = DD[, colnames(DD) == mvar]
# 塗りつぶしの色
#col_grad <- c("white","magenta4")
col_grad <- rev(heat.colors(8))
#intvl <- classIntervals(DD,n=8,style="fixed",fixedBreaks=c(0,5000,10000,30000,100000,200000,300000,400000,500000)) #人口
intvl <- classIntervals(DD,n=8,style="fixed",fixedBreaks=c(0,25,50,100,250,500,750,1000,2000)) #人口密度
cols <- findColours(intvl,col_grad)
plot(jpn.pref, col=cols, axes=T)
legend(lloc, fill=attr(cols,"palette"), cex=2, ncol=2,legend=names(attr(cols,"table")))
# 図タイトルの記入
mtext(maintxt, side=3, cex=1.5, line=1)
# 市町村名の追加
if (city ==1) {
text(getSpPPolygonsLabptSlots(jpn.pref), labels=as.character(jpn.pref$SIKUCHOSON), cex=ccex)
}
#dev.off()
summary(DD)

凡例を枠外、背景の色指定、グリッド線を引く、ボーダー線を指定など

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
library(maptools)
library(classInt)
# ESRI全日本市区町村ShapeFileの読み込み
## ShapeFileをSpatialPolygonsDataFrameに
jpn = readShapePoly("JPN/JPN/japan_ver72.shp")
proj4string(jpn)="+proj=longlat"
#読み込むデータはJCODE(市区町村コード)が必要
Dataset <- read.table("/home/user/R/work/tottori.csv", header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
mdata=Dataset;mvar="人口密度"; city=1; ccex=1.2; lloc="topleft";maintxt="人口密度に応じて塗り分け(鳥取県)"
# 県の指定
jpn.pref <- jpn[jpn$KEN=="鳥取県",]
# DBFデータの取り出し
jpn.pref.data = jpn.pref@data
###########
# 地図描画 #
###########
#png("PopulationDensity02.png", width=1000, height=800)
par(cex = 0.9,family="Takao P明朝",mar=c(3,3,3,11.5))
# DBFデータに他のデータをJCODEをキーにしてマージ
# all=T を指定し,データを全て残す
DD = merge(mdata, jpn.pref.data, sort=F, by="JCODE", all=T)
DD = DD[, colnames(DD) == mvar]
# 塗りつぶしの色
col_grad <- rev(heat.colors(8))
#intvl <- classIntervals(DD,n=8,style="fixed",fixedBreaks=c(0,5000,10000,30000,100000,200000,300000,400000,500000)) #人口
intvl <- classIntervals(DD,n=8,style="fixed",fixedBreaks=c(0,25,50,100,250,500,750,1000,2000)) #人口密度
cols <- findColours(intvl,col_grad)
plot(jpn.pref, col=cols, border="white",lwd = 2,bg = "lightcyan1", axes=T, panel.first = grid(lty=1,col = "white"))
# 枠外への描画を許可
par(xpd=T)
# 凡例を表示
# par()$usr[2], par()$usr[4]で右上の座標を取得する
legend(par()$usr[2]+0.01 , par()$usr[4] - 0.6 , fill=attr(cols,"palette"), box.lty=0,cex=1.5,ncol=1,legend=names(attr(cols,"table")),title="人口密度(人/km^2)",, title.col ="blue")
# 図タイトルの記入
mtext(maintxt, side=3, cex=1.5, line=1)
# 市町村名の追加
if (city ==1) {
text(getSpPPolygonsLabptSlots(jpn.pref), labels=as.character(jpn.pref$SIKUCHOSON), cex=ccex)
}
#dev.off()
summary(DD)

棒グラフ(ggplot2パッケージを使用)
市町村の面積によってグラフの色を変える

1
2
3
4
5
6
7
8
9
10
library(ggplot2)
ggplot(Dataset,aes(x = reorder(CITY1,JCODE),y=人口密度))+
geom_bar(stat = "identity",aes(fill=面積)) +
xlab("市町村名(JCODE順)")+
ylab("人口密度(1平方kmあたり人数)")+
ggtitle("鳥取県人口密度(市町村別)") +
geom_text(aes(x = reorder(CITY1,JCODE),y=人口密度+30,label=round(人口密度)), size=4, colour="gray55")+
#theme(legend.position ="none")
scale_fill_gradientn(limits = c(0,800),colours=c("blue","lightgray","orange"),breaks=c(10,100,200,300,500,800),labels=format(c(10,100,200,300,500,800)))
#ggsave("PopulationDensity03.png",dpi = 100)