Rで解析:カラーパレットの生成と調整「colorify」パッケージ
グラフの配色は、伝えたい情報の見え方を大きく左右します。色数や明るさをそろえるだけでも、図の印象は整理されて伝わりやすくなります。しかし、配色を決める作業には手間がかかります。パレットを探し、必要な色数に合わせ、明るさや彩度を少しずつ調整するという作業を繰り返すことになるためです。
本パッケージは、カラーパレットの生成と調整をひとつのコマンドで可能です。指定した色数のパレットを生成するコマンド、色と色の間を補間してグラデーションを作成するコマンド、収録パレットを一覧表示するコマンドが収録されています。色相・彩度・明度と、赤・緑・青の各成分について、係数による倍率調整と加算による調整が可能です。特定の色を固定したまま残りの色だけを調整することや、値の範囲に色を対応付けるグラデーション関数の作成も可能です。また、ggplot2のスケール関数への連携や、色コードのrgba形式への変換も可能です。
収録されているパレットには、知覚的な変化が均等になるように設計されたviridis系や、色覚の多様性に配慮したOkabe-Ito、RColorBrewer由来のパレットが含まれます。本パッケージの利用で、配色の検討から作図までを一つの流れでおこなえるのではないかと考えます。
パッケージバージョンは1.0.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("colorify")
# パッケージの読み込み
library("colorify")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
オプション名の末尾は調整方法を表します。fで終わるオプション(hf、rfなど)は元の値に掛ける係数、vで終わるオプション(hv、rvなど)は元の値に加算する値です。minとmaxで終わるオプションは、これらの調整結果を丸める下限と上限で、fまたはvの調整を指定しない場合は効果がありません。
作業の流れは、display_palettesコマンドで収録パレットを確認し、colorifyコマンドで色を生成・調整します。作成した配色は、scale_color_colorifyコマンドやscale_fill_colorifyコマンドでggplot2の作図に適応可能です。
パレットの生成と色調の調整:colorifyコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| n | 取得する色数を指定、指定した色より多い分は生成される | NULL |
| colors | パレット名、Rの色名、色コードを組み合わせて指定 | character(0) |
| colours | colorsの別名(英国表記) | colors |
| colors_lock | 調整対象から除外する色の位置を論理値または数値で指定 | NULL |
| colors_names | 戻り値に付与する色名を指定 | character(0) |
| colors_map | 色を対応付ける値のベクトルを指定、指定時は変換関数を返す | numeric(0) |
| nn | 出力するグラデーションの色数を指定、Infで関数を返す | n |
| hf | 色相に掛ける係数を指定 | 1 |
| sf | 彩度に掛ける係数を指定 | 1 |
| lf | 明度に掛ける係数を指定 | 1 |
| rf | 赤成分に掛ける係数を指定 | 1 |
| gf | 緑成分に掛ける係数を指定 | 1 |
| bf | 青成分に掛ける係数を指定 | 1 |
| hv | 色相に加算する値を指定 | 0 |
| sv | 彩度に加算する値を指定 | 0 |
| lv | 明度に加算する値を指定 | 0 |
| rv | 赤成分に加算する値を指定 | 0L |
| gv | 緑成分に加算する値を指定 | 0L |
| bv | 青成分に加算する値を指定 | 0L |
| hmin | 調整後の色相を丸める下限を指定 | 0L |
| smin | 調整後の彩度を丸める下限を指定 | 0L |
| lmin | 調整後の明度を丸める下限を指定 | 0L |
| rmin | 調整後の赤成分を丸める下限を指定 | 0L |
| gmin | 調整後の緑成分を丸める下限を指定 | 0L |
| bmin | 調整後の青成分を丸める下限を指定 | 0L |
| hmax | 調整後の色相を丸める上限を指定 | 100L |
| smax | 調整後の彩度を丸める上限を指定 | 100L |
| lmax | 調整後の明度を丸める上限を指定 | 100L |
| rmax | 調整後の赤成分を丸める上限を指定 | 100L |
| gmax | 調整後の緑成分を丸める上限を指定 | 100L |
| bmax | 調整後の青成分を丸める上限を指定 | 100L |
| alpha | 色の不透明度を0から1で指定 | 1 |
| seed | 色の生成と並び替えに用いる乱数の種を指定 | 42L |
| order | 色の並び順を指定、-1で逆順、0で乱順、2以上でシフト | 1 |
| plot | 生成した色の描画方法を指定、TRUEで円グラフ、iを含む文字列で帯 | FALSE |
| export | 色情報のCSV出力先を指定、TRUEで作業ディレクトリ | FALSE |
| verbose | 生成した色数のメッセージ表示を指定 | TRUE |
| … | grDevices::colorRampPalette()へ渡す引数を指定 | なし |
# 色ベクトルを作成
wafuIro <- c("#B7282E", "#7EBEA5", "#165E83", "#F8B500", "#FEDFE1")
# 指定した5色を円グラフで確認
colorify(colors = wafuIro, plot = TRUE)
# 5色に3色を追加生成して8色パレットへ拡張
colorify(colors = wafuIro, n = 8, seed = 2025, plot = TRUE)
# 5色を補間して15段階のグラデーションを作成
colorify(colors = wafuIro, nn = 15, plot = TRUE)
# 明度を1.3倍にし、彩度に10を加算して淡い色調へ調整
colorify(colors = wafuIro, lf = 1.3, sv = 10, plot = TRUE)
# 明度の上限を70に丸めたうえで明度を1.5倍に調整
colorify(colors = wafuIro, lf = 1.5, lmax = 70, plot = TRUE)
# 1番目と3番目の色を固定し、残りの明度だけを0.6倍に調整
colorify(colors = wafuIro, colors_lock = c(1, 3), lf = 0.6, plot = TRUE)
# 色の並び順を逆順に変更
colorify(colors = wafuIro, order = -1, plot = TRUE)
# 戻り値に日本語の色名を付与
colorify(colors = wafuIro,
colors_names = c("茜色", "若竹色", "藍色", "山吹色", "桜色"))
茜色 若竹色 藍色 山吹色 桜色
"#B7282EFF" "#7EBEA5FF" "#165E83FF" "#F8B500FF" "#FEDFE1FF" 
なお、colors_mapオプションに値のベクトルを指定すると、色そのものではなく、値を色へ変換する関数となります。数値の範囲に配色を対応付けたい場合に便利だと思います。
# 気温の下限・中間・上限を表す基準値を作成
kionMap <- c(-10, 5, 25)
# 3色を気温の値域へ対応付ける変換関数を作成
kionPal <- colorify(colors = c("#165E83", "#FEDFE1", "#B7282E"),
colors_map = kionMap, space = "Lab")
# -10℃から25℃までを5℃刻みで色コードへ変換
kionPal(seq(-10, 25, by = 5))
[1] "#165E83FF" "#7086A1" "#B7B1C0" "#FEDFE0" "#F1B3B0" "#E18882" "#CE5C56" "#B7282EFF"
<おすすめのRに関する書籍です>
色数を指定して呼び出せるパレット関数の作成:colorify_palコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| colors | パレット名、Rの色名、色コードを組み合わせて指定 | character(0) |
| colors_lock | 調整対象から除外する色の位置を論理値または数値で指定 | NULL |
| hf | 色相に掛ける係数を指定 | 1 |
| sf | 彩度に掛ける係数を指定 | 1 |
| lf | 明度に掛ける係数を指定 | 1 |
| rf | 赤成分に掛ける係数を指定 | 1 |
| gf | 緑成分に掛ける係数を指定 | 1 |
| bf | 青成分に掛ける係数を指定 | 1 |
| hv | 色相に加算する値を指定 | 0 |
| sv | 彩度に加算する値を指定 | 0 |
| lv | 明度に加算する値を指定 | 0 |
| rv | 赤成分に加算する値を指定 | 0L |
| gv | 緑成分に加算する値を指定 | 0L |
| bv | 青成分に加算する値を指定 | 0L |
| hmin | 調整後の色相を丸める下限を指定 | 0L |
| smin | 調整後の彩度を丸める下限を指定 | 0L |
| lmin | 調整後の明度を丸める下限を指定 | 0L |
| rmin | 調整後の赤成分を丸める下限を指定 | 0L |
| gmin | 調整後の緑成分を丸める下限を指定 | 0L |
| bmin | 調整後の青成分を丸める下限を指定 | 0L |
| hmax | 調整後の色相を丸める上限を指定 | 100L |
| smax | 調整後の彩度を丸める上限を指定 | 100L |
| lmax | 調整後の明度を丸める上限を指定 | 100L |
| rmax | 調整後の赤成分を丸める上限を指定 | 100L |
| gmax | 調整後の緑成分を丸める上限を指定 | 100L |
| bmax | 調整後の青成分を丸める上限を指定 | 100L |
| alpha | 色の不透明度を0から1で指定 | 1 |
| seed | 色の生成と並び替えに用いる乱数の種を指定 | 42L |
| order | 色の並び順を指定、-1で逆順、0で乱順、2以上でシフト | 1 |
| verbose | 生成した色数のメッセージ表示を指定 | TRUE |
| … | grDevices::colorRampPalette()へ渡す引数を指定 | なし |
# 和の伝統色から任意の色数を返すパレット関数を作成
wafuPal <- colorify_pal(colors = wafuIro)
# 10色のグラデーションを取得
wafuPal(10)
# 明度を0.8倍に落としたパレット関数を作成
wafuDark <- colorify_pal(colors = wafuIro, lf = 0.8)
# 落ち着いた色調で6色を取得
wafuDark(6)
収録パレットの一覧表示:display_palettesコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| n | 表示する色数を指定 | 10 |
| i_palettes | 表示するパレットを番号の範囲、またはRColorBrewer・Viridis・rainbowなどの名称で指定 | 1:1000 |
| border | 色の区画に境界線を表示するかを指定 | FALSE |
# 収録パレットの先頭6件を8色ずつ境界線付きで表示
display_palettes(n = 8, i_palettes = 1:6, border = TRUE)
# viridis系のパレットのみを表示
display_palettes(i_palettes = "Viridis")
# 名称を指定して2系統のパレットを並べて表示
palInfo <- display_palettes(i_palettes = c("rainbow", "viridis"))
# 戻り値である出典と名称の先頭を確認
head(palInfo)
grDevices grDevices grDevices grDevices grDevices hcl
"Rainbow" "Heat" "Terrain" "Topo" "Cm" "Viridis"・収録パレットの先頭6件を8色ずつ境界線付きで表示

・viridis系のパレットのみを表示

・名称を指定して2系統のパレットを並べて表示

複数パレットの積み上げプロット:colortistryコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| colors_list | colorifyコマンドで生成した色ベクトルのリストを指定 | なし |
| border_color | 区画の境界線の色を指定、NAで境界線なし | NA |
# 段階的に変化させたパレットを格納するリストを用意
colorsList <- list()
# 60段分のパレットを作成し、段ごとに色相と明度の調整量を変化させる
for (i in seq(60)) {
# 各色を120段階へ補間し、4色周期で1色目を固定したまま調整
colorsList[[i]] <- colorify(
colors = wafuIro,
nn = 120,
colors_lock = rep(c(TRUE, FALSE, FALSE, FALSE), 30),
hf = 30 / i,
lf = i / 30,
verbose = FALSE)
}
# 作成したパレットを帯として積み上げてプロット
colortistry(colorsList)
# 各帯に白の境界線を付けてプロット
colortistry(colorsList, border_color = "white")・作成したパレットを帯として積み上げてプロット

・各帯に白の境界線を付けてプロット

<おすすめのRに関する書籍です>
ggplot2の色設定への反映:scale_color_colorifyコマンド
discreteオプションにTRUEを指定する場合は、ggplot2 3.5.0以降が必要です。
| オプション | 意味 | 初期値 |
|---|---|---|
| … | colorifyコマンドやggplot2のスケール関数へ渡す引数を指定 | なし |
| aesthetics | 対象とするaestheticを指定 | “color” |
| discrete | 離散スケールとするかを指定、FALSEで連続スケール | FALSE |
| nn | グラデーションの階調数を指定、Infのときは256となる | Inf |
| n | 基準とする色数を指定、連続スケールでのみ有効 | 2 |
| colors | パレット名、Rの色名、色コードを組み合わせて指定 | character(0) |
| colors_lock | 調整対象から除外する色の位置を論理値または数値で指定 | NULL |
| hf | 色相に掛ける係数を指定 | 1 |
| sf | 彩度に掛ける係数を指定 | 1 |
| lf | 明度に掛ける係数を指定 | 1 |
| rf | 赤成分に掛ける係数を指定 | 1 |
| gf | 緑成分に掛ける係数を指定 | 1 |
| bf | 青成分に掛ける係数を指定 | 1 |
| hv | 色相に加算する値を指定 | 0 |
| sv | 彩度に加算する値を指定 | 0 |
| lv | 明度に加算する値を指定 | 0 |
| rv | 赤成分に加算する値を指定 | 0 |
| gv | 緑成分に加算する値を指定 | 0 |
| bv | 青成分に加算する値を指定 | 0 |
| hmin | 調整後の色相を丸める下限を指定 | 0 |
| smin | 調整後の彩度を丸める下限を指定 | 0 |
| lmin | 調整後の明度を丸める下限を指定 | 0 |
| rmin | 調整後の赤成分を丸める下限を指定 | 0 |
| gmin | 調整後の緑成分を丸める下限を指定 | 0 |
| bmin | 調整後の青成分を丸める下限を指定 | 0 |
| hmax | 調整後の色相を丸める上限を指定 | 100 |
| smax | 調整後の彩度を丸める上限を指定 | 100 |
| lmax | 調整後の明度を丸める上限を指定 | 100 |
| rmax | 調整後の赤成分を丸める上限を指定 | 100 |
| gmax | 調整後の緑成分を丸める上限を指定 | 100 |
| bmax | 調整後の青成分を丸める上限を指定 | 100 |
| alpha | 色の不透明度を0から1で指定 | 1 |
| seed | 色の生成と並び替えに用いる乱数の種を指定 | 42 |
| order | 色の並び順を指定、-1で逆順、0で乱順、2以上でシフト | 1 |
| verbose | 生成した色数のメッセージ表示を指定 | TRUE |
# 温泉施設を想定したデータを作成
onsenDF <- data.frame(
施設名 = c("白浜の湯", "洲本温泉", "十津川源泉", "高島苑", "宮津の宿", "湯浅の湯",
"有田川の湯", "丹波篠山亭", "長浜の露天", "南丹の湯", "五條温泉", "岬温泉"),
標高 = c(120, 340, 580, 210, 460, 730, 90, 300, 45, 510, 650, 395),
湧出量 = c(180, 240, 95, 310, 150, 80, 420, 205, 360, 110, 70, 265),
泉温 = c(42.5, 51.2, 38.0, 60.4, 45.8, 35.2, 58.6, 47.1, 63.0, 40.3, 36.8, 53.4)
)
# 泉温を寒色から暖色への連続的な配色で表現
ggplot(onsenDF, aes(x = 標高, y = 湧出量, colour = 泉温)) +
geom_point(size = 8) +
scale_color_colorify(colors = c("#165E83", "#FEDFE1", "#B7282E"), n = 3) +
theme_bw()
# viridisを明度0.8倍かつ逆順にして落ち着いた配色へ変更
ggplot(onsenDF, aes(x = 標高, y = 湧出量, colour = 泉温)) +
geom_point(size = 8) +
scale_color_colorify(colors = "viridis", n = 5, lf = 0.9, order = -1) +
theme_bw()・泉温を寒色から暖色への連続的な配色で表現

・viridisを明度0.8倍かつ逆順にして落ち着いた配色へ変更

ggplot2の塗りつぶし設定への反映:scale_fill_colorifyコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| … | colorifyコマンドやggplot2のスケール関数へ渡す引数を指定 | なし |
| aesthetics | 対象とするaestheticを指定 | “fill” |
| discrete | 離散スケールとするかを指定、FALSEで連続スケール | FALSE |
| nn | グラデーションの階調数を指定、Infのときは256となる | Inf |
| n | 基準とする色数を指定、連続スケールでのみ有効 | 2 |
| colors | パレット名、Rの色名、色コードを組み合わせて指定 | character(0) |
| colors_lock | 調整対象から除外する色の位置を論理値または数値で指定 | NULL |
| hf | 色相に掛ける係数を指定 | 1 |
| sf | 彩度に掛ける係数を指定 | 1 |
| lf | 明度に掛ける係数を指定 | 1 |
| rf | 赤成分に掛ける係数を指定 | 1 |
| gf | 緑成分に掛ける係数を指定 | 1 |
| bf | 青成分に掛ける係数を指定 | 1 |
| hv | 色相に加算する値を指定 | 0 |
| sv | 彩度に加算する値を指定 | 0 |
| lv | 明度に加算する値を指定 | 0 |
| rv | 赤成分に加算する値を指定 | 0 |
| gv | 緑成分に加算する値を指定 | 0 |
| bv | 青成分に加算する値を指定 | 0 |
| hmin | 調整後の色相を丸める下限を指定 | 0 |
| smin | 調整後の彩度を丸める下限を指定 | 0 |
| lmin | 調整後の明度を丸める下限を指定 | 0 |
| rmin | 調整後の赤成分を丸める下限を指定 | 0 |
| gmin | 調整後の緑成分を丸める下限を指定 | 0 |
| bmin | 調整後の青成分を丸める下限を指定 | 0 |
| hmax | 調整後の色相を丸める上限を指定 | 100 |
| smax | 調整後の彩度を丸める上限を指定 | 100 |
| lmax | 調整後の明度を丸める上限を指定 | 100 |
| rmax | 調整後の赤成分を丸める上限を指定 | 100 |
| gmax | 調整後の緑成分を丸める上限を指定 | 100 |
| bmax | 調整後の青成分を丸める上限を指定 | 100 |
| alpha | 色の不透明度を0から1で指定 | 1 |
| seed | 色の生成と並び替えに用いる乱数の種を指定 | 42 |
| order | 色の並び順を指定、-1で逆順、0で乱順、2以上でシフト | 1 |
| verbose | 生成した色数のメッセージ表示を指定 | TRUE |
# 産地別の出荷量を想定した独自データを作成
kudamonoDF <- data.frame(
産地 = c("有田川", "五條", "丹波篠山", "東近江", "紀の川"),
出荷量 = c(1280, 940, 610, 430, 1150)
)
# 産地ごとに離散スケールで塗り分け
ggplot(kudamonoDF, aes(x = 産地, y = 出荷量, fill = 産地)) +
geom_col() +
scale_fill_colorify(discrete = TRUE, colors = wafuIro) +
theme_bw()
# 泉温の高い順に並べ、連続スケールで塗り分け
ggplot(onsenDF, aes(x = reorder(施設名, -泉温), y = 泉温, fill = 泉温)) +
geom_col() +
scale_fill_colorify(colors = c("#165E83", "#B7282E"), n = 2) +
theme_bw()・産地ごとに離散スケールで塗り分け

・泉温の高い順に並べ、連続スケールで塗り分け

<おすすめのRに関する書籍です>
色コードのrgba形式への変換:hex2rgbaコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| hex | 変換対象の色コードを指定 | なし |
| alpha | 不透明度を0から1で指定、NULLで色コード内の不透明度を使用 | NULL |
# 色をrgba形式へ変換
hex2rgba(wafuIro)
[1] "rgba(183,40,46,1)" "rgba(126,190,165,1)" "rgba(22,94,131,1)" "rgba(248,181,0,1)" "rgba(254,223,225,1)"
# 不透明度0.35を指定して変換
hex2rgba(wafuIro, alpha = 0.35)
[1] "rgba(183,40,46,0.35)" "rgba(126,190,165,0.35)" "rgba(22,94,131,0.35)" "rgba(248,181,0,0.35)" "rgba(254,223,225,0.35)"
# 不透明度を表す2桁を末尾に加えた8桁の色コードを作成
wafuAlpha <- paste0(wafuIro, "80")
# 色コードに含まれる不透明度を反映して変換
hex2rgba(wafuAlpha)
[1] "rgba(183,40,46,0.501960784313725)" "rgba(126,190,165,0.501960784313725)" "rgba(22,94,131,0.501960784313725)" "rgba(248,181,0,0.501960784313725)"
[5] "rgba(254,223,225,0.501960784313725)"HSV値からRGB値への変換:hsv2rgbコマンド
戻り値は行名にr、g、bを持つ行列です。grDevices::rgb2hsv()の戻り値は0から1の尺度であるため、100を掛けてから渡すか、maxColorValueオプションで尺度を合わせます。
| オプション | 意味 | 初期値 |
|---|---|---|
| h | 色相の値を指定 | なし |
| s | 彩度の値を指定 | なし |
| v | 明度の値を指定 | なし |
| maxColorValue | 戻り値とするRGB値の最大値を指定 | 100 |
# 色を0から255のRGB値へ変換
rgbWafu <- grDevices::col2rgb(wafuIro)
# RGB値を0から1のHSV値へ変換
hsvWafu <- grDevices::rgb2hsv(rgbWafu, maxColorValue = 255)
# 明度を0から100の尺度に直したうえで15を加算し、上限100で丸める
vUp <- pmin(hsvWafu["v", ] * 100 + 15, 100)
# 色相・彩度・調整後の明度から0から255のRGB値へ戻す
rgbUp <- hsv2rgb(hsvWafu["h", ] * 100, hsvWafu["s", ] * 100, vUp,
maxColorValue = 255)
# 変換結果を確認
rgbUp
[,1] [,2] [,3] [,4] [,5]
r 221.25000 151.3658 28.42366 255.0000 255.0000
g 48.36066 228.2500 121.44656 186.1089 223.8780
b 55.61475 198.2171 169.25000 0.0000 225.8858
# 変換後のRGB値からカラーパレットを作成
grDevices::rgb(rgbUp["r", ], rgbUp["g", ], rgbUp["b", ], maxColorValue = 255)
[1] "#DD3037" "#97E4C6" "#1C79A9" "#FFBA00" "#FFDFE1"
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。