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

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

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
h22番目の端点における色相値を指定する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
revTRUE で色の順序を逆転する (デフォルト)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)

インタラクティブなGUIで対話的にHCLカラーパレットを選択する:choose_paletteコマンド

オプション意味初期値
pal初期パレット関数。gui=”tcltk” のみ使用可能diverging_hcl
n初期パレットの色数を整数で指定7L
parentGUI 親ウィンドウ (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")

応用例:ビジネスデータの発散型・順次型配色

実務でよくある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)というように、データの性質に応じてパレットの種類を使い分けるのがポイントです。


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

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