Rで解析:圃場試験の区画配置図を描く「desplot」パッケージの紹介
圃場(ほじょう)試験では、区画の位置と測定値の関係を把握することが欠かせません。しかし、多数の区画の配置と収量のばらつきを一枚の地図として描き、外れ値やブロックの偏りを読み取るには手間がかかります。
「desplot」パッケージは、圃場の区画を格子状に並べた地図として描画し、測定値を色分けで表現します。ブロックや処理区の枠線の重ね描き、セル内へのラベルや数値の表示、データ品質の低い区画を斜線で示す機能が可能です。また、latticeとggplot2のどちらでも同じ図を出力でき、赤・灰・青のグラデーション配色の生成も可能です。
本パッケージの利用で、圃場試験の空間的な傾向を視覚的に確認できるのではないかと考えます。
パッケージバージョンは1.11。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("desplot")
# パッケージの読み込み
library("desplot")
# コマンド例実行で必要なパッケージを読み込み
library("ggplot2")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
圃場試験では、試験地を格子状の区画(プロット)に分け、反復のまとまりであるブロックごとに処理を割り付けます。desplotパッケージは、区画の位置を表す2つの数値列を平面座標として扱い、そこに測定値の色分けや枠線を重ねた配置図を作成します。描画の指定は「測定値 ~ 横位置 * 縦位置」という数式で行い、必要に応じて群ごとの面付けを縦棒で追加します。
以降、京都府和束町の茶畑で宇治茶の6品種を6列4行の24区画に植え付け、荒茶収量を調べた品種試験を想定した擬似データを共通データとして使用します。列と行が区画の位置、ブロックが反復、品質はデータの信頼度を示すフラグ(0が良好、1が要確認、2が不良)です。
# 和束町の宇治茶 品種試験を模した区画データの作成(6列×4行=24区画)
茶園 <- data.frame(
# 区画の東西方向の位置
列 = rep(1:6, times = 4),
# 区画の南北方向の位置
行 = rep(1:4, each = 6),
# 反復のまとまりを表すブロック
ブロック = factor(rep(c("I", "II", "III", "IV"), each = 6)),
# 各区画に植えた宇治茶の品種
品種 = factor(c(
"やぶきた", "ごこう", "さみどり", "おくみどり", "うじひかり", "こまかげ",
"ごこう", "こまかげ", "やぶきた", "うじひかり", "おくみどり", "さみどり",
"おくみどり", "さみどり", "うじひかり", "こまかげ", "やぶきた", "ごこう",
"うじひかり", "やぶきた", "こまかげ", "ごこう", "さみどり", "おくみどり")),
# 区画ごとの荒茶収量(kg/10アール)
収量 = c(
92, 88, 79, 74, 101, 96,
85, 90, 98, 103, 77, 82,
80, 83, 108, 99, 104, 88,
111, 116, 102, 95, 90, 85),
# データ品質のフラグ(0=良好、1=要確認、2=不良)
品質 = c(
0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0))
[圃場試験の区画配置図の描画]:desplotコマンド
区画の位置と測定値を格子状の地図として描画し、ブロックや処理区の枠線、セル内のラベル、データ品質の斜線表示を重ねます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | データフレーム | なし |
| form | 「測定値 ~ 横位置 * 縦位置 | 群」の形式の数式。横位置と縦位置は数値 | formula(NULL ~ x + y) |
| num | セル内に数値コードとして表示する列名(クオートなし) | NULL |
| num.string | セル内に数値コードとして表示する列名(文字列) | NULL |
| col | セル内テキストの色分けに使う列名(クオートなし) | NULL |
| col.string | セル内テキストの色分けに使う列名(文字列) | NULL |
| text | セル内に表示するテキストの列名(クオートなし) | NULL |
| text.string | セル内に表示するテキストの列名(文字列) | NULL |
| out1 | 第1レベルの枠線を描く単位の列名(クオートなし) | NULL |
| out1.string | 第1レベルの枠線を描く単位の列名(文字列) | NULL |
| out2 | 第2レベルの枠線を描く単位の列名(クオートなし) | NULL |
| out2.string | 第2レベルの枠線を描く単位の列名(文字列) | NULL |
| dq | データ品質の悪い区画を斜線で示す列名(クオートなし。1で片斜線、2で×印) | NULL |
| dq.string | データ品質の悪い区画を斜線で示す列名(文字列) | NULL |
| col.regions | セルの塗りつぶしに使う色 | RedGrayBlue |
| col.text | テキストに使う色のベクトル | NULL |
| text.levels | 水準名の代わりに表示する文字列 | NULL |
| out1.gpar | 第1レベルの枠線のグラフィックスパラメータ。list() または grid の gpar() | list(col = “black”, lwd = 3) |
| out2.gpar | 第2レベルの枠線のグラフィックスパラメータ | list(col = “yellow”, lwd = 1, lty = 1) |
| at | カラーリボンの区切り位置。指定すると midpoint は NULL になる | なし |
| midpoint | カラーリボンの中央を求める方法。”midrange”、”median”、または数値 | “median” |
| ticks | 軸の目盛りとラベルの指定。FALSE、TRUE、”all”、または list(x=, y=) | FALSE |
| panel.border | TRUE でパネルの外枠と軸線を描画、FALSE で省略 | TRUE |
| flip | TRUE で図を上下反転 | FALSE |
| main | 図の主題 | NULL |
| xlab | x軸のラベル | なし |
| ylab | y軸のラベル | なし |
| shorten | 凡例テキストの短縮方法。”abb”、”sub”、”no”、FALSE | “abb” |
| show.key | TRUE で左側にキーを表示(カラーリボンとは別) | TRUE |
| key.cex | 左側キーの文字の拡大率 | なし |
| cex | セル内テキスト・数値の拡大率 | 0.4 |
| strip.cex | ストリップ見出しの文字の拡大率 | 0.75 |
| aspect | 縦横比。実寸の地図にするなら 縦の長さ/横の長さ を渡す | NULL |
| subset | データを絞り込む論理ベクトルを返す式 | TRUE |
| gg | TRUE で desplot() を ggdesplot() に切り替える | FALSE |
| … | その他の引数 | なし |
# 収量を色分けし、ブロックの枠線と品種名を重ねた区画配置図
desplot(茶園, 収量 ~ 列 * 行,
# ブロックの外周に枠線を描く
out1 = ブロック,
# 各区画に品種名を表示(凡例は短縮しない)
text = 品種, shorten = "no", cex = 0.9,
main = "和束町 宇治茶 品種試験")
# 収量の区切り位置を手動指定し、品質の悪い区画を斜線で表示
desplot(茶園, 収量 ~ 列 * 行,
out1 = ブロック,
# 品質フラグの列を斜線表示に使う
dq = 品質,
# カラーリボンの区切りを4段階に固定
at = c(70, 85, 100, 115), midpoint = NULL)
# ggplot2の体系で同じ図を描画(gg = TRUE でも同じ)
ggdesplot(茶園, 収量 ~ 列 * 行,
out1 = ブロック, text = 品種, shorten = "no",
aspect = 1)
# すべての整数座標に目盛りを振り、パネルの外枠を消して上下反転
desplot(茶園, 収量 ~ 列 * 行,
out1 = ブロック,
ticks = "all", panel.border = FALSE, flip = TRUE)・収量を色分けし、ブロックの枠線と品種名を重ねた区画配置図

・収量の区切り位置を手動指定し、品質の悪い区画を斜線で表示

・ggplot2の体系で同じ図を描画(gg = TRUE でも同じ)

・すべての整数座標に目盛りを振り、パネルの外枠を消して上下反転

[隣り合う区画グループの境界線の描画]:geom_tileborderコマンド
ggplot2のタイル図に対して、指定した列の値が変わる境目だけに線を描き足すレイヤーです。ブロックや処理区のまとまりを強調する際に使用します。
| オプション | 意味 | 初期値 |
|---|---|---|
| mapping | aes() で作成した審美的属性の対応づけ | NULL |
| data | このレイヤーで表示するデータ | NULL |
| geom | データの描画に使う幾何オブジェクト | “segment” |
| position | データに適用する位置調整 | “identity” |
| na.rm | FALSE で欠損値を警告付きで除去、TRUE で警告なしで除去 | TRUE |
| show.legend | このレイヤーを凡例に含めるか。NA、FALSE、TRUE | NA |
| inherit.aes | FALSE で既定の審美的属性を継承せず上書き | TRUE |
| … | layer() の params に渡すその他の引数 | なし |
# ブロックごとにタイルを塗り分け、その境目に線を引く
ggplot(茶園, aes(x = 列, y = 行)) +
# ブロックを色分けしたタイル
geom_tile(aes(fill = ブロック)) +
# 隣り合うブロックの境目だけに線を描く
geom_tileborder(aes(group = 1, grp = ブロック), lwd = 1.2)
[赤・灰・青のグラデーション配色の生成]:RedGrayBlueコマンド
低い値を赤、中間を灰色、高い値を青で表す発散型のカラーパレットを、指定した段階数で生成します。desplotの塗り色の既定値でもあります。
| オプション | 意味 | 初期値 |
|---|---|---|
| n | 生成する色数 | なし |
# 11段階の赤・灰・青パレットを生成
配色 <- RedGrayBlue(11)
# 生成した配色をグラデーション帯として確認
image(matrix(1:11, ncol = 1), col = 配色, axes = FALSE)
# 生成した配色を区画配置図の塗り色に指定
desplot(茶園, 収量 ~ 列 * 行, col.regions = 配色, out1 = ブロック)・生成した配色をグラデーション帯として確認

・生成した配色を区画配置図の塗り色に指定

この記事が誰かの役に立ちますように。