R でグラフ描くときのカスタマイズメモ（自分用）

R でグラフ描く時は ggplot2 使っています。でも標準だと私には見にくいなーってな事で毎回パラメーターを調整したりするんですが、グラフ描くなんてことは稀なので「どうだったかなーっ」て思い出したり探すのに時間が掛かっちゃう。じゃあ、ささっと探せてコピペできるように公開しておけば良いじゃんってな話です。

棒グラフを良く使うので今回はとりあえず棒グラフを中心とした内容となっています。

## テストデータの作成
まずはテストデータ作ります。

```R:テストデータの作成
test_data <- data.frame(
    area = sample(c("A","B","C","D"), 1000, TRUE),
    x = as.factor(as.integer(runif(1000, min = 1, max = 14)))
)
```

## なにも指定しないで描画
で、以下がなにも指定しないで描画するコードです。※以前は `print` の後に `%>% ggsave(...)` みたいに書いて描画＋保存てな感じでセットで使ってたんですが、R Markdown を使うようになってからは保存まではしなくなったかなー。

<!--
で、以下がなにも指定しないで描画して保存するコードです。※以前は保存までセットで書いてたんですが、 R Markdown を使うようになってからは保存は書かなくなったかなー。
-->

ここから背景は白が良いなーとかとかを変えていきたいと思います。

```R:なにも指定しないで描画＋保存
library(dplyr)
library(ggplot2)
(test_data %>%
	group_by(x,area) %>% summarise(n = n()) %>%
	ggplot(aes(x = x, y = n, fill = area))
		+ geom_bar(stat = "identity")
		+ labs(title = "テストデータ")
		+ ylab("件数")
		+ xlab("x値")
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/a9e18611-8096-20b7-c0e3-ae2ca216fa9b.png)

### 単色の場合

```R:なにも指定しないで描画＋保存（単色の場合）
library(dplyr)
library(ggplot2)
(test_data %>%
    group_by(x) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n))
        + geom_bar(stat = "identity")
        + labs(title="テストデータ")
        + ylab("件数")
        + xlab("x値")
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/fc4c0805-2fd7-26c3-ac2c-aa6e3b77ef88.png)


## まずはcowplot
以下のサンプルはテーマを cowplot に変更するサンプルです。 `theme_cowplot()` を追加するだけで単色の場合も含めてかなりいい感じになっちゃいます。

```R:テーマをcowplotに変更
library(dplyr)
library(ggplot2)
library(cowplot)
(test_data %>%
	group_by(x,area) %>% summarise(n = n()) %>%
	ggplot(aes(x = x, y = n, fill = area))
		+ geom_bar(stat = "identity")
		+ labs(title = "テストデータ")
		+ ylab("件数")
		+ xlab("x値")
		+ theme_cowplot()
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/cb8c5819-d560-8607-c8a5-ad607a4c573d.png)

### 単色の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/7d07d8c1-61d7-6aef-f889-6637f87a9b88.png)

## ちょい修正
cowplot では不満なところを以下のような感じで修正を行います。ホントは凡例のボックスの幅とか折り返す数とか変えたかったんですけど、よく分かんないから、ま、いいかっていう感じで使ってます。

- 枠をつける
- タイトルを下に＋左寄せ＋文字大きめに ※実際のところタイトルはグラフに埋め込んじゃうと後々で面倒な事が多いので、そもそもタイトルは描画しないことが多いかも。
- 凡例をグラフ内の中央上に移動
- 凡例を縦から横に変更
- 凡例のタイトルを削除
- 凡例のマージンを調整

```R:ちょい修正
library(dplyr)
library(ggplot2)
library(cowplot)
(test_data %>%
    group_by(x,area) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n, fill = area))
        + geom_bar(stat = "identity", color = "black", size = 0.3)
        + labs(caption = "テストデータ")
        + ylab("件数")
        + xlab("x値")
        + theme_cowplot()
        + theme(    plot.caption = element_text(hjust = 0.5, size = 14)
                    ,legend.margin = margin(7, 7, 7, 7, unit = "pt")
                    ,legend.title = element_blank()
                    ,legend.position = c(0.5,1)
                    ,legend.justification = c(0,1)
                    ,legend.direction = "horizontal"
                    ,legend.spacing.x = unit(1, 'mm')
                    ,legend.background = element_rect(fill = "white", size = 0.4, linetype = "solid", colour = "black")
                )
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/00b84442-4cef-f697-d944-25db7c6f7547.png)

## 配色を変える
標準の配色をグレースケールにすると以下のような感じで判別ができにくくなってしまうので配色を変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/88dedc37-9ad3-1a63-6ad6-5b299f02a803.png)

viridis っていうパッケージを使う手もあると思うんですが、私は「[カラーユニバーサルデザイン推奨配色セット](https://www2.cudo.jp/wp/?page_id=1565)『特定非営利活動法人カラーユニバーサルデザイン機構CUDO』 」の値を参考に薄めにしたり順番変えたりして自分好みに近づけたものを使っています。

配色セットを自分で持っていると、気分的に赤欲しいと思ったら赤選んだり、順序を変更したりできるのでパッケージに頼るよりも便利かなって思っています。組み合わせを変えた時は、 colorblindr パッケージの `view_cvd()` や `cvd_grid()` 、 `edit_colors(desaturate) %>% cowplot::plot_grid()` 等を使えばある程度のモノクロイメージを確認できたりします。

```R:グラフの配色を変える
library(dplyr)
library(ggplot2)
library(cowplot)
(test_data %>%
    group_by(x,area) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n, fill = area))
        + geom_bar(stat = "identity",color = "black",size = 0.3)
        + labs(caption = "テストデータ")
        + ylab("件数")
        + xlab("x値")
        + theme_cowplot()
        + theme(    plot.caption = element_text(hjust = 0.5, size = 14)
                    ,legend.margin = margin(7, 7, 7, 7, unit = "pt")
                    ,legend.title = element_blank()
                    ,legend.position = c(0.5,1)
                    ,legend.justification = c(0,1)
                    ,legend.direction = "horizontal"
                    ,legend.spacing.x = unit(1, 'mm')
                    ,legend.background = element_rect(fill = "white", size = 0.4, linetype = "solid", colour = "black")
                )
        + scale_fill_manual(values = alpha(c("#03af7a","#fff100","#005aff","#4dc4ff","#ff4b00","#ff8082","#804000","#f6aa00","#990099"),0.6))
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/4cb4c84e-c0fb-42b7-75a0-480193ab3921.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/e82a9c7e-0aba-67d2-e5e6-c9234c343602.png)


### 単色の場合

```R:グラフの配色を変える（単色の場合）
library(dplyr)
library(ggplot2)
library(cowplot)
(test_data %>%
    group_by(x) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n))
        + geom_bar(stat = "identity",color = "black",size = 0.3, fill = alpha("#03af7a",0.6))
        + labs(caption = "テストデータ")
        + ylab("件数")
        + xlab("x値")
        + theme_cowplot()
        + theme(    plot.caption = element_text(hjust = 0.5, size = 14)
                    ,legend.margin = margin(7, 7, 7, 7, unit = "pt")
                    ,legend.title = element_blank()
                    ,legend.position = c(0.5,1)
                    ,legend.justification = c(0,1)
                    ,legend.direction = "horizontal"
                    ,legend.spacing.x = unit(1, 'mm')
                    ,legend.background = element_rect(fill = "white", size = 0.4, linetype = "solid", colour = "black")
                )
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/7798a3c0-21b5-e6ea-fe3c-b0620ef6f573.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/ece93a32-1585-480b-174e-831af5f21ed0.png)


## デフォルトにしちゃえ＆コピペ用（最終版）
毎回、 `theme_cowplot()` とか `theme()` とか書くの面倒なので、デフォルトにしちゃいます。コピペ用コードは以下のような感じでしょうか。

```R:デフォルトにしちゃえ＆コピペ用（最終版）
library(dplyr)
library(ggplot2)
library(cowplot)

#テーマを変更
theme_set(
    theme_cowplot() %+replace% 
    theme(
        plot.caption = element_text(hjust = 0.5, size = 14)
        ,legend.margin = margin(7, 7, 7, 7, unit = "pt")
        ,legend.title = element_blank()
        ,legend.position = c(0.5,1)
        ,legend.justification = c(0,1)
        ,legend.direction = "horizontal"
        ,legend.spacing.x = unit(1, 'mm')
        ,legend.background = element_rect(fill = "white", size = 0.4, linetype = "solid", colour = "black")
        )
    )
#配色を変更
update_geom_defaults("bar", list(color = "black", size=0.3, fill = alpha("#03af7a",0.6)))
scale_fill_discrete <- function(...) {
   scale_fill_manual(..., values = alpha(c("#03af7a","#fff100","#005aff","#4dc4ff","#ff4b00","#ff8082","#804000","#f6aa00","#990099"),0.6))
} 
```

## その他メモ
あのパラーメーターが思い出せないってこととか、結構あるのでメモです。

### テーマのパラメーター
テーマのパラメーターはいっぱいあって、探すの結構大変なんですが、探せるとかなり自分の理想に近づけられたりします。私は以下のサイトあたりを参考にしています。

- Modify components of a theme, https://ggplot2.tidyverse.org/reference/theme.html

### SVGフォーマットで保存
SVG フォーマットで保存したい時は拡張子を変えるだけだとタイトルや軸が思ったのと違ったりしちゃって悩んだあげく、 PNG でいいかってなっちゃうのでメモです。  `ggsave(..., device = grDevices::svg)` とすれば良いようです。

```R:SVGで保存
ggsave(..., device = grDevices::svg)
```

### 縦軸の下方を省略したい
めちゃめちゃ稀なんですが以下みたいな感じに縦軸の50未満を省略して差をわかりやすくしたい時ってあると思います。これも使う機会がなさすぎて使おうと思った時に思い出せないのでメモです。 `scales` パッケージを使って、`scale_y_continuous(..., oob=rescale_none)` って指定すれば良いようです。。他にも方法あったような気がするんですが…、思い出せない、ってことで。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/d4ddecdf-a039-dc02-d4d4-72557ffa4eda.png)


```R:50未満を省略
library(scales)
(test_data %>%
    group_by(x) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n))
        + geom_bar(stat = "identity")
        + labs(caption="テストデータ")
        + ylab("件数")
        + xlab("x値")
        + scale_y_continuous(limits = c(50, NA), oob = rescale_none)
        + theme(legend.position = "none")
) %>%
print
```

### 凡例を変更したい
これもそうしたい時結構あるんだけど、どれ使うんだったかなーってすぐ忘れちゃうからメモ。

```R:凡例を変更
(test_data %>%
    group_by(x,area) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n, fill = area))
        + geom_bar(stat = "identity")
        + labs(caption = "テストデータ")
        + ylab("件数")
        + xlab("x値")
    + scale_fill_discrete(labels=c("A"="America","B"="Boston","C"="Canada","D"="Denmark"))
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/a94d885a-0e82-0307-2778-da4d8c4a14af.png)


### x軸を変更したい
これもちょくちょくあるんだけど、どれ使うんだったかなーってすぐ忘れちゃうからメモ。

```R:x軸を変更
(test_data %>%
    group_by(x,area) %>% summarise(n = n()) %>%
    ggplot(aes(x = x, y = n, fill = area))
        + geom_bar(stat = "identity")
        + labs(caption = "テストデータ")
        + ylab("件数")
        + xlab("x値")
    + scale_x_discrete(label=c("1"="foo", "2"="bar", "3"="baz", "4"="qux", "5"="quux", "6"="corge", "7"="grault", "8"="garply", "9"="waldo", "10"="fred", "11"="plugh", "12"="xyzzy", "13"="thu"))
    + scale_fill_discrete(labels=c("A"="America","B"="Boston","C"="Canada","D"="Denmark"))
) %>%
print
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128670/ceca188e-3ca1-2e03-746d-97fbbf59fa6e.png)