| Top Page | プログラミング |


二次メッシュベースの日本地図描画ライブラリ (for R)

First uploaded on 2011-02-26
Latest version uploaded on 2014-06-03

概要

二次メッシュを色で塗ることで簡単に日本地図を描く関数群です。 メッシュごとの何らかのデータの大小で色の勾配を付けて塗る関数と、 二次メッシュの白地図を描いて、緯度・経度で指定した場所に点を描く関数を作成しました。 白地図を描く関数を単独で使うこともできます。

GIS ソフトがあればそれで済むことですが、 R で作業している人が、二次メッシュ単位での解析の結果を 簡単に地図化したい場合に利用価値があるかもしれません。 多量の地図を一気に作成したい場合には、PDFや 画像ファイルを 自動生成しながら描いていくと便利でしょう。

色の勾配を付けて塗る場合(paint_j_map関数)、色スケールは、R でもともと用意されているもの ("heat", "topo", "terrain", "cm") のほか、 白→赤("red"), 白→緑("green"), 白→青("blue"), 赤→緑(red.green"), 緑→青("green.blue"), 青→赤("blue.red") の、6種類のパターンを作成しました。 col.scale パラメータで設定できます。

本プログラムの利用・改変・再配布は自由です。ただしソースを転載する際には、 作者表示および URL 表示 (http://takenaka-akio.org/etc/j_map/) はそのまま残してください。

作成した関数群(ユーザーが直接利用するもの)

paint_j_map
二次メッシュを値で色分けしてマッピングする関数。 渡すデータは、一列めが二次メッシュコード、2列めが値のデータフレーム。 全メッシュでバックグラウンドを 描いたのち、 渡されたデータに含まれるメッシュは色を塗る。
plot_on_j_map
日本全体の白地図を描いたあと、 緯度・経度を指定して点をプロットする関数。 渡すデータは、一列めが緯度、二列めが経度のデータフレーム (それぞれの値は度単位の小数点表示)か、一列めが二次メッシュコードのデータフレーム。 二次メッシュコードで与える場合は、 by.code = TRUE と指定。 白地図を描かず、paint_j_map でメッシュの色分けをした図に 上書きでプロットすることもできる。
draw_blank_map
白地図を描く関数。 paint_j_mapおよび plot_on_j_mapのなかで呼び出されるほか、直接ユーザーが呼び出して白地図を描いたあと、 plot_on_j_mapを上書きモードで使って点をプロットするのも可。

実行に必要なファイル

draw_j_map.R
日本地図を描く関数群の定義ファイル。 (以前の版では、メッシュコード処理関数群、色スケール生成関数群 およびメッシュコードを記録したテキストファイルを 同じディレクトリに入れて使用したが、リリース版ではすべてひとつのファイルにまとめた)


ダウンロード

draw_j_map.R のほか、サンプルデータ と、それを使って描画するデモ用プログラム map_demo.R を zip でまとめた j_map_20140603.zip を用意した。

同梱のサンプルデータは以下の通り。

clim_j.txt
全二次メッシュの気象・地形データ(コード、標高、気温、降水量、積雪、人工物比率)
n_species.txt
全二次メッシュのある生物群の種数データ(メッシュコード、種数)
sp_map.txt
生物の分布データ(緯度、経度、種のコード)
species01.txt
1種の生物の分布データ(分布するメッシュのメッシュコード)
values01.txt
ある基準で評価したメッシュごとの値(メッシュコード、評価値)。1160 メッシュを含む。

デモ map_demo.R の実行結果

R のコマンドプロンプトで、 j_map_20140603.zipから取り出したファイルをすべてしまったディレクトリに移動してから source('map_demo.R') と入力すれば、 本ページのこれ以降に載せた図が順次描かれていきます。また、ひとつのデモの部分だけ コピーして、プロンプトに貼り付ければ、そのデモだけ実行できます。

source('draw_j_map.R')  # ライブラリの読み込み

# 縦横を 1:1 の比率の描画デバイスを用意すると、図上の縦横がほぼ同じ縮尺になる
windows(width = 8, height = 8)  

par(ask = T)  # 確認のため、一枚の描画ごとにストップ

##### デモ1 paint_j_map #####

# 地形・気象データ

気象データclim_j.txtを使う。

d <- read.table('clim_j.txt', header = TRUE)  # 地形・気象データの読み込み
d.clim <- data.frame(d$mesh_code, d$mean_tmp) # メッシュコードと平均気温を1列めと2列めに。

# すべてデフォルト設定で描画
paint_j_map(d.clim)  

# 背景を黒に。タイトル付き

# 前景・背景色パターンの指定(col.back) とタイトル指定
paint_j_map(d.clim, col.back = "black", title = "Mean temp") 

# 色の順を逆にする

# rev.scale を TRUE にして、色の順を逆転
paint_j_map(d.clim, col.back = "black", title = "Mean temp", rev.scale = TRUE) 

# 離島を描かない

# no.isl をTRUEにして、離島(南西諸島、小笠原)を描かない
paint_j_map(d.clim, col.back = "black", title = "Mean temp", no.isl = TRUE)

##### デモ2 paint_j_map の続き #####

# データが一部メッシュのみ

一部のメッシュの、ある評価データ values01.txtを使う。

d <- read.table('values01.txt', header = TRUE) # 一部のメッシュのデータ

# 前景・背景色パターンの指定(col.back) と色スケール(col.scale)の指定
#  色スケールの blue は、color_grad.R で定義されているblue.colors() を呼び出して実現。
paint_j_map(d, col.back = "dark.blue", col.scale = "blue")

# データがない部分の色を指定

# データがないメッシュの色(col.blank)を指定。
# rgb に、赤成分、緑成分、青成分それぞれの強さを 0 から 1の間で指定するパラメータを渡す。

paint_j_map(d, col.back = "dark.blue", col.scale = "blue",  col.blank = rgb(0, 0.5, 0))

##### デモ3 paint_j_map の続き:非負整数として扱う #####

全二次メッシュのある生物群の種数データ n_species.txt を使う。

is.natural パラメータで、非負整数として扱うこと(負のデータはプロットしない、区切りは整数)を指定する。 さらに、 min.natural パラメータで、 最小クラスを、0 のデータを含めたクラスとするか("from.zero")、 0 のデータは別クラスとするか("only.zero")、 あるいは 0 のデータは捨ててプロットしないか("from.one")を指定できる。

# マイナスの値を除き、すべて整数として扱う

d <- read.table('n_species.txt', header = TRUE) 

# is.natural = TRUE を指定
paint_j_map(d, is.natural = TRUE, col.back = "black")

# 値が 0 のメッシュを除いて描画

# is.natural = TRUE に加え、min.natural = "from.one"を指定
paint_j_map(d, is.natural = TRUE, min.natural = "from.one", col.back = "black")

# 値が 0 のメッシュは単独で1クラス

# is.natural = TRUE に加え、min.natural = "only.zero"を指定
paint_j_map(d, is.natural = TRUE, min.natural = "only.zero", col.back = "black")

##### デモ4 plot_on_j_map #####

3種の生物の分布データsp_map.txtを使う。

d.map <- read.table('sp_map.txt', header = TRUE)  # 種の分布データを読み込み

dd <- d.map[d.map$sp == 'sp-A',]  # 一種のデータを抽出
plot_on_j_map(dd, col = 1)

dd <- d.map[d.map$sp == 'sp-B',]  # 別種を抽出。
plot_on_j_map(dd, col = 2, overlay = TRUE)  # overlay を TRUEにして、同じグラフに別の色でプロット

dd <- d.map[d.map$sp == 'sp-C',]
plot_on_j_map(dd, col = 4, overlay = TRUE) 

##### デモ4-2 draw_blank_map + plot_on_j_map #####

上と同様のことは、はじめに draw_blank_map で白地図を描いてもできる。

d.map <- read.table('sp_map.txt', header = TRUE)  # 種の分布データを読み込み

spp <- levels(d.map$sp) # 種を抽出
n.spp <- length(spp)

draw_blank_map() # 白地図を描く

for (i.sp in 1:n.spp) {  # 各種について
	dd <- d.map[d.map$sp == spp[i.sp], ]          # データを抽出
	plot_on_j_map(dd, col = i.sp, overlay = TRUE) # 上書きプロット
}

# 凡例を書き込む
legend("topleft", legend = spp, col = 1:n.spp, pch = 16, bty = "n", cex = 2)

##### デモ5 plot_on_j_map, メッシュコードで指定 #####

1種の生物の分布メッシュが記録されたファイル species01.txt を使う。

d.codes <- read.table('species01.txt')  # 1種の分布データ(分布するメッシュのコード)を読み込み
plot_on_j_map(d.codes, by.code = TRUE, col = 2) # by.codeで、メッシュコードデータであることを明示

##### デモ6 paint_j_map と plot_on_j_map の合わせ技 #####

# 気象データで色分けした上に、分布データをプロット

d <- read.table('clim_j.txt', header = TRUE)         # 地形・気象データの読み込み
d.clim <- data.frame(cbind(d$mesh_code, d$mean_tmp)) # メッシュコードと平均気温
paint_j_map(d.clim, col.back = "black", col.scale = "blue")  # 青スケールで描画

dd <- d.map[d.map$sp == 'sp-C',]
plot_on_j_map(dd, col = 2, overlay = TRUE)  # overlay を TRUEにして、同じグラフに重ねてプロット


各関数のパラメータ設定

paint_j_map

##############################
# 二次メッシュの色分けマップを描く。
#
paint_j_map <- function(d,
                n.class     = 8,
                is.natural  = FALSE,
                min.natural = "from.zero",
                title       = '',
                col.back    = "white",
                col.scale   = "heat",
                rev.scale   =  FALSE,
                col.blank   = "#AAAAAA",
                no.isl      =  FALSE)


# 引数
# d,          一列めが二次メッシュコード、二列めが値のデータフレーム
#
# 以下の引数はオプショナル(何も指定しなくともよい)
#
# n.class,    値を何個のクラスに分けるか。デフォルトは 8
# is.natural  値を非負整数として扱う。最小クラスの扱いは min.natural で指定する。
#             クラス分けは整数幅。 したがってクラス数が n.class より小さくなることもある。
# min.natural 非負整数扱い(is.natural が TRUE)の場合の、ゼロのデータの処理。
#             from.zero (デフォルト) 最小クラスに 0 を含める。
#             only.zero 0 のデータのみを最小クラスとする。
#             from.one  最少クラスは 1 以上。0 以下のデータはプロットしない。
# title,      図内に書込むタイトル
# col.back    背景色、前景色(枠線など)の配色セット
#             デフォルトは "white", ほかに "dark.blue", "dark.green", "black", "light.grey"
# col.scale,  色のパターン. "heat", "topo", "terrain", "cm" の他、
#             "red", "green", "blue", "red.green", "green.blue", "blue.red"を定義している
# rev.scale,  色の順序の反転 (TRUE で反転。デフォルトは FALSE)
# col.blank,  データがないメッシュの色の指定。デフォルトは灰色 (#AAAAAA)
# no.isl      TRUEなら、小笠原諸島、南西諸島をずらして書込まない。デフォルトはFALSE

plot_on_j_map

##############################
#
#  白地図上に点をプロットする。
#
#  ※複数種類の点をプロットしたい場合は、overlay = TRUE として上書きしていく。
#  ※位置を二次メッシュコードで与える場合は、 by.code = TRUE と指定。


plot_on_j_map <- function(d, 
                by.code   = FALSE,
                title     = '', 
                col.back  = "white",
                cex       = 1,
                col       = 2,
                pch       = 16,
                lwd       = 1,
                col.blank = "#AAAAAA",
                overlay   =  FALSE,
                no.isl    =  FALSE)

# 引数
# d,      一列めが緯度、二列めが経度のデータフレーム
#         ないしはメッシュコード(1列め)が入ったデータフレーム
#
# 以下の引数はオプショナル(何も指定しなくともよい)
#
# by.code, TRUEなら、メッシュコードが与えられたとして処理。デフォルトは FALSE
# col     シンボルの色。デフォルトでは 1
# cex     シンボルのサイズ。デフォルトは 1
# pch     シンボルの種類。デフォルトは 16(塗りつぶし円)
# lwd     シンボルの線の太さ。 デフォルトは 1
# col.blank,  白地図の色。デフォルトは灰色 (#AAAAAA)
#
# title,      図内に書込むタイトル
# col.back 背景色、前景色(枠線など)の配色セット
#             デフォルトは "white", ほかに "dark.blue", "dark.green", "black", "light.grey"
# overlay,    既存グラフに上書きするか。デフォルトはFALSE.
#
# no.isl      TRUEなら、小笠原諸島、南西諸島をずらして書込まない。デフォルトはFALSE

draw_blank_map

#####################################################
#
#  白地図描画関数。
#  draw_j_map から呼び出して使う、背景描画関数
#  ユーザーが直接呼び出して白地図を書くことも可。
#  その上に plot_on_j_map で点をプロットするといった使い方がある。
#

draw_blank_map <- function(file.name = "", 
                           title = '',
                           cex.title = 1.5,
                           col.blank ="#AAAAAA",
                           col.back = "white",
                           no.isl    =  FALSE)

# 引数
#  file.name,   プロットするメッシュのコードが一行ごとに書かれたファイル。
#               1行目はヘッダ。
#               デフォルトでは、ファイルを読み込まず、本ソースに書かれたメッシュコードの
#               リストが使われる。
#  title,       図内に書込むタイトル
#  cex.title    タイトルの文字の大きさ。デフォルトは 1.5
#  col.blank    白地図の色(値がないメッシュの色)。デフォルトは灰色 "#AAAAAA"
#  col.back     背景色、前景色(枠線など)の配色セット
#               デフォルトは "white", ほかに "dark.blue", "dark.green", "black", "light.grey"
#               拡張したければ、get_col_pattern 関数を改変する。
#  no.isl       TRUEなら、小笠原諸島、南西諸島をずらして書込まない。デフォルトはFALSE


更新情報


参考

地域メッシュコードについては以下の情報を参照のこと。


| Top Page | プログラミング |