ggplotで共通の凡例を持った複数の図を並べる方法

## 目的
ggplotを用いて作った図を複数並べる時、凡例の扱いで悩むことが何回かあったので、メモがわりに書き残しておきます。
今回想定しているのは以下のようなケースです。

- ggplotを用いて複数の図を並べたい
- 共通するタイプの凡例を持つ
- `facet_grid`や`facet_wrap`を使えない事情がある（プロットするデータセットが大きすぎるとか、別々のオブジェクトとしてRDataに保存しているとか）

## データセット
　例として、`iris`データセットのこんなプロットを2つ並べます。
```r
pacman::p_load(tidyverse, ggpubr, lemon, patchwork)

data(iris)
g1 <- iris %>% 
  ggplot() +
  geom_point(
    aes(x = Sepal.Length, y = Petal.Length, color = Species)
  )

g2 <- iris %>% 
  ggplot() +
  geom_point(
    aes(x = Sepal.Width, y = Petal.Width, color = Species)
  )
```

## 1. ggpubr
`ggpubr`パッケージ内の`ggarrange`関数を`common.legend = TRUE`とすることで共通の判例を指定できます。
```r
example_ggpubr <- ggpubr::ggarrange(
  g1, g2, ncol = 2, common.legend = TRUE, legend = "right"
)
ggsave(example_ggpubr, file = "example_ggpubr.png", height = 4, width = 8)
```
![example_ggpubr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/b2f1cdfa-c23e-ac67-fe77-27520509501f.png)

## 2. gridExtra
`lemon`パッケージ内の`grid_arrange_shared_legend`関数を用いても共通の凡例を設定できます。
```r
example_lemon <- lemon::grid_arrange_shared_legend(
  g1, g2, ncol = 2, position = "right"
)
ggsave(example_lemon, file = "example_lemon.png", height = 4, width = 8)
```
1.とほぼ同じ図が表示されるので結果は割愛します。
　`lemon`パッケージは他にも`facet_`系のプロットの扱いなどに便利な関数群があつまったパッケージのような印象があります。

**参考** 
[lemonパッケージでggplotをいい感じに見せる](https://knknkn.hatenablog.com/entry/2020/04/29/032101)

## 3. patchwork
`patchwork`パッケージは[公式ホームページ](https://patchwork.data-imaginist.com)でも
> The goal of patchwork is to make it ridiculously simple to combine separate ggplots into the same graphic. 

と言っている通り、ggplotで作成したプロットを並べるのに特化したパッケージであり、実際、シンプルな記法とかなり自由度の高いレイアウトが可能なパッケージだと思います。
　`+`演算子と`plot_layout`関数を使うことで、
```r
example_patchwork <- g1 + g2 + plot_layout(guides = "collect")
```
![example_patchwork.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/79aec1a0-dba1-3898-b9c7-6398a315f462.png)

と、目的のプロットを得ることができます。
　また、`&`演算子を使うことで、複数のパネルに対して同時に体裁の変更などを適用することができます。
```r
g1 <- g1 + ggtitle("g1")
g2 <- g2 + ggtitle("g2")

example_patchwork <- g1 + g2 +
  plot_layout(guides = "collect") &
  theme_classic() &
  theme(
    axis.title.x = element_text(family = "serif", color = "white"),
    axis.title.y = element_text(family = "serif", color = "white"),
    plot.background = element_rect(fill = "navy"),
    plot.title = element_text(color = "white")
  )
ggsave(example_patchwork, file = "example_patchwork.png", height = 4, width = 8)
```
![example_patchwork.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/ae0a678c-b7d5-399d-0f0e-78113c3f0c45.png)

　さらに、以下のような連続値に関する凡例を持つプロットを並べる時には、
```r
g3 <- iris %>% 
  filter(Species == "setosa") %>% 
  ggplot() +
  geom_point(
    aes(x = Sepal.Length, y = Sepal.Width, color = Petal.Length)
  )

g4 <- iris %>% 
  filter(Species == "versicolor") %>% 
  ggplot() +
  geom_point(
    aes(x = Sepal.Length, y = Sepal.Width, color = Petal.Length)
  )

g5 <- iris %>% 
  filter(Species == "virginica") %>% 
  ggplot() +
  geom_point(
    aes(x = Sepal.Length, y = Sepal.Width, color = Petal.Length)
  )

example_345 <- g3 + g4 + g5
```
![example_345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/22239f1b-c1ac-9f54-9d04-e833a3fd36d5.png)

以下のように、カラーパレットの中で`limit`引数に値の範囲を指定することで、お好きなカラーパレットのお好きな範囲の中で凡例を作成することができます。もちろん`trans = "log"`を用いた対数変換なども可能です。

```r
example_345 <- example_345 +
  plot_layout(guides = "collect") &
  scale_color_viridis_c(
    name = "value",
    trans = "log",
    limits = range(iris$Petal.Length)
  )
ggsave(example_345, file = "example_345.png", height = 4, width = 12)
```
![example_345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478209/122e92ce-be2e-1b39-4489-6deafedaaf2d.png)

複数のggplotを並べたりまとめて編集したりする時には、個人的には`patchwork`が一番取り回しがいいのかなと感じています。

**参考**
[patchworkを使って複数のggplotを組み合わせる](https://qiita.com/nozma/items/4512623bea296ccb74ba)