Rで地図の塗りわけ

Dr. Kazuhiro Fukuyo
Professor, Yamaguchi University
Last updated: August 7th, 2010

空間統計の初歩の初歩ですが、統計データを使って地図を塗り分ける作業を行いました。

空間統計に本格的に取り組もうとしたら、例えば、牧山文彦氏の「Rと空間統計」からスタートしたほうがいいと思いますが、今回は日本地図の塗り分けという限定された目的なので、群馬大学の青木繁伸先生の作成したグラフィック関連プログラム(参考:「塗り分け地図を描く」)を利用することにしました。


準備作業

まず、日本地図の都道府県境界データが必要なので、"jpn.zip"をダウンロードし、解凍する。解凍してできたフォルダをR のワーキングディレクトリーに移動。小生の場合はCドライブ直下に置いている。

つぎに、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")
というコマンドでプログラムを読み込むことにした。

5段階で塗り分ける関数

map関数をさらに使いやすくする関数を青木先生が作成している(「塗り分け地図を描く Last modified: Apr 13, 2004」)ので、これを改造して小生用の関数を作ることにする。

まず、同ページの「タイプ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番目のパラメータは今回新たに加わったもので、数値の単位を表す。凡例のところで使われる。

使ってみる

ためしに、各都道府県を年間日照時間[h]で塗り分けてみる。

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年平年値)")
こうなるはず:


参考:

<back>