khromaパッケージのカラースキームを解説する

# khromaパッケージ

khromaパッケージは学術的な成果を全ての人が享受するために注意深く選ばれたカラースキームを提供します。Paul Tolや岡部・伊藤が提供するカラースキームを実装したものとなっています。

```{r}
# パッケージ読み込み
library(tidyverse)
library(khroma)

# データ準備
data <- iris %>%
  as_tibble() %>%
  mutate(SepLenCut =case_when( 
                     Sepal.Length < 5 ~ "5cm未満" ,
                     Sepal.Length >= 5 & Sepal.Length < 6 ~ "6cm未満" ,
                     Sepal.Length >= 6 & Sepal.Length < 7 ~ "7cm未満" ,
                     Sepal.Length >= 7 ~ "7cm以上" ,
                     )) 
data$SepLenCut <- fct_relevel(data$SepLenCut , 
                              "5cm未満", "6cm未満" , "7cm未満" ,"7cm以上")
```
```{r}
data
# A tibble: 150 x 6
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species SepLenCut
          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <fct>    
 1          5.1         3.5          1.4         0.2 setosa  6cm未満  
 2          4.9         3            1.4         0.2 setosa  5cm未満  
 3          4.7         3.2          1.3         0.2 setosa  5cm未満  
 4          4.6         3.1          1.5         0.2 setosa  5cm未満  
 5          5           3.6          1.4         0.2 setosa  6cm未満  
 6          5.4         3.9          1.7         0.4 setosa  6cm未満  
 7          4.6         3.4          1.4         0.3 setosa  5cm未満  
 8          5           3.4          1.5         0.2 setosa  6cm未満  
 9          4.4         2.9          1.4         0.2 setosa  5cm未満  
10          4.9         3.1          1.5         0.1 setosa  5cm未満  
# … with 140 more rows
```


# ggplotデフォルト

```{r}
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill") +
  coord_flip()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species))
# 散布図（連続量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Sepal.Width) ,
  size = 5)
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/3a3bdee8-462f-26b6-b0cd-3e31e90997b5.png)


# scale_okabeito_discrete

岡部・伊藤の提唱による離散量向けカラーパレットです。
[色覚研究HP（伊藤）](http://jfly.uni-koeln.de/lab/colorresearch.html)
[バリアフリープレゼンテーション法(岡部)](http://cudo.jp/cbf/)

見間違うことのない隔絶したカラースキームです。散布図点群の視認性も良いでしょう。

```{r}
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_okabeito()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_okabeito()
```
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/34943578-8de6-c9a5-30ba-a18feb2225af.png)



# Paul Tolのカラースキーム

Paul Tolのカラースキームはscale_ptol()でも提供されていますが、khromaではさらに多くのパレットが用意されています。

## scale_colour_bright

Tol氏のドキュメント（[Colour Schemes](https://personal.sron.nl/~pault/data/colourschemes.pdf)）で「定性データのためのデフォルトの配色」とされるもので、Tolの離散量（定性的）カラースキームの基本となるものです。

```{r}
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_bright()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_bright()
```
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/e9d50e7c-3423-9bc8-bebd-b248904dc4b8.png)


## scale_colour_contrast

brightよりも色の違いが強調されます。前出のTol氏のドキュメントで「少ない色で十分な場合の代替案」とされます。このパレットはグレースケールに変換しても機能し、モノクロ出力しても十分に実用に耐えるものです。

```{r}
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_contrast()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_contrast()
```
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/5516a165-8255-7384-f79f-6a1d099f9d49.png)


## scale_colour_vibrant

[TensorBoard](https://www.tensorflow.org/)用のデータビジュアライズ向けにデザインされたカラーパレット。TensorBoardの特徴的なオレンジは印刷向けのオレンジ色に改良されています。普段遣いしやすいカラースキームです。

```{r}
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_vibrant()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_vibrant()
```
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/533f0426-daa7-4f70-5a2a-cd416b038b4c.png)

## scale_colour_muted

scale_colour_brightの色数を増やしたバージョンです。brightの７色に対して、9色まで対応しています。

```{r}
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_muted()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_muted()
```
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/9edf228c-8e90-dd5a-1d70-7ba8942d483b.png)

## scale_colour_pale

明度の高いパレット。背景色として使用し、上にテキストが載る用例を想定しています。colourでは特性を活かせず、fill向きと言えます。

```{r}
# 構成比棒グラフ
data %>%
  count(SepLenCut , Species) %>%
  ggplot(aes(x = SepLenCut , y = n , fill = Species , label = Species) ) +
  geom_bar( stat = "identity" , position = "fill") +
  geom_text_repel(position = "fill" , hjust = 1.5) +
  coord_flip()+
  scale_fill_pale() 
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_pale()
```
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/5bdf7787-38dd-2258-034c-237f63f9c08d.png)

## scale_colour_dark

paleとは逆に白文字をテキストとして載せるのに適しています。pale同様、colourでは特性を活かせないため、fill向きと言えます。

```{r}
# 構成比棒グラフ
data %>%
  count(SepLenCut , Species) %>%
  ggplot(aes(x = SepLenCut , y = n , fill = Species , label = Species) ) +
  geom_bar( stat = "identity" , position = "fill") +
  geom_text_repel(position = "fill" , hjust = 1.5 , colour = "white") +
  coord_flip()+
  scale_fill_dark() 
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_dark()
```
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/b2209bf6-e5e4-81bd-ea28-f0ac2985e5e8.png)

## scale_colour_light

brightをベースにより淡い色で構成されるパレット。paleよりも明瞭な色で構成されていますが、上に載った黒いテキストがはっきりと視認できるように設計されています。

```{r}
# 構成比棒グラフ
data %>%
  count(SepLenCut , Species) %>%
  ggplot(aes(x = SepLenCut , y = n , fill = Species , label = Species) ) +
  geom_bar( stat = "identity" , position = "fill") +
  geom_text_repel(position = "fill" , hjust = 1.5 ) +
  coord_flip()+
  scale_fill_light()
# 散布図（離散量）
data %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length , y = Petal.Length , colour = Species)) +
  scale_colour_light()
```
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/829768d6-b6bb-ab1d-c6a5-1ac0ea7ff3af.png)

# ダイバースカラー

0を中位点としてプラスとマイナスがある連続量のためのカラーパレットです。

```{r}
data_div <- data %>%
  mutate(trans.Sepal.Width = Sepal.Width - median(data$Sepal.Width))
```
## scale_colour_sunset

青→赤に遷移するパレット。ColorBrewer のRdYluと関連のあるパレットですが、中央の色が暗く設計されています。

```{r}
# 散布図（連続量）
data_div %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = trans.Sepal.Width ) ) +
  geom_point(size = 5) +
  scale_colour_sunset()
```
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/363d9b7c-6aab-0705-f146-dc92244ce97d.png)

## scale_colour_BuRd

青→赤に遷移するColorBrewer RdBuのリバースバージョンです。

```{r}
# 散布図（連続量）
data_div %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = trans.Sepal.Width )) +
  geom_point(size = 5) +
  scale_colour_BuRd()
```
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/d1b7bfbe-ac04-e252-2918-8f94a71e60b6.png)

## scale_colour_PRGn

紫→緑に遷移するColorBrewer RRGndをベースとしたカラーパレットです。グリーンの一部をプリントに適したカラーに改変しています。

```{r}
# 散布図（連続量）
data_div %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = trans.Sepal.Width )) +
  geom_point(size = 5) +
  scale_colour_PRGn()
```
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/02386a33-8c43-306e-0983-174c70a4b7cc.png)

# シーケンシャルカラー

一般的な連続量のためのカラーパレット。

## scale_colour_YlOrBr

白→黄色→茶色と遷移するカラーパレットです、ColorBrewerのYlOrBrスキームをベースに設計されています。

```{r}
# 散布図（連続量）
data %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = Sepal.Width )) +
  geom_point(size = 5) +
  scale_colour_YlOrBr()
```
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/56de88f1-1675-ad7b-e92b-98720d525bc7.png)

## scale_colour_iridescent

黄色から緑、青を経由して紫へと遷移するカラーパレット。

```{r}
# 散布図（連続量）
data %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = Sepal.Width )) +
  geom_point(size =5) +
  scale_colour_iridescent()
```

## scale_colour_discreterainbow
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/87788606-dac1-763d-dcc3-7c6e28882ea2.png)

離散量用のパレットです。地図のために開発されたカラースキームで彩度が非常に高いことが特徴です。

```{r}
# 散布図（連続量）
data %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = Species )) +
  geom_point() +
  scale_colour_discreterainbow()
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_discreterainbow()
```
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/64aedab1-98c6-6a23-07f8-79f723b51136.png)

## scale_colour_smoothrainbow

連続量・離散量両用のパレットです。discreterainbowの中間色を補完し、色数を増加したものです。

```{r}
# 散布図（離散量）
data %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = Species )) +
  geom_point() +
  scale_colour_smoothrainbow(discrete = TRUE)
# 散布図（連続量）
data %>%
  ggplot(aes(x = Sepal.Length , 
             y = Petal.Length , 
             colour = Sepal.Width )) +
  geom_point(size = 5) +
  scale_colour_smoothrainbow(discrete = FALSE)
# 構成比棒グラフ
data %>%
  ggplot() +
  geom_bar(aes(x = SepLenCut , fill = Species) ,
           position = "fill" ) +
  coord_flip()+
  scale_fill_smoothrainbow(discrete = TRUE)
```
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/4fea9dfd-7e4e-3fe1-b4b1-6183075aa415.png)

# 国際的な土壌分類等のカラーパレット

地図での使用が想定されています。カラーユニバーサル性は保証されていません。

## scale_fill_land

土地分類のためのカラーパレット。

```{r}
land <- data.frame(
name = c(
"water", "evergreen needleleaf forest", "deciduous needleleaf forest",
"mixed forest", "evergreen broadleaf forest", "deciduous broadleaf forest",
"woodland", "wooded grassland", "grassland", "cropland", "closed shrubland",
"open shrubland", "bare ground", "urban and built"
)
)
ggplot2::ggplot(land, ggplot2::aes(fill = name)) +
ggplot2::geom_rect(aes(xmin = rep(0, 14), xmax = rep(1, 14),
ymin = 1:14, ymax = 1:14+1)) +
ggplot2::scale_y_reverse() +
scale_fill_land(name = "land")
```
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/60c9b9a8-47b5-7ea4-b065-16fb08da3698.png)

## scale_fill_soil

土壌図のためのカラーパレット。

```{r}
soil <- data.frame(
name = c(
"Acrisol", "Albeluvisol", "Andosol", "Anthrosol", "Arenosol", "Calcisol",
"Cambisol", "Chernozem", "Cryosol", "Fluvisol", "Kastanozem", "Gleysol",
"Gypsisol", "Histosol", "Leptosol", "Luvisol", "Phaeozem", "Planosol",
"Podzol", "Regosol", "Solonchak", "Solonetz", "Umbrisol", "Vertisol"
)
)
ggplot2::ggplot(soil, ggplot2::aes(fill = name)) +
ggplot2::geom_rect(aes(xmin = rep(0, 24), xmax = rep(1, 24),
ymin = 1:24, ymax = 1:24+1)) +
ggplot2::scale_y_reverse() +
scale_fill_soil(name = "Soil")
```
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/af620e31-7f2f-49e8-5b43-35a941b65e8f.png)

## scale_fill_stratigraphy

地質年代のためのカラーパレット。

```{r}
strati <- data.frame(
name = c("Phanerozoic", "Paleozoic", "Cambrian", "Ordovician", "Silurian",
"Devonian", "Carboniferous", "Mesozoic", "Triassic", "Cretaceous",
"Jurassic", "Cenozoic", "Paleogene", "Neogene", "Quaternary"),
type = c("Eon", "Era", "Period", "Period", "Period", "Period", "Period",
"Era", "Period", "Period", "Period", "Era", "Period", "Period",
"Period"),
start = c(541, 541, 541, 485, 444, 419, 359,
252, 252, 201, 145, 66, 66, 23, 2.6),
end = c(0, 252, 485, 444, 419, 359, 252,
66, 201, 145, 66, 2.6, 23, 2.6, 0)
)
ggplot2::ggplot(strati, ggplot2::aes(fill = name)) +
ggplot2::geom_rect(aes(xmin = rep(0, 15), xmax = rep(1, 15),
ymin = start, ymax = end)) +
ggplot2::scale_y_reverse() +
ggplot2::facet_grid(. ~ type) +
scale_fill_stratigraphy(name = "Stratigraphy")
```
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/62cdeece-222f-27e3-9416-f0f2aa3f3cff.png)

# まとめ

Khromaパッケージのカラースキームはオーソドックスな配色が多く、特に離散量用のパレットは用途に応じて使い分けができるため、あらゆる場面で利用することができます。中でもvibrant、brihgt、contrastはcolour、fillいずれの使用にも適する優れたカラースキームです。筆者は特にvibrantを愛用しています。

地図以外のデータ可視化では、連続量のカラーパレットを使用することは少ないのですが、順序変数（年代区分や法量区分）を使用する際には連続量的なカラーパレットを離散量データにも適用したくなります。そのような場合に適したパレットは本パッケージでは提供されていないため、筆者は`viridis`バッケージの`scale_colour_viridis_d`を主に使用しています。