毎回忘れてはググるので未来の自分へ。
参考となる資料
たぶんこれらをおさえておけば、基本的に大丈夫。
Rに組み込まれてるカラーパレット
省略します。上述の参考資料を見てください。
カラーパレットの自作
grDevices::colorRamp()
もしくはgrDevices::colorRampPalette()
で作成可能。詳しくはそれぞれのヘルプ参照。
colorRamp()
によるカラーパレット作成
例えば、「赤・黄色・緑・青」と変化していくカラーパレットを作成するなら、以下の通り:
colPal1 <- colorRamp(c("red", "yellow", "green", "blue"), space = "rgb")
まず、このcolPal1
は関数となります:
colPal1
## function (x)
## roundcolor(cbind(palette[[1L]](x), palette[[2L]](x), palette[[3L]](x),
## if (alpha) palette[[4L]](x))) * 255
## <bytecode: 0x2d3b098>
## <environment: 0x2d3c3d0>
colorRamp()
で作成したカラーパレットは、引数にx[0,1]
の範囲の実数値ベクトルを与えます。試しにc(0, 0.2, 0.4, 0.6, 0.8, 1)
でやってみます:
colPal1(c(seq(0, 1, by = 0.2)))
## [,1] [,2] [,3]
## [1,] 255 0 0
## [2,] 255 153 0
## [3,] 204 255 0
## [4,] 51 255 0
## [5,] 0 153 102
## [6,] 0 0 255
生成されるのは、レコード(行)にRGBの値を格納したデータです。よって、「このカラーパレット作成した時に指定した色の順番がセット」され、「カラーパレットに値を放り込めば、その分位点での色を自動的に持ってくる」みたいなことをしてくれます。分位点で指定したいならこれが楽ですが、「n個で切り分けてくれ」という場合には、colorRampPalette()
を使ったほうが楽です。
colorRampPalette()
によるカラーパレット自作
考え方は上述のcolorRamp()
とほぼ同じです。「赤・黄色・緑・青」と変化していくカラーパレットを作成するなら、以下の通り:
colPal2 <- colorRampPalette(c("red", "yellow", "green", "blue"))
このcolPal2
もやはり関数となります:
colPal2
## function (n)
## {
## x <- ramp(seq.int(0, 1, length.out = n))
## if (ncol(x) == 4L)
## rgb(x[, 1L], x[, 2L], x[, 3L], x[, 4L], maxColorValue = 255)
## else rgb(x[, 1L], x[, 2L], x[, 3L], maxColorValue = 255)
## }
## <bytecode: 0x19d51a0>
## <environment: 0x1dc9fb8>
colorRampPalette()
で作成したカラーパレットは、引数に正の整数値を与えます。試しに6
でやってみます:
colPal2(6)
## [1] "#FF0000" "#FF9900" "#CBFF00" "#32FF00" "#009866" "#0000FF"
こちらはこの手の書式のベクトルで返ってきます。なんでこんな処理の違いが出てくるかは、それぞれの関数のソースコードを眺めたらつかめると思います(短いです)。分割数を指定したいならばこれが自動的にやってくれますので楽です。
RColorBrewerの色数をもっと細かく増やしたい
RColorBrewerは大変便利なのですが、色数は一番多いカラーパレットでも12です。これを13以上にするにはどうすればいいでしょうか。
RColorBrewerの使い方
RColorBrewerは、大雑把にいうとColorbrewerのサイトで提案されているカラーパレットをピックアップしてRで簡単に呼び出せる、ようにしたものです。まず、どんなカラーパレットが含まれているかを一覧させてみます:
library(RColorBrewer)
display.brewer.all()
ではこの中から"Spectral"というカラーパレットで、7色取り出してみます。色を取り出すにはRColorBrewer::brewer.pal()
です:
brewer.pal(11,"Spectral")
## [1] "#9E0142" "#D53E4F" "#F46D43" "#FDAE61" "#FEE08B" "#FFFFBF" "#E6F598"
## [8] "#ABDDA4" "#66C2A5" "#3288BD" "#5E4FA2"
ではこれがどんな色かを確認します。サンプルを表示させるにはRColorBrewer::display.brewer.pal()
です:
display.brewer.pal(11,"Spectral")
よって、使いたいカラーパレットを探し、brewer.pal()
で指定すれば色を取得できるんですね。
RColorBrewerの色数対応を増やしたい
ここまでくれば、おそらく察しがつくかと思います。
-
brewer.pal()
を利用して、使いたいカラーパレットの色を取り出す - 1.で取り出した色セットを
ColorRamp()
もしくはColorRampPalette()
でカラーパレットにする - 作成したカラーパレットに適切な引数を与えて色を指定
これでOKです。試しに{plotly}でやってみます:
library(plotly)
library(dplyr)
df <- data.frame(cat = sample(paste0("cat", LETTERS[1:15]), size = 1000, replace = TRUE),
value = rnorm(n = 1000, mean = 50, sd = 10)
) %>%
arrange(cat)
colPal3 <- colorRampPalette(brewer.pal(11, "Spectral"))
plot_ly(df, x=cat, y=value, color=as.ordered(cat), colors = colPal3(length(unique(df$cat))), type = "box")
ここまで把握すればたぶん大丈夫ではないかと思います。
自作カラーパレットの色選び
センスが必要です。私には無理なので「色選択 デザイン」とかで適当にググッて探してください。
Enjoy!