ggplot2で標準偏差付きの折れ線グラフを描く

[ggplot2](https://ggplot2.tidyverse.org)で標準偏差付きの折れ線グラフを描きます。
今回は、イヌビエの耐寒性の実験から得られた[CO2データセット](https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/zCO2.html)を用いて折れ線グラフを作成します。
イヌビエは、私が研究しているイネと同じイネ科の植物です。
実行環境：MacBook Air M1, 2020

# RとRStudioのインストール
以下のURLから、RとRStudioをインストールします。
https://posit.co/download/rstudio-desktop/
インストール方法は以下のURLの記事にわかりやすく書かれています。
https://qiita.com/azzeten/items/1031c788ed093d3b3946

# ggplot2のインストールと読み込み
ggplot2のインストールと読み込みを行います。

https://ggplot2.tidyverse.org

RStudioを起動し、以下のコードを実行します。
```R
install.packages("tidyverse")
library(ggplot2)
```
次回からは、以下のコードのみを実行します。
```R
library(ggplot2)
```
これにより、ggplot2を読み込むことができます。

# データの読み込み
Rのデータセットから[CO2](https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/zCO2.html)を読み込みます。
```R
# データの読み込み
data = CO2
head(data)
```
```
  Plant   Type  Treatment conc uptake
1   Qn1 Quebec nonchilled   95   16.0
2   Qn1 Quebec nonchilled  175   30.4
3   Qn1 Quebec nonchilled  250   34.8
4   Qn1 Quebec nonchilled  350   37.2
5   Qn1 Quebec nonchilled  500   35.3
6   Qn1 Quebec nonchilled  675   39.2
```
Qn1-3はQuebecのnonchilled（低温処理なし）、Qc1-3はQuebecのchilled（低温処理）、Mn1-3はMississippiのnonchilled（低温処理なし）、Mc1-3はMississippiのchilled（低温処理）です。

# 折れ線グラフの作成
## シンプルな折れ線グラフを作成する
conc列をx軸、uptake列をy軸として折れ線グラフを作成します。
```R
ggplot(data, aes(x = conc, y = uptake)) + geom_line()
```
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/a14c23ae-2053-cc58-6034-be7aef7afe22.png)

これでは情報を読み取ることができません。

## facet_wrap() で種類ごとのグラフを作成する
[facet_wrap()](https://ggplot2.tidyverse.org/reference/facet_wrap.html)を用いて、Plantの種類ごとのグラフを作成します。
```R
ggplot(data, aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant))
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/ac8b11d1-3cab-4471-5e0e-279d8bef3b9b.png)

3列×4行のグラフにしてみます。
```R
ggplot(data, aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant), nrow = 4)
```
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/911f1c56-a405-dd2d-0060-d0bdb1d891b9.png)

3列×4行のグラフになりましたが、Qn2の下にQc3があったり、Mn3の下にMc2があったり、ラベルの順番がバラバラであることがわかります。

## ラベルの順番を揃える
```R
levels(data$Plant)
```
```
 [1] "Qn1" "Qn2" "Qn3" "Qc1" "Qc3" "Qc2" "Mn3" "Mn2" "Mn1" "Mc2" "Mc3" "Mc1"
```
```R
levels(data$Plant) <- c("Qn1", "Qn2", "Qn3", "Qc1", "Qc2", "Qc3", "Mn1", "Mn2", "Mn3", "Mc1", "Mc2", "Mc3")
levels(data$Plant)
```
```
 [1] "Qn1" "Qn2" "Qn3" "Qc1" "Qc2" "Qc3" "Mn1" "Mn2" "Mn3" "Mc1" "Mc2" "Mc3"
```
ラベルの順番を揃えることができました。
もう一度グラフを作成します。
```R
ggplot(data, aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant), nrow = 4)
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/cb58b2db-9c4c-ef4f-eab1-937c85b7f5ca.png)

ラベルの順番が揃ったグラフを作成することができました。

## データを抽出してグラフを作成する
Qn1-3、Qc1-3のデータを抽出してグラフを作成します。
```R
ggplot(data[1:42,], aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant))
```
![Rplot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/9c9ef24f-f0ed-a1f9-229b-004bdd3b25ac.png)

Mn1-3、Mc1-3のデータを抽出してグラフを作成します。
```R
ggplot(data[43:84,], aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant))
```
![Rplot04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/885fe0a7-693a-a6ea-cd12-afe731686a4c.png)

Quebecごと、Mississippiごとにグラフを作成することができました。
2つのグラフでy軸のスケールが揃っていないことがわかります。

## y軸のスケールを指定する
[scale_y_continuous()](https://ggplot2.tidyverse.org/reference/scale_continuous.html)を用いて、y軸のスケールを指定します。
```R
ggplot(data[1:42,], aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant)) + 
  scale_y_continuous(limits = c(9, 46))
```
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/8613c977-25d9-bb0b-3e9e-60357ba24c7f.png)


```R
ggplot(data[43:84,], aes(x = conc, y = uptake)) + geom_line() + 
  facet_wrap(vars(Plant)) + 
  scale_y_continuous(limits = c(9, 46))
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/e7ae9184-12c4-389c-be23-17257f285c4d.png)

2つのグラフでy軸のスケールを揃えることができました。
Quebecに比べて、Mississippiでは低温処理なしと低温処理でuptake（二酸化炭素取り込み）の差があることがわかります。

## 平均値と標準偏差を求める
データセットをもう一度確認します。
```R
head(data)
```
```
  Plant   Type  Treatment conc uptake
1   Qn1 Quebec nonchilled   95   16.0
2   Qn1 Quebec nonchilled  175   30.4
3   Qn1 Quebec nonchilled  250   34.8
4   Qn1 Quebec nonchilled  350   37.2
5   Qn1 Quebec nonchilled  500   35.3
6   Qn1 Quebec nonchilled  675   39.2
```

[summarize()](https://dplyr.tidyverse.org/reference/summarise.html)を用いて、Plant、Type、Treatmentが同じ行のuptakeの平均値と標準偏差を求めます。
Plant列は、Qn1-3をQn、Qc1-3をQc、Mn1-3をMn、Mc1-3をMcとします。
```R
install.packages("dplyr")
library(dplyr)

data2 <- data %>%
  mutate(Plant = gsub("(Qn|Qc|Mn|Mc)[1-3]", "\\1", Plant),
         Plant = factor(Plant, levels = c("Qn", "Qc", "Mn", "Mc"))) %>%
  group_by(Plant, Type, Treatment, conc) %>%
  summarize(mean_uptake = mean(uptake), sd_uptake = sd(uptake))

data2 = as.data.frame(data2)

head(data2)
```
```
  Plant   Type  Treatment conc mean_uptake sd_uptake
1    Qn Quebec nonchilled   95    15.26667  1.446836
2    Qn Quebec nonchilled  175    30.03333  2.569695
3    Qn Quebec nonchilled  250    37.40000  2.762245
4    Qn Quebec nonchilled  350    40.36667  2.746513
5    Qn Quebec nonchilled  500    39.60000  3.897435
6    Qn Quebec nonchilled  675    41.50000  2.351595
```
uptakeの平均値と標準偏差を求めることができました。

## 平均値と標準偏差で折れ線グラフを作成する
まず、平均値で折れ線グラフを作成します。
```R
ggplot(data2, aes(x = conc, y = mean_uptake)) + geom_line() + 
  facet_wrap(vars(Plant))
```
![Rplot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/bebe2a0a-48bc-68d1-d613-d73042d7155e.png)

[geom_ribbon()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html)を用いて、標準偏差付きの折れ線グラフを作成します。

```R
ggplot(data2, aes(x = conc, y = mean_uptake)) + 
  geom_ribbon(aes(ymin = mean_uptake - sd_uptake, ymax = mean_uptake + sd_uptake), fill = "grey70") +
  geom_line() + 
  facet_wrap(vars(Plant))
```
![Rplot03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/7f5357e7-f7f8-7fac-a56b-5a63a3baa99a.png)

Quebecでは低温処理なしと低温処理でuptakeの差があまりありませんが、Mississippiでは低温処理なしと低温処理でuptakeの差があることがわかります。

ggplot2で標準偏差付きの折れ線グラフを描くことができ、ggplot2が実験データを可視化できるツールであることがわかりました。
ggplot2には、レイヤーがわかりやすくまとめられているチートシートがあります。
以下のURLからアクセスすることができ、おすすめです。
https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf

# 参考文献
https://www.math.chuo-u.ac.jp/~sakaori/Rdata.html
https://qiita.com/hoxo_b/items/8ad3e9c688b8515bb906
https://qiita.com/Surku/items/ae16d444d6c22b0dc4e6