Rで解析:科学的な配色を実現する「colorspace」パッケージの紹介
データを可視化する際、どの色パレットを選ぶかで結果の伝わりやすさが大きく変化します。しかし、目に見える色ではなく、RGBやHCLなどの色空間から直感的に色を理解するのは困難です。本パッケージは、これらの色空間を相互に変換・評価するコマンドや、色を科学的に選ぶための基盤を提供するコマンドを収録しています。特に、人間の知覚に合わせて設計されたHCL色空間に基づく質的・順次的・発散型のカラーパレットの自動生成のコマンドが収録されているのが大きな特徴です。
さらに、パレットを対話的に選べるインタラクティブなGUI(choose_palette)に加え、既存の画像を色覚特性(色覚多様性)の見え方でチェックできる別のGUI(cvd_emulator)も収録されており、資料作成の前後で視認性を確認する用途にも活用できます。色使いにこだわりたい方へおすすめのパッケージです。
パッケージバージョンは2.1.3。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("colorspace")
# パッケージの読み込み
library("colorspace")
# 必要なパッケージを読み込み
library("ggplot2")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
収録カラーパレットの一覧:hcl_palettesコマンド
# パレットをグラフィックで一覧表示
hcl_palettes(plot = TRUE)
色相・彩度で分類した質的データの配色:scale_colour_binned_qualitativeコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | 使用するパレットの名前を指定 | NULL |
| c1 | スケーリングに用いる彩度値を指定 | NULL |
| l1 | スケーリングに用いる明度値を指定 | NULL |
| h1 | 開始色相の値を指定 | NULL |
| h2 | 終了色相の値を指定 | NULL |
| alpha | 透過率チャンネルの値ベクトルを指定 | 1 |
| rev | 色の順序を反転するかどうかを指定 | FALSE |
| begin | 最小データ値がマッピングされる位置を指定 | 0 |
| end | 最大データ値がマッピングされる位置を指定 | 1 |
| na.value | 欠損データを表す色を指定 | “grey50” |
| guide | “coloursteps”を指定して離散色階調の色軸を作成する | “coloursteps” |
| aesthetics | このスケールが適用されるggplot2の美学変数を指定する | “colour” |
| n_interp | ビン化された色スケールの補間に使われる離散色の数値を指定する | 11 |
| … | name・breaks・labels・limitsなど共通のビン化スケールパラメータを指定 |
# プロット作成
gg <- ggplot(iris, aes(x = Species, y = Sepal.Width, color = Sepal.Length)) +
geom_jitter(width = 0.3) + theme_minimal()
# パレット名を指定して質的ビン化スケールを適用
gg + scale_color_binned_qualitative(palette = "Dynamic")
# l1(明度)を個別に指定して調整
gg + scale_color_binned_qualitative(palette = "Dark3", l1 = 70)
# volcanoデータを用いたラスター図の例
nx <- 87
ny <- 61
df <- data.frame(height = c(volcano), x = rep(1:nx, ny), y = rep(1:ny, each = nx))
ggplot(df, aes(x, y, fill = height)) +
geom_raster() + scale_fill_binned_qualitative(palette = "Dark 3") +
coord_fixed(expand = FALSE)
対称的な値分布に対応する発散型配色の指定を行う:scale_colour_binned_divergingコマンド
両極端の値と中間の値で対照的な色使いが可能になるため、正負を示す偏差図などで視認性を高めるのに適しています。
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | 使用するパレットの名前を指定する (ヘルプ参照) | NULL |
| c1 | スケール端点における彩度値を指定する | NULL |
| cmax | 最大彩度値を指定する | NULL |
| l1 | スケール端点における明度値を指定する | NULL |
| l2 | スケールの中間点における明度値を指定する | NULL |
| h1 | 最初の端点における色相値を指定する | NULL |
| h2 | 2番目の端点における色相値を指定する | NULL |
| p1 | 彩度変化の制御パラメータを指定 (1=線形) | NULL |
| p2 | 輝度変化の制御パラメータを指定 (1=線形) | NULL |
| alpha | 透過率チャンネルの値ベクトルを指定 | 1 |
| rev | 色の順序を反転するかどうかを指定 | FALSE |
| mid | 発散カラースケールの中央に割り当てる値を指定 | 0 |
| na.value | 欠損データを表す色を指定 | “grey50” |
| guide | “coloursteps”を指定して離散色階調の色軸を作成する | “coloursteps” |
| n_interp | ビン化されたカラースケールで使用する離散色数を指定 | 11 |
| aesthetics | このスケールが適用されるggplot2の美学変数を指定する | “colour” |
| … | name・breaks・labels・limitsなど共通のビン化スケールパラメータを指定 |
・例1
# データとプロットの準備
set.seed(100)
df <- data.frame(country = LETTERS, V = runif(26, -40, 40))
# 因子を値の大きさ順に並べ替え
df$country <- factor(LETTERS, LETTERS[order(df$V)])
gg <- ggplot(df, aes(x = country, y = V, fill = V)) +
geom_bar(stat = "identity") +
labs(y = "Under/over valuation in %", x = "Country") +
coord_flip() + theme_minimal()
# デフォルトの発散型スケールでプロット
gg + scale_fill_binned_diverging(n.breaks = 6)
# 別のパレットを指定したプロット
gg + scale_fill_binned_diverging(palette = "Purple-Green", n.breaks = 6)
・例2
# volcanoデータの標高差(平均からの差)を可視化
nx <- 87
ny <- 61
df <- data.frame(diff = c(volcano) - mean(volcano), x = rep(1:nx, ny), y = rep(1:ny, each = nx))
ggplot(df, aes(x, y, fill = diff)) +
geom_raster() + scale_fill_binned_divergingx(palette = "Fall", rev = TRUE) +
coord_fixed(expand = FALSE)
単調増加または減少を示す順次型のグラデーションを適用する:scale_colour_binned_sequentialコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | 使用されるパレットの名前を指定 (オプション一覧はヘルプ参照) | NULL |
| c1 | 開始する彩度値を指定 | NULL |
| c2 | 終了する彩度値を指定 | NULL |
| cmax | 最大彩度値を指定する | NULL |
| l1 | 開始輝度値を指定 | NULL |
| l2 | 終了輝度値を指定 | NULL |
| h1 | 開始色相の値を指定 | NULL |
| h2 | 終了色相値。NA は単一色相スケール生成 | NULL |
| p1 | 彩度変化の制御パラメータを指定 (1=線形) | NULL |
| p2 | 輝度変化の制御パラメータを指定 (1=線形) | NULL |
| alpha | 透過率チャンネルの値ベクトルを指定 | 1 |
| rev | TRUE で色の順序を逆転する (デフォルト) | TRUE |
| begin | 最小データ値がマッピングされる位置を指定 | 0 |
| end | 最大データ値がマッピングされる位置を指定 | 1 |
| na.value | 欠損データを表す色を指定 | “grey50” |
| guide | “coloursteps”を指定して離散色階調の色軸を作成する | “coloursteps” |
| aesthetics | このスケールが適用されるggplot2の美学変数を指定する | “colour” |
| n_interp | ビン化された色スケールの補間に使われる離散色の数値を指定する | 11 |
| … | name・breaks・labels・limitsなど共通のビン化スケールパラメータを指定 |
# volcanoデータを用いたラスター図
df <- data.frame(height = c(volcano), x = c(row(volcano)), y = c(col(volcano)))
ggplot(df, aes(x, y, fill = height)) +
geom_raster() + scale_fill_binned_sequential(palette = "Terrain", rev = FALSE) +
coord_fixed(expand = FALSE)連続変数に対して質的データを扱うための配色関数を指定する:scale_colour_continuous_qualitativeコマンド
カテゴリ名を持つ数値データを扱いながら色の連続性を保てるため、階級化されたデータでも滑らかな色彩表現が可能です。
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | 使用するパレットの名前を指定 | NULL |
| c1 | スケーリングに用いる彩度値を指定 | NULL |
| l1 | スケーリングに用いる明度値を指定 | NULL |
| h1 | 開始色相の値を指定 | NULL |
| h2 | 終了色相の値を指定 | NULL |
| alpha | 透過率チャンネルの値ベクトルを指定 | 1 |
| rev | 色の順序を反転するかどうかを指定 | FALSE |
| begin | 最小データ値がマッピングされる位置を指定 | 0 |
| end | 最大データ値がマッピングされる位置を指定 | 1 |
| na.value | 欠損データを表す色を指定 | “grey50” |
| guide | 凡例タイプ。「colourbar」は連続カラーバー用 | “colourbar” |
| aesthetics | このスケールが適用されるggplot2の美学変数を指定する | “colour” |
| n_interp | 連続スケールの離散化に使う色数。11 が推奨 | 11 |
| … | name・breaks・labels・limitsなど共通の連続スケールパラメータを指定 |
# volcanoデータを用いたラスター図の例
nx <- 87
ny <- 61
df <- data.frame(height = c(volcano), x = rep(1:nx, ny), y = rep(1:ny, each = nx))
ggplot(df, aes(x, y, fill = height)) +
geom_raster() + scale_fill_continuous_qualitative(palette = "Dark 3") +
coord_fixed(expand = FALSE)
<おすすめのRに関する書籍です>
インタラクティブなGUIで対話的にHCLカラーパレットを選択する:choose_paletteコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| pal | 初期パレット関数。gui=”tcltk” のみ使用可能 | diverging_hcl |
| n | 初期パレットの色数を整数で指定 | 7L |
| parent | GUI 親ウィンドウ (tkwin)。gui=”tcltk” のみ使用 | NULL |
| gui | 使用する GUI。選択肢は tcltk または shiny | “tcltk” |
| … | 開発目的専用のパラメータ(通常は指定不要) |
# tcltk GUIを使用する場合
pal <- choose_palette()
# shiny GUIを使用する場合
pal <- hclwizard()・shiny GUIを使用する場合

複数の標準デモプロットに同一または異なる配色を適用表示する:demoplotコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 色を表すhexコードの文字ベクトルを指定 | |
| type | デモプロットのタイプを示す文字を指定 | c(“map”, “heatmap”, “scatter”, “spine”, “bar”, “pie”, “perspective”, “mosaic”, “lines”) |
| … | 現在は未使用のパラメータ |
# 全ての組み込みデモを同一の順次型ヒートカラーパレットで表示
par(mfrow = c(3, 3))
cl <- sequential_hcl(5, "Heat")
for (i in c("map", "heatmap", "scatter", "spine", "bar", "pie", "perspective", "mosaic", "lines")) {
demoplot(cl, type = i)
}
# 質的パレット:面の塗りつぶし(円グラフ)には薄いパステルカラー、
# 点や線には濃くカラフルなパレットが適する
demoplot(qualitative_hcl(4, "Pastel 1"), type = "pie")
demoplot(qualitative_hcl(4, "Set 2"), type = "scatter")
demoplot(qualitative_hcl(4, "Dark 3"), type = "lines")
# 順次型パレット:ヒートマップや3D投影図ではほぼ連続的な
# グラデーションと強い明度コントラストを、少数の順序カテゴリしか
# ない spine プロットではカラフルな順次パレットを用いる
demoplot(sequential_hcl(99, "Purple-Blue"), type = "heatmap")
demoplot(sequential_hcl(99, "Reds"), type = "perspective")
demoplot(sequential_hcl(4, "Viridis"), type = "spine")
# 発散型パレット:地図では両極端を際立たせる強い明度コントラストの
# 連続的グラデーションを、色数が少ないモザイク図や棒グラフでは
# 明度コントラストが低くカラフルなパレットを用いる
demoplot(diverging_hcl(99, "Tropic", power = 2.5), type = "map")
demoplot(diverging_hcl(5, "Green-Orange"), type = "mosaic")
demoplot(diverging_hcl(5, "Blue-Red 2"), type = "bar")
# 黒背景でも見やすいパレットの例
par(mfrow = c(2, 3), bg = "black")
demoplot(sequential_hcl(9, "Oslo"), "heatmap")
demoplot(sequential_hcl(9, "Turku"), "heatmap")
demoplot(sequential_hcl(9, "Inferno", rev = TRUE), "heatmap")
demoplot(qualitative_hcl(9, "Set 2"), "lines")
demoplot(diverging_hcl(9, "Berlin"), "scatter")
demoplot(diverging_hcl(9, "Cyan-Magenta", l2 = 20), "lines")
<おすすめのRに関する書籍です>
応用例:ビジネスデータの発散型・順次型配色
実務でよくある2種類のデータ、「前年比のようなプラス・マイナスの偏差」と「満足度スコアのような単調な指標」に、それぞれ発散型・順次型パレットを適用する例です。
# 架空店舗の月次売上前年同月比(%)データを定義
sales <- data.frame(
month = factor(month.abb, levels = month.abb),
yoy = c(-12.4, -8.1, 3.2, 15.6, 22.8, 18.3,
9.7, -2.5, -15.8, -20.3, -5.6, 8.9)
)
# 前年同月比の正負を発散型パレットで可視化
ggplot(sales, aes(x = month, y = yoy, fill = yoy)) +
geom_col() +
scale_fill_binned_diverging(palette = "Blue-Red 3", n.breaks = 6) +
labs(x = "月", y = "前年同月比(%)", fill = "前年比") +
theme_minimal()
# 架空の5支店×4週分の顧客満足度スコア(0〜100)データを定義
set.seed(42)
branch <- data.frame(
branch = rep(paste0("支店", 1:5), each = 4),
week = rep(paste0(1:4, "週目"), times = 5),
score = round(runif(20, 60, 95), 1)
)
# 満足度スコアを順次型パレットでヒートマップ表示
ggplot(branch, aes(x = week, y = branch, fill = score)) +
geom_tile(color = "white") +
scale_fill_binned_sequential(palette = "Blues 3", n.breaks = 5) +
labs(x = "週", y = "支店", fill = "満足度") +
theme_minimal()前年同月比のようにゼロを挟んで正負両方に意味があるデータには発散型(diverging)、満足度スコアのように高低のみに意味がある単調なデータには順次型(sequential)というように、データの性質に応じてパレットの種類を使い分けるのがポイントです。
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。