本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:色を自由自在に操る「colorplane」パッケージの紹介

数値の大小を色の違いで表現すると、データの傾向が直感的に伝わりやすくなります。しかし、値の範囲に応じた配色の割り当てや、透明度をともなう色の重ね合わせを自前で実装するには手間がかかります。

「colorplane」パッケージは、数値と色の対応付け、および色平面どうしの合成を簡単におこなえます。連続値を配色に対応付けるクラス、カテゴリと色を一対一で対応付けるクラス、単一色・16進数のカラーコード・RGB行列をそれぞれ保持するクラスが収録されています。

数値から色への変換では、色を割り当てる値の範囲の指定や、指定した区間を透明にするしきい値の設定が可能です。

また、アルファ合成による二つの色平面の重ね合わせや、色名から16進数のカラーコードへの変換、16進数のカラーコードとRGB行列の相互変換も可能です。本パッケージの利用で、独自の配色ルールにもとづく可視化を効率的に作成できるのではないかと考えます。

パッケージバージョンは0.6.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
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)
alpha0から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色を生成する対象の色平面なし
valuesDiscreteColorPlaneの辞書を引くための値なし
alpha0から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変換する色名のベクトルなし
alpha0から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コマンド

オプション意味初期値
clr16進数のカラーコードのベクトルなし
# 会場図の下地となる白色の色平面を作成
shitaji <- HexColorPlane(clr = rep("#FFFFFFFF", length(kukaku)))

# 先頭3要素を確認
shitaji@clr[1:3]
[1] "#FFFFFFFF" "#FFFFFFFF" "#FFFFFFFF"

RGBの数値行列から色平面を作成:RGBColorPlaneコマンド

4列目を省略した3列の行列を渡した場合は、不透明度として255が補われます。

オプション意味初期値
clr1列目に赤、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不透明度を取り出す対象の色平面なし
メソッドに渡す追加の引数なし
normalize255で除算して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)


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

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。