colorblindr を使えば R で色弱シミュレーションができる

グラフの配色を変えようと思って `display.brewer.all()` コマンドでパレットを眺めていた時に、 colorblindFriendly オプションを発見。

```R:配色セットの一覧
library(RColorBrewer)
display.brewer.all() #全色表示させる
display.brewer.all(colorblindFriendly=T) #色弱の方に優しいパレット
```

せっかくだから、作成したグラフがどんな感じに見えたりするのかシミュレーションできないかなって思って探してみたら、 colorblindr っていうパッケージが。ってなわけで、そのインストール方法と使い方です。

## 環境
- R Open 3.5.1 又は R3.6
- Lubuntu 16.04

## という訳でインストール

まずは必要となるライブラリをインストールしておきます。以下のコマンドは R 上ではなく Ubuntuのコンソール上で実行します。

```console:ライブラリのインストール（コンソールで実行）
sudo apt -y install build-essential
sudo apt -y install libssl-dev
sudo apt -y install libjpeg9-dev
sudo apt -y install libxml2-dev
sudo apt -y install libcurl4-openssl-dev
```

で R 上でパッケージをインストールします。

```R:パッケージのインストール（Rで実行）
install.packages("shinyjs")
install.packages("jpeg")
install.packages("png")
install.packages("RCurl")

install.packages("remotes")
remotes::install_github("cran/colorspace")
remotes::install_github("clauswilke/colorblindr")
```

## 使ってみよう！

### cvd_emulator
画像ファイルを指定すると、その画像がどんな風に見えるのかを確認することができます。R 上で以下のようにして起動します。

```R:cvd_emulator
library(colorblindr)
cvd_emulator()
```

起動すると以下のようなページが表示されます。 Upload Image の「 Browse 」ボタンをクリックして画像ファイルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/d488d570-4a30-6402-8e65-e83bf725df4d.png)

「 Desaturated 」「 Deuteranope 」等をクリックするとシミュレートできます。以下は「 All 」を選んだ時のスクリーンショットです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/86c9ade8-c5a3-9005-35cb-f965e9738318.png)

### view_cvd
`cvd_emulator` では画像ファイルを指定しましたが、 `view_cvd` は R 上で描いたグラフ等をそのまま指定することができます。以下はサンプルです。 

```R:view_cvdのサンプル
library(ggplot2)
library(colorblindr)
sample_data <- data.frame(x=factor(rep(seq(1,10),5)),g=factor(rep(seq(1,5), each=10)),c=round(runif(10*5,10,100)))
p <- ggplot(sample_data, aes(x = `x`, y = `c`,fill=`g`)) +
geom_bar(stat = "identity",color="black",size=0.3) +
scale_fill_manual(values=c("#ff4b00","#fff100","#03af7a","#005aff","#4dc4ff","#ff8082","#f6aa00","#990099","#804000"))
view_cvd(p)
```

実行すると以下のような感じの画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/aa75df1b-eccb-5686-2cd9-f7373bf41f53.png)

### cvd_grid
R 上で描いたグラフ等を、まとめて並べて表示することができます。以下はサンプルです。

```R:cvd_gridのサンプル
library(ggplot2)
library(colorblindr)
sample_data <- data.frame(x=factor(rep(seq(1,10),5)),g=factor(rep(seq(1,5), each=10)),c=round(runif(10*5,10,100)))
p <- ggplot(sample_data, aes(x = `x`, y = `c`,fill=`g`)) +
geom_bar(stat = "identity",color="black",size=0.3) +
scale_fill_manual(values=c("#ff854f","#fffe4f","#51cea8","#4f90ff","#87ddff","#ffacad","#ffca4f","#be4fbe","#ac7d4f")) #20x-20
cvd_grid(p)
```

実行すると以下のような感じで表示できます。

![cvd_grid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/ad2bcf2d-e8e5-680d-546c-efa12e7e46d9.png)

私はオリジナル画像も表示させた方が分かりやすいので、 `cvd_grid` を以下のように定義しなおしちゃっています。

```R:cvd_grid
cvd_grid <- function (plot = last_plot(), severity = 1) 
{
    deut <- function(c) deutan(c, severity)
    p1 <- edit_colors(plot, deut)
    prot <- function(c) protan(c, severity)
    p2 <- edit_colors(plot, prot)
    trit <- function(c) tritan(c, severity)
    p3 <- edit_colors(plot, trit)
    des <- function(c) desaturate(c, severity)
    p4 <- edit_colors(plot, des)
    cowplot::plot_grid(p1, p2, p3, p4, plot, scale = 0.9, hjust = 0, 
        vjust = 1, labels = c("Deutanomaly", "Protanomaly", "Tritanomaly", 
            "Desaturated","Original"), label_x = 0.01, label_y = 0.99, label_size = 12, 
        label_fontface = "bold")
}
```

それを実行してから再度サンプルを実行すると以下のような感じとなります。

![t2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/0f65533f-e98c-de4d-7d28-2ff1c2a2d868.png)

以下のように `ggsave` を使えば結果を画像ファイルとして保存することもできます。

```R:結果をPNGで保存
ggsave(plot = p, file = "colors.png", dpi = 100, width = 12.8, height = 7.28)
```