|
|
二次メッシュベースの日本地図描画ライブラリ (for R)
First uploaded on 2011-02-26
|
|
二次メッシュを色で塗ることで簡単に日本地図を描く関数群です。 メッシュごとの何らかのデータの大小で色の勾配を付けて塗る関数と、 二次メッシュの白地図を描いて、緯度・経度で指定した場所に点を描く関数を作成しました。 白地図を描く関数を単独で使うこともできます。
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/) はそのまま残してください。
draw_j_map.R のほか、サンプルデータ と、それを使って描画するデモ用プログラム map_demo.R を zip でまとめた j_map_20140603.zip を用意した。
同梱のサンプルデータは以下の通り。
R のコマンドプロンプトで、 j_map_20140603.zipから取り出したファイルをすべてしまったディレクトリに移動してから source('map_demo.R') と入力すれば、 本ページのこれ以降に載せた図が順次描かれていきます。また、ひとつのデモの部分だけ コピーして、プロンプトに貼り付ければ、そのデモだけ実行できます。
source('draw_j_map.R') # ライブラリの読み込み
# 縦横を 1:1 の比率の描画デバイスを用意すると、図上の縦横がほぼ同じ縮尺になる
windows(width = 8, height = 8)
par(ask = T) # 確認のため、一枚の描画ごとにストップ
気象データ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)
一部のメッシュの、ある評価データ 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))
全二次メッシュのある生物群の種数データ 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")
# is.natural = TRUE に加え、min.natural = "from.one"を指定 paint_j_map(d, is.natural = TRUE, min.natural = "from.one", col.back = "black")
# is.natural = TRUE に加え、min.natural = "only.zero"を指定 paint_j_map(d, is.natural = TRUE, min.natural = "only.zero", col.back = "black")
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)
上と同様のことは、はじめに 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)
1種の生物の分布メッシュが記録されたファイル species01.txt を使う。
d.codes <- read.table('species01.txt') # 1種の分布データ(分布するメッシュのコード)を読み込み
plot_on_j_map(d.codes, by.code = TRUE, col = 2) # by.codeで、メッシュコードデータであることを明示
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 <- 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
##############################
#
# 白地図上に点をプロットする。
#
# ※複数種類の点をプロットしたい場合は、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_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
地域メッシュコードについては以下の情報を参照のこと。