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

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

Rで解析:カラーパレットの生成と調整「colorify」パッケージ

グラフの配色は、伝えたい情報の見え方を大きく左右します。色数や明るさをそろえるだけでも、図の印象は整理されて伝わりやすくなります。しかし、配色を決める作業には手間がかかります。パレットを探し、必要な色数に合わせ、明るさや彩度を少しずつ調整するという作業を繰り返すことになるためです。

本パッケージは、カラーパレットの生成と調整をひとつのコマンドで可能です。指定した色数のパレットを生成するコマンド、色と色の間を補間してグラデーションを作成するコマンド、収録パレットを一覧表示するコマンドが収録されています。色相・彩度・明度と、赤・緑・青の各成分について、係数による倍率調整と加算による調整が可能です。特定の色を固定したまま残りの色だけを調整することや、値の範囲に色を対応付けるグラデーション関数の作成も可能です。また、ggplot2のスケール関数への連携や、色コードのrgba形式への変換も可能です。

収録されているパレットには、知覚的な変化が均等になるように設計されたviridis系や、色覚の多様性に配慮したOkabe-Ito、RColorBrewer由来のパレットが含まれます。本パッケージの利用で、配色の検討から作図までを一つの流れでおこなえるのではないかと考えます。

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

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

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

# パッケージのインストール
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)
colourscolorsの別名(英国表記)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"

色数を指定して呼び出せるパレット関数の作成: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_listcolorifyコマンドで生成した色ベクトルのリストを指定なし
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")

・作成したパレットを帯として積み上げてプロット

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

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()

・産地ごとに離散スケールで塗り分け

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

色コードの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"


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

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