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

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

Rで解析:科学的なカラーパレットを設計する「palettecore」パッケージ

データ可視化では、配色の違いが図の読み取りやすさを左右します。しかし、階調の間隔をそろえた配色を用意し、色覚特性や白黒印刷での見え方まで確かめるには手間がかかります。

本パッケージは、1つの種色を起点とし、カラーパレットを作成します。OKLCH色空間上での連続型・発散型・カテゴリ型パレットの生成、CIEDE2000による色差の算出、WCAGにもとづくコントラスト比の算出が可能です。また、3種類の色覚特性のシミュレーションや、sRGB色域からの外れ量の確認も可能です。

本パッケージの利用で、配色の妥当性を数値で確かめながら図を作成できるのではないかと考えます。

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

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

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

# パッケージのインストール
install.packages("palettecore")

# パッケージの読み込み
library("palettecore")

# カラーパレットを表示 scales::show_col()を利用
# install.packages("scales")
library("scales")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。

  • OKLCHはOklab色彩空間を円柱座標系(明度・彩度・色相)で表現。
  • CIEDE2000は国際照明委員会が策定する色差計算式。
  • WCAGはウェブコンテンツのアクセシビリティに関するガイドライン。

本パッケージの色覚特性のシミュレーションはMachadoらのモデルにより重度(severity 1.0)で行われます。なお本パッケージが用いる色差のしきい値はパッケージ独自の設計ルールであり、公的に確立されたアクセシビリティの基準値ではない点に注意してください。

[カラーパレットの生成]:generate_paletteコマンド

単一の種色から、データ可視化に適したカラーパレットを生成します。色数は初期値で8色です。

オプション意味初期値
seedHEX形式で種色を指定なし
n色の数を2から24の範囲で指定8L
kind“sequential”、”diverging”、”categorical”または”helix”を指定“sequential”
background想定する背景色をHEX形式で指定“#FFFFFF”
use“data_fill”、”text”、”line”または”UI”を指定“data_fill”
thresholds色差の下限の初期値を上書きする名前付きリストを指定NULL
anchor“path”または”exact”を指定、”categorical”では常に種色を含む“path”
vividness0で種色に忠実、1で彩度を色域端まで引き上げる度合いを指定0
rotations“helix”専用で明度範囲における色相の回転数を指定1

架空の観測地点における積雪深の階級に、連続型の配色を割り当てます。

# 架空の観測地点における積雪深の階級名を用意
sekisetsu <- c("0-20cm", "20-40cm", "40-60cm", "60-80cm", "80-100cm")

# 種色から連続型の配色を5色生成
pal_seq <- generate_palette("#1F6F8B", n = 5, kind = "sequential")

# カラーパレットの確認
scales::show_col(pal_seq$hexes)

# 結果概要を表示
pal_seq

# 生成された配色の16進カラーコードを表示
pal_seq$hexes
sequential palette from #1F6F8B 
#DDF5FF #7DCAE9 #3093B6 #006582 #093341 

# 明度が単調に変化しているかを確認
pal_seq$diagnostics$lightness_monotonic
[1] TRUE

# 背景色に対するコントラスト比を小数第2位まで表示
round(pal_seq$diagnostics$contrast_vs_background, 2)
#DDF5FF #7DCAE9 #3093B6 #006582 #093341 
1.13    1.83    3.51    6.60   13.45

# 白黒変換したときの輝度を小数第3位まで表示
round(pal_seq$diagnostics$greyscale_luminance, 3)
#DDF5FF #7DCAE9 #3093B6 #006582 #093341 
0.879   0.525   0.249   0.109   0.028 

# sRGB色域に収まっているかの判定を表示
pal_seq$diagnostics$srgb_gamut
[1] "all in gamut (chroma clamped where needed)"

# 監査で検出された警告を表示
pal_seq$warnings
character(0)

# 階級名と配色を対応付けて表示
setNames(pal_seq$hexes, sekisetsu)
0-20cm   20-40cm   40-60cm   60-80cm  80-100cm 
"#DDF5FF" "#7DCAE9" "#3093B6" "#006582" "#093341" 

・カラーパレットの確認

[HEXからOKLCHへの変換]:hex_to_oklchコマンド

16進カラーコードを、OKLCHの明度・彩度・色相に変換します。

オプション意味初期値
hex_strHEX形式で色を指定なし
# 色を用意
kanban <- "#1F6F8B"

# HEXをOKLCHの明度・彩度・色相に変換
lch <- hex_to_oklch(kanban)

# 変換結果を小数第4位まで表示
round(lch, 4)
[1]   0.5076   0.0860 226.2110

[OKLCHからHEXへの変換]:oklch_to_hexコマンド

OKLCHの値を16進カラーコードに変換します。明度だけを変えて明るい派生色を作る用途に利用できます。

オプション意味初期値
lch明度・彩度・色相の順に並べた長さ3の数値ベクトルを指定なし
# OKLCHの値をHEXに戻す
oklch_to_hex(lch)
[1] "#1F6F8B"

# 明度だけを0.15上げた派生色をHEXで取得
oklch_to_hex(c(lch[1] + 0.15, lch[2], lch[3]))
[1] "#529CBA"

[HEXからsRGBへの変換]:hex_to_srgbコマンド

16進カラーコードを、0から1の範囲のsRGB値に変換します。本パッケージの色差やコントラスト比の算出はsRGB値を入力に取るため、その前処理として利用します。

オプション意味初期値
hex_strHEX形式で色を指定、3桁と6桁の両方に対応なし
# HEXを0から1の範囲のsRGB値に変換
rgb_kanban <- hex_to_srgb(kanban)

# 変換結果を小数第4位まで表示
round(rgb_kanban, 4)
[1] 0.1216 0.4353 0.5451

[sRGBからHEXへの変換]:srgb_to_hexコマンド

0から1の範囲のsRGB値を、16進カラーコードに変換します。

オプション意味初期値
rgb0から1の範囲のsRGB値を並べた長さ3の数値ベクトルを指定なし
# sRGB値をHEXに戻す
srgb_to_hex(rgb_kanban)
[1] "#1F6F8B"

# 任意のsRGB値をHEXに変換
srgb_to_hex(c(0.85, 0.42, 0.23))
[1] "#D96B3B"

[色差の算出]:ciede2000コマンド

2色間の色差をCIEDE2000で算出します。値が大きいほど人の目には異なる色として認識されます。

オプション意味初期値
rgb10から1の範囲のsRGB値を並べた長さ3の数値ベクトルを指定なし
rgb2比較対象となる同形式の数値ベクトルを指定なし
# 参考色、補助色、強調色を並べて用意
iro <- c("#1F6F8B", "#2F91BD", "#D96C3B")

# 参考色と補助色の色差を算出
ciede2000(hex_to_srgb(iro[1]), hex_to_srgb(iro[2]))
[1] 13.62786

# 参考色と強調色の色差を算出
ciede2000(hex_to_srgb(iro[1]), hex_to_srgb(iro[3]))
[1] 49.35719

[コントラスト比の算出]:contrast_ratioコマンド

2色間のコントラスト比をWCAGの定義で算出します。

オプション意味初期値
rgb10から1の範囲のsRGB値を並べた長さ3の数値ベクトルを指定なし
rgb2比較対象となる同形式の数値ベクトルを指定なし
# 参考色と白背景のコントラスト比を算出
contrast_ratio(hex_to_srgb("#1F6F8B"), hex_to_srgb("#FFFFFF"))
[1] 5.668241

# 参考色と暗い背景のコントラスト比を算出
contrast_ratio(hex_to_srgb("#1F6F8B"), hex_to_srgb("#1A1A1A"))
[1] 3.070499

[色覚特性のシミュレーション]:simulate_cvdコマンド

P型・D型・T型の色覚特性における色の見え方をシミュレーションします。

オプション意味初期値
rgb0から1の範囲のsRGB値を並べた長さ3の数値ベクトルを指定なし
condition“protanopia”、”deuteranopia”または”tritanopia”を指定なし
# 強調色をP型色覚でシミュレーションし小数第4位まで表示
round(simulate_cvd(hex_to_srgb("#D96C3B"), "protanopia"), 4)
[1] 0.5416 0.4864 0.2094

# シミュレーション結果をHEXに変換して表示
srgb_to_hex(simulate_cvd(hex_to_srgb("#D96C3B"), "protanopia"))
[1] "#8A7C35"

# 緑系の色をD型色覚でシミュレーション
srgb_to_hex(simulate_cvd(hex_to_srgb("#229271"), "deuteranopia"))
[1] "#807D73"

# 看板の色をT型色覚でシミュレーション
srgb_to_hex(simulate_cvd(hex_to_srgb("#1F6F8B"), "tritanopia"))
[1] "#007778"

[色域外れ量の算出]:out_of_gamut_excursionコマンド

色覚特性のシミュレーション後の色が、sRGB色域からどれだけ外れるかを算出します。0であれば色域内に収まっています。

オプション意味初期値
rgb0から1の範囲のsRGB値を並べた長さ3の数値ベクトルを指定なし
condition“protanopia”、”deuteranopia”または”tritanopia”を指定なし
# 強調色をD型色覚で変換した際の色域外れ量を算出
out_of_gamut_excursion(hex_to_srgb("#D96C3B"), "deuteranopia")
[1] 0

# 彩度の高い緑をP型色覚で変換した際の色域外れ量を算出
out_of_gamut_excursion(hex_to_srgb("#00FF7F"), "protanopia")
[1] 0.009103709

[最大彩度の探索]:max_chromaコマンド

指定した明度と色相で、sRGB色域に収まる最大の彩度を二分探索で求めます。

オプション意味初期値
LOKLabの明度を0から1の範囲で指定なし
HOKLCHの色相を度単位で指定なし
c_hi彩度の探索上限を指定0.4
tol探索の許容誤差を指定1e-04
# 参考色の明度と色相で表現できる最大彩度を算出
round(max_chroma(0.5076, 226.21), 4)
[1] 0.0972

# 明度を0.85に上げた場合の最大彩度を算出
round(max_chroma(0.85, 226.21), 4)
[1] 0.0979

# 探索上限と許容誤差を指定して最大彩度を算出
round(max_chroma(0.5076, 226.21, c_hi = 0.2, tol = 1e-6), 6)
[1] 0.097256

[塗り分けへの適用]:scale_fill_accessibleコマンド

ggplot2の離散的な塗り分けスケールとして、種色から生成した配色を適用します。

オプション意味初期値
seedHEX形式で種色を指定なし
kindパレットの種類を指定、離散スケールでは”categorical”が基本“categorical”
background、use、thresholdsなどgenerate_paletteへ渡す引数を指定なし
# データ例の作成
uriage <- data.frame(
  bunrui = c("食品", "飲料", "日用品", "衣料品", "雑貨"),
  kingaku = c(320, 240, 180, 150, 110))

# プロット
ggplot(uriage, aes(x = bunrui, y = kingaku, fill = bunrui)) +
  geom_col() +
  scale_fill_accessible("#D96C3B", kind = "categorical") +
  labs(
    x = "商品分類",
    y = "売上(万円)",
    fill = "商品分類")

[線と点への適用]:scale_colour_accessibleコマンド

ggplot2の離散的な色スケールとして、種色から生成した配色を適用します。scale_color_accessibleも同じです。

オプション意味初期値
seedHEX形式で種色を指定なし
kindパレットの種類を指定、離散スケールでは”categorical”が基本“categorical”
background、use、thresholdsなどgenerate_paletteへ渡す引数を指定なし
# プロット
ggplot(uriage, aes(x = bunrui, y = kingaku, colour = bunrui)) +
  geom_point(size = 8) +
  scale_colour_accessible("#1F6F8B", kind = "categorical") +
  labs(x = "商品分類", y = "売上(万円)", colour = "商品分類")


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

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