Dr. Kazuhiro Fukuyo
Professor, Yamaguchi University
Last updated: August 7th, 2010
空間統計に本格的に取り組もうとしたら、例えば、牧山文彦氏の「Rと空間統計」からスタートしたほうがいいと思いますが、今回は日本地図の塗り分けという限定された目的なので、群馬大学の青木繁伸先生の作成したグラフィック関連プログラム(参考:「塗り分け地図を描く」)を利用することにしました。
つぎに、Rを立ち上げ、次のコマンドで地図の塗りわけを行うプログラム(関数)"map"を読み込む。
source("http://aoki2.si.gunma-u.ac.jp/R/src/map.R", encoding="euc-jp")
ちなみに小生の場合、http://aoki2.si.gunma-u.ac.jp/R/src/map.Rに直接アクセスし、ソースコードを表示。そして、ソースコード全体をコピーし、「メモ帳」にペースト(eucからshift-jisに換えるため)。"map.txt"としてCドライブ直下に作った"rtemp"なるフォルダに保存した。つぎに、ソースコードの下から11行目:
fn <- sprintf("jpn/%02i", i) # データファイル名を得る
を
fn <- sprintf("c:\\jpn\\jpn\\%02i", i) # データファイル名を得る
に書き直した。なぜなら上述したように、小生はCドライブ直下に都道府県境界データを置いているからである。こうしておいた後、Rを立ち上げ、
source("C:\\rtemp\\map.txt")
というコマンドでプログラムを読み込むことにした。
まず、同ページの「タイプ2」の関数のソースコードをコピーして、「メモ帳」にペースト。このコードを改造し、新たなカラーパレットと凡例の追加を行った。以下は改造後のコードである。下線部が小生の改造した部分。
# 統計データを 5 段階に区切って,塗り分け地図を描く
color.mapx <- function( x, # 長さ 47 の,統計データのベクトル
t, # データを 5 区分するための 4 つの値
color.no=9, # 塗りつぶしに,何色系統を使うか(以下を参照)
unit ) #f 単位として用いる文字列
{
color.set <- matrix(c( # 色の系統 color.no
"gray100", "gray75", "gray50", "gray25", "gray0", # 灰色1 1
"#eeeeee", "#bbbbbb", "#999999", "#777777", "#555555", # 灰色2 2
"#ee0000", "#bb0000", "#990000", "#770000", "#550000", # 赤色系 3
"#eeffee", "#aaffaa", "#00ee00", "#00bb00", "#009900", # 緑色系 4
"#0000ee", "#0000bb", "#000099", "#000077", "#000055", # 青色系 5
"#ee00ee", "#bb00bb", "#990099", "#770077", "#550055", # 紫色系 6
"#00eeee", "#00bbbb", "#009999", "#007777", "#005555", # 水色系 7
"#eeee00", "#bbbb00", "#999900", "#777700", "#555500", # 黄色系 8
"lemonchiffon", "yellow", "gold", "orange", "red" #f heat color 9
), byrow=TRUE, ncol=5)
if (length(t) != 4) {
stop("t は,長さ4のベクトルでなければなりません")
}
if (!(color.no %in% 1:9)) {
stop("color.no は,1〜9 の整数でなければなりません")
}
map(1:47, color=color.set[color.no, findInterval(x, t)+1])
#f 以下は凡例の描画用
for (ii in 1:5) {
xx <- c(0, 0, 50, 50, 0)
yy <- c(120 + 30 * ii, 150 + 30 * ii, 150 + 30 * ii, 120 + 30 * ii, 120 + 30 * ii)
polygon(xx, yy, col=color.set[color.no, ii])
if (ii < 5) text(60, 150 + 30 * ii, labels = t[ii], adj = 0)
else text(60, 150 + 30 * ii, labels = unit, adj = 0)
}
}
この関数を"color_mapx.txt"という名前で保存した(普通はR用のソースコードは"***.R"という拡張子で保存しているようだが、小生はメモ帳で作業を行うことが多いので、"***.txt"にしている)。
この関数の使い方だが、color.mapx(x, t, 9, " [mm]")のようにパラメータを入力して使用する。
1番目のパラメータ:xは47都道府県の統計数値データ(ベクトルデータ)。
2番目のパラメータ:tは色分けを行う境界値で4つの数値を持つベクトルデータである。
3番目のパラメータはカラーパレットの番号。小生は4番の緑を改造。また、9番目のパレットとして"heat color"なるものを加えた。
4番目のパラメータは今回新たに加わったもので、数値の単位を表す。凡例のところで使われる。
Rを立ち上げたら、次のように塗りわけ地図描画関数の呼び出しを行う。
source("c:\\rtemp\\map.txt")
source("c:\\rtemp\\color_mapx.txt")
つぎに、各都道府県の年間の日照時間のデータを準備する。
dayl <- c(1774.8,1675.6,1739.7,1842.6,1597.4,1653.3,1783.1,1886.8,1938,2037.7,2007.2,1860.8,1847.2,1920.6,1651,1599.6,1667.5,
1610.2,2128.7,2095.7,2085.8,2037.7,2053.4,2018.8,1833.2,1734.3,1967.1,1965.8,1837.6,2083,1762.4,1729.6,2009.8,2004.9,1895.2,
2044.4,2076.8,1967.9,2120.1,1848.5,1884.2,1867.6,1964.5,1948.4,2108.4,1918.9,1820.9)
ここで、c( )の中身、つまり都道府県別データの順番は、そして、いよいよ日照時間で塗り分けてみる:
t <- c(1700, 1800, 1900, 2000)
color.mapx(dayl, t, 9, "年間日照時間[h](1971〜2000年平年値)")
こうなるはず: