Rでカラーパレット作成

毎回忘れてはググるので未来の自分へ。

参考となる資料
--------------

-   [Rにおける色の名前 -
    RjpWiki](http://www.okadajp.org/RWiki/?R%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)
-   [グラフィックス参考実例集 -
    RjpWiki](http://www.okadajp.org/RWiki/?%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E5%8F%82%E8%80%83%E5%AE%9F%E4%BE%8B%E9%9B%86)
    -   [グラフィックス参考実例集：カラーパレット -
        RjpWiki](http://www.okadajp.org/RWiki/?%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E5%8F%82%E8%80%83%E5%AE%9F%E4%BE%8B%E9%9B%86%EF%BC%9A%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%91%E3%83%AC%E3%83%83%E3%83%88)
    -   [グラフィックス参考実例集：RColorBrewer
        パッケージによるカラーパレット -
        RjpWiki](http://www.okadajp.org/RWiki/?%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E5%8F%82%E8%80%83%E5%AE%9F%E4%BE%8B%E9%9B%86%EF%BC%9ARColorBrewer%20%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%91%E3%83%AC%E3%83%83%E3%83%88)
-   [カラーチャート -
    RjpWiki](http://www.okadajp.org/RWiki/?%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88)
-   [統計グラフの色](https://oku.edu.mie-u.ac.jp/~okumura/stat/colors.html)

たぶんこれらをおさえておけば、基本的に大丈夫。

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のサイト](http://colorbrewer2.org/)で提案されているカラーパレットをピックアップしてRで簡単に呼び出せる、ようにしたものです。まず、どんなカラーパレットが含まれているかを一覧させてみます:

    library(RColorBrewer)
    display.brewer.all()

![unnamed-chunk-7-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/14f0e42b-dac9-061f-38b0-319820151186.png)

ではこの中から"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")

![unnamed-chunk-9-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/ba2c93ba-654e-e317-65c1-ecf352db3feb.png)


よって、使いたいカラーパレットを探し、`brewer.pal()`で指定すれば色を取得できるんですね。

### RColorBrewerの色数対応を増やしたい

ここまでくれば、おそらく察しがつくかと思います。

1.  `brewer.pal()`を利用して、使いたいカラーパレットの色を取り出す
2.  1.で取り出した色セットを`ColorRamp()`もしくは`ColorRampPalette()`でカラーパレットにする
3.  作成したカラーパレットに適切な引数を与えて色を指定

これで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")

![unnamed-chunk-10-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/7faf20e3-e4af-4274-c1f4-1d4c3435090c.png)

ここまで把握すればたぶん大丈夫ではないかと思います。

自作カラーパレットの色選び
--------------------------

センスが必要です。私には無理なので「色選択　デザイン」とかで適当にググッて探してください。

Enjoy!