Rで解析:色を自由自在に操る「colorplane」パッケージの紹介
数値の大小を色の違いで表現すると、データの傾向が直感的に伝わりやすくなります。しかし、値の範囲に応じた配色の割り当てや、透明度をともなう色の重ね合わせを自前で実装するには手間がかかります。
「colorplane」パッケージは、数値と色の対応付け、および色平面どうしの合成を簡単におこなえます。連続値を配色に対応付けるクラス、カテゴリと色を一対一で対応付けるクラス、単一色・16進数のカラーコード・RGB行列をそれぞれ保持するクラスが収録されています。
数値から色への変換では、色を割り当てる値の範囲の指定や、指定した区間を透明にするしきい値の設定が可能です。
また、アルファ合成による二つの色平面の重ね合わせや、色名から16進数のカラーコードへの変換、16進数のカラーコードとRGB行列の相互変換も可能です。本パッケージの利用で、独自の配色ルールにもとづく可視化を効率的に作成できるのではないかと考えます。
パッケージバージョンは0.6.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("colorplane")
# パッケージの読み込み
library("colorplane")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
本パッケージはS4クラスで構成されており、「色の割り当て方を定義するクラス」と「割り当て結果の色を保持するクラス」に分かれています。前者はIntensityColorPlane(連続値と配色の対応)とDiscreteColorPlane(カテゴリと色の対応)、後者はHexColorPlane(16進数のカラーコード)とRGBColorPlane(RGB行列)です。定義したクラスをmap_colorsコマンドに渡すと実際の色が生成され、生成した色平面はas_rgbコマンドやas_hexcolコマンドで表現形式を相互に変換できます。さらに、blend_colorsコマンドで二つの色平面をアルファ合成し、重ね合わせた色を得られます。
本記事では、架空の展示会場における区画別の混雑度データを作成し、記事全体を通して使用します。コマンド例を実行するときは下記のコードを実行してください。
# 架空の展示会場の区画名を作成
kukaku <- c("A-1", "A-2", "A-3", "B-1", "B-2", "B-3", "C-1", "C-2")
# 各区画の混雑度(0から100の百分率)を作成
konzatsu <- c(12, 45, 78, 33, 91, 5, 60, 24)
# 区画ごとの混雑判定を4段階のカテゴリで作成
hantei <- c("空き", "やや混雑", "混雑", "空き",
"満員", "空き", "やや混雑", "空き")数値ベクトルと配色を対応付けた色平面を保持:IntensityColorPlaneコマンド
本コマンドは対応付けの定義を保持するだけで、この時点では色は生成されません。定義のカラーパレットはmap_colorsコマンドで生成します。
| オプション | 意味 | 初期値 |
|---|---|---|
| intensity | 色に対応付ける数値ベクトル | なし |
| cols | 割り当てに使用する16進数のカラーコードのベクトル | rainbow(255) |
| alpha | 0から1の範囲で指定する不透明度 | 1 |
# 混雑度と10段階の配色を対応付けた色平面を定義
teigi <- IntensityColorPlane(intensity = konzatsu,
cols = heat.colors(10),
alpha = 0.8)
# 保持されている数値を確認
teigi@intensity
[1] 12 45 78 33 91 5 60 24
# 保持されている配色を確認
teigi@colmap
[1] "#FF0000" "#FF2400" "#FF4900" "#FF6D00" "#FF9200" "#FFB600" "#FFDB00" "#FFFF00" "#FFFF40" "#FFFFBF"色平面の定義から実際の色を生成:map_colorsコマンド
irangeを省略すると、対象データの最小値と最大値が配色の両端に割り当てられます。
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 色を生成する対象の色平面 | なし |
| values | DiscreteColorPlaneの辞書を引くための値 | なし |
| alpha | 0から1の範囲で指定する不透明度の倍率、NULLの場合はオブジェクトが保持する値を使用 | NULL |
| threshold | 透明にする区間を指定する2要素の数値ベクトル | NULL |
| irange | 配色を割り当てる値の最小値と最大値 | NULL |
# データの最小値と最大値を配色の両端に割り当て
iro_auto <- map_colors(teigi)
# 生成された16進数のカラーコードを確認
iro_auto@clr
[1] "#FF0000" "#FF9200" "#FFFF00" "#FF4900" "#FFFFBF" "#FF0000" "#FFB600" "#FF2400"
# 0から100を配色の両端として割り当て
iro_fix <- map_colors(teigi, irange = c(0, 100))
# 混雑度の絶対値にもとづく色を確認
iro_fix@clr
[1] "#FF2400" "#FF9200" "#FFFF00" "#FF4900" "#FFFF40" "#FF0000" "#FFB600" "#FF4900"thresholdオプションを指定すると、指定区間に入る値の不透明度が0になり、得られる値はRGBColorPlaneの形式になります。なお、alphaが色に反映されるのはthresholdオプションを指定した場合のみです。
# 混雑度が0より大きく40未満の区画を透明にする
iro_th <- map_colors(teigi, threshold = c(0, 40), irange = c(0, 100))
# RGBと不透明度の行列を確認
iro_th@clr
red green blue alpha
[1,] 255 36 0 0
[2,] 255 146 0 204
[3,] 255 255 0 204
[4,] 255 73 0 0
[5,] 255 255 64 204
[6,] 255 0 0 0
[7,] 255 182 0 204
[8,] 255 73 0 0
色名を16進数のカラーコードに変換:col2hexコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| cname | 変換する色名のベクトル | なし |
| alpha | 0から1の範囲で指定する不透明度 | 1 |
# 混雑判定に割り当てる色名を8桁のカラーコードに変換
col2hex(c("steelblue", "gold", "orangered", "purple"))
[1] "#4682B4FF" "#FFD700FF" "#FF4500FF" "#A020F0FF"
# 不透明度50%を指定して変換
col2hex("steelblue", alpha = 0.5)
[1] "#4682B480"カテゴリと色を一対一で対応付けた色平面を作成:DiscreteColorPlaneコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| lookup | カテゴリ名を要素名とし、16進数のカラーコードを値とする名前付きリスト | なし |
# カテゴリに対応する色を作成
iro_list <- as.list(col2hex(c("steelblue", "gold", "orangered", "purple")))
# 混雑判定のカテゴリ名を要素名として付与
names(iro_list) <- c("空き", "やや混雑", "混雑", "満員")
# 辞書型の色平面を定義
jisho <- DiscreteColorPlane(lookup = iro_list)
# 混雑判定のベクトルを色に変換
map_colors(jisho, values = hantei)@clr
空き やや混雑 混雑 空き 満員 空き やや混雑 空き
"#4682B4FF" "#FFD700FF" "#FF4500FF" "#4682B4FF" "#A020F0FF" "#4682B4FF" "#FFD700FF" "#4682B4FF"
# 辞書にない値は完全に透明な色が割り当てられる
map_colors(jisho, values = c("空き", "未計測"))@clr
空き <NA>
"#4682B4FF" "#00000000" 16進数のカラーコードから色平面を作成:HexColorPlaneコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| clr | 16進数のカラーコードのベクトル | なし |
# 会場図の下地となる白色の色平面を作成
shitaji <- HexColorPlane(clr = rep("#FFFFFFFF", length(kukaku)))
# 先頭3要素を確認
shitaji@clr[1:3]
[1] "#FFFFFFFF" "#FFFFFFFF" "#FFFFFFFF"RGBの数値行列から色平面を作成:RGBColorPlaneコマンド
4列目を省略した3列の行列を渡した場合は、不透明度として255が補われます。
| オプション | 意味 | 初期値 |
|---|---|---|
| clr | 1列目に赤、2列目に緑、3列目に青、4列目に不透明度を並べた0から255の数値行列 | なし |
# 会場案内図で使用する3色をRGBの数値行列として作成
rgb_gyoretsu <- rbind(c(70, 130, 180),
c(255, 165, 0),
c(46, 139, 87))
# RGB行列から色平面を作成
rgb_men <- RGBColorPlane(clr = rgb_gyoretsu)
# 不透明度の列が補われたことを確認
rgb_men@clr
[,1] [,2] [,3] [,4]
[1,] 70 130 180 255
[2,] 255 165 0 255
[3,] 46 139 87 255
単一の色を保持する色平面を作成:ConstantColorPlaneコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| clr | 長さ1の16進数のカラーコード | なし |
# 警戒表示に用いる半透明の赤色を単一色の色平面として作成
keikai <- ConstantColorPlane(clr = "#FF000080")
# 保持されている色を確認
keikai@clr
[1] "#FF000080"色平面をRGBの数値行列に変換:as_rgbコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 変換する対象の色平面 | なし |
# 混雑度から生成した色をRGBと不透明度の行列に変換
as_rgb(iro_fix)
red green blue alpha
[1,] 255 36 0 255
[2,] 255 146 0 255
[3,] 255 255 0 255
[4,] 255 73 0 255
[5,] 255 255 64 255
[6,] 255 0 0 255
[7,] 255 182 0 255
[8,] 255 73 0 255色平面を16進数のカラーコードに変換:as_hexcolコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 変換する対象の色平面 | なし |
# RGB行列の色平面を16進数のカラーコードに変換
as_hexcol(rgb_men)
[1] "#4682B4FF" "#FFA500FF" "#2E8B57FF"色平面から不透明度の値を取り出す:alpha_channelコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 不透明度を取り出す対象の色平面 | なし |
| … | メソッドに渡す追加の引数 | なし |
| normalize | 255で除算して0から1の範囲に変換 | TRUE |
戻り値は数値ベクトルです。しきい値処理で透明になった区画の確認に利用できます。
# しきい値処理をおこなった色平面の不透明度を0から1で取得
alpha_channel(iro_th)
[1] 0.0 0.8 0.8 0.0 0.8 0.0 0.8 0.0
# 0から255のまま取得
alpha_channel(iro_th, normalize = FALSE)
[1] 0 204 204 0 204 0 204 0二つの色平面をアルファ合成して重ね合わせ:blend_colorsコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| bottom | 下側に配置する色平面 | なし |
| top | 上側に配置する色平面 | なし |
| alpha | 上側の色平面に乗算する0から1の不透明度 | 1 |
合成はアルファコンポジットのover演算にもとづきます。戻り値はRGBColorPlaneです。
# 白色の下地に混雑度の色を60%の不透明度で重ね合わせ
gousei <- blend_colors(bottom = shitaji, top = iro_fix, alpha = 0.6)
# 合成後のRGB値を小数第1位まで確認
round(gousei@clr, 1)
red green blue
[1,] 255 123.6 102.0 255
[2,] 255 189.6 102.0 255
[3,] 255 255.0 102.0 255
[4,] 255 145.8 102.0 255
[5,] 255 255.0 140.4 255
[6,] 255 102.0 102.0 255
[7,] 255 211.2 102.0 255
[8,] 255 145.8 102.0 255単一色の色平面を上側に指定すると、全区画に同一の色を重ねられます。
# 混雑度の色に警戒色を重ね合わせ
keikai_gousei <- blend_colors(bottom = iro_fix, top = keikai, alpha = 1)
# 合成結果を16進数のカラーコードで確認
as_hexcol(RGBColorPlane(round(keikai_gousei@clr)))
[1] "#FF1200FF" "#FF4900FF" "#FF7F00FF" "#FF2400FF" "#FF7F20FF" "#FF0000FF"
[7] "#FF5B00FF" "#FF2400FF"
混雑度マップを作図する応用例
生成した色はベクトルとして取り出せるため、標準作図関数の色指定にそのまま渡せます。ここでは合成した色で、展示会場の区画図をプロットします。
# 白色の下地に混雑度の色を重ね合わせて淡い配色を作成
haikei <- blend_colors(bottom = shitaji, top = iro_fix, alpha = 0.6)
# 作図に渡すため16進数のカラーコードに変換
kukaku_iro <- as_hexcol(RGBColorPlane(round(haikei@clr)))
# 区画を4列2行に配置する座標を作成
x_zahyo <- rep(1:4, times = 2)
y_zahyo <- rep(2:1, each = 4)
# 描画領域のみを準備
plot(NA, xlim = c(0.5, 4.5), ylim = c(0.5, 2.5), asp = 1,
xlab = "", ylab = "", axes = FALSE,
main = "展示会場の区画別混雑度")
# 区画を四角形で描画し混雑度の色で塗り分け
rect(x_zahyo - 0.45, y_zahyo - 0.45, x_zahyo + 0.45, y_zahyo + 0.45,
col = kukaku_iro, border = "gray40")
# 区画名と混雑度を重ねて表示
text(x_zahyo, y_zahyo,
labels = paste0(kukaku, "\n", konzatsu, "%"), cex = 0.9)
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。