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色です。
| オプション | 意味 | 初期値 |
|---|---|---|
| seed | HEX形式で種色を指定 | なし |
| 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” |
| vividness | 0で種色に忠実、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_str | HEX形式で色を指定 | なし |
# 色を用意
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_str | HEX形式で色を指定、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進カラーコードに変換します。
| オプション | 意味 | 初期値 |
|---|---|---|
| rgb | 0から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で算出します。値が大きいほど人の目には異なる色として認識されます。
| オプション | 意味 | 初期値 |
|---|---|---|
| rgb1 | 0から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の定義で算出します。
| オプション | 意味 | 初期値 |
|---|---|---|
| rgb1 | 0から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型の色覚特性における色の見え方をシミュレーションします。
| オプション | 意味 | 初期値 |
|---|---|---|
| rgb | 0から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であれば色域内に収まっています。
| オプション | 意味 | 初期値 |
|---|---|---|
| rgb | 0から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色域に収まる最大の彩度を二分探索で求めます。
| オプション | 意味 | 初期値 |
|---|---|---|
| L | OKLabの明度を0から1の範囲で指定 | なし |
| H | OKLCHの色相を度単位で指定 | なし |
| 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の離散的な塗り分けスケールとして、種色から生成した配色を適用します。
| オプション | 意味 | 初期値 |
|---|---|---|
| seed | HEX形式で種色を指定 | なし |
| 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も同じです。
| オプション | 意味 | 初期値 |
|---|---|---|
| seed | HEX形式で種色を指定 | なし |
| 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 = "商品分類")
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。