Rで「あてはめ」ができるまでの道筋　ggplot2　① 

# ggplot2 ①
Rの標準的な機能でもグラフを描画することはできますが、ggplot2を使えば、より表現の幅が広がります。普通グラフと言えば、縦横2次元で描画するものですが、プロットする線の色を変えたり、点の大きさを変えたりなどのテクニックを使って3つ、4つの説明変数を表現することが可能になります。また、箱ひげ図、バイオリンプロットなど目的や状況に応じて様々な描画法が用意されています。

以下、いろいろ書きますが、基本は[Dr.Greg Martin](https://www.youtube.com/@RProgramming101/playlists)の動画を見て勉強したことです。ちょっとIrish accent が強くてしかも超早口で聞きづらいところもありますが、内容はとてもいいのでおすすめです。

## ライブラリtidyverse
ggplot2はtidyverseをインストールすれば、その中に含まれます。
```R
> install.packages('tidyverse') # 初回のみ
> library(tidyverse) # Rを立ち上げるたび
```
初回のみ、install.packages('tidyverse')が必要です。
tidyverseを用いるには、以後Rを立ち上げるたびにlibrary(tidyverse)が必要です。

### パイプオペレータ
ggplot2を始める前に、準備としてパイプオペレータを紹介しておきます。
%>% をパイプオペレータと言い、
```R
A %>% B(...)
```
という形で使います。Aの出力を関数Bの第1引数に代入する、という意味です。特にAの処理が複雑な場合、すっきりとして可読性が上がります。本稿の後半でも使用しています。簡単な例を挙げると
```R
> (1 + 2) %>% print()
[1] 3
```
のような形で使います。上述の説明と対照させると
<ul><li>(1 + 2)がAに
<li>print()がBに</ul>相当します。すなわち、1 + 2を計算してその出力(=3)をprint()の第1引数に代入するという意味になります。これは


```R
> print(1 + 2)
[1] 3
```
と書いたものと同じ意味になります。この例は単純ですがAの処理が複雑な場合、それをBの引数に入れてしまうと可読性が下がります。%>%を使ってAの処理を外に出しておくと読みやすいですね。

## データセット
Rには組み込みの(built-in)データセットがあり、自由に使うことができます。その一覧は
```R
> data()
```
で表示することができます。(こんな感じです↓)
![スクリーンショット 2023-10-12 20.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530897/9dd2aeaa-b56b-b1c2-7982-a449ad198ede.png)

以下では、このデータセットのデータを使いますので、誰でも特段ダウンロードすることなく利用することができます。

## 基本形
では本題のggplot2に移ります。ggplot2 では
  レイヤ1 +
  レイヤ2 +
  ...
  レイヤn
の形で、レイヤを積み重ねていくことが基本です。一例を示します。

### 基本形の例
以下では組み込みのデータセットBOD を利用します。
```R
ggplot(data = BOD, 
	mapping = aes(x = Time, 
                 y = demand)) + 
	geom_point(size = 5)
```
この例では
&nbsp;　ggplot レイヤ +
&nbsp;&nbsp;　　geom_point レイヤ　
の2層構造になっています。

実行結果は以下のようになります。
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530897/8e9fad00-e7dc-28ca-6477-b8a649603468.png)

この例のように、ggplot レイヤ + geom レイヤ(geometry レイヤ) が最小の構成単位となります。
この例ではgeometry レイヤとしてgeom_point(散布図)を選んだことになります。

ggplot レイヤの引数ですが、第1引数はデータ、第2引数はマッピング(つまりデータのうちx軸としてどの列を選ぶか、y軸としてどの列を選ぶかの紐付け)を指定します。この例の場合、データとして"BOD"、マッピングとしてはx軸には"Time列"、y軸には"demand列"を指定しています。

geom_point レイヤでは、第1引数で点の大きさを指定しています。

細かい注意点ですが、レイヤとレイヤをつなぐ「+」は、上のレイヤにつけてください。
つまり、以下の書き方だとエラーになります。
```R
# wrong example
ggplot(data = BOD, 
	mapping = aes(x = Time, 
                 y = demand))
	+ geom_point(size = 5)
```

ここで、ggplot レイヤの第1引数をパイプオペレータを用いて、以下のように指定することもできます。
```R
BOD %>%
ggplot(mapping = aes(x = Time, 
                 y = demand)) + 
	geom_point(size = 5)
```
この例では利点がよくわかりませんが、データにフィルタをかけるなど何らかの処理をしてggplot に代入する場合など複雑になったときにパイプオペレータを用いると可読性がグッと上がります。フィルタについては本稿では述べませんが、のちの稿で扱いたいと思います。

さらに、第2引数は以下のように簡略化できます。
```R
BOD %>%
ggplot(aes(Time, demand)) + 
	geom_point(size = 5)
```
ずいぶんと簡単になりましたね。慣れればこの書き方の方がずっと見やすいです。

### 保存の方法
さて、描いたグラフをファイルとして保存するには、以下のようにします。
```R
p <- BOD %>%
ggplot(aes(Time, demand)) + 
	geom_point(size = 5)
ggsave(file="./1-1.png", plot=p)	
```
つまり、描画したグラフをpというオブジェクトに代入し、ggsave() でpを保存します。
注意点としては
```R
p <- BOD %>%
ggplot(aes(Time, demand)) + 
	geom_point(size = 5) # ここに + はいらない
```
の部分が、「描画したグラフをpというオブジェクトに代入」する部分で
```R
ggsave(file="./1-1.png", plot=p)	
```
の部分が保存する部分であり、<font color="red">独立</font>しています。つまり、geom_point(size = 5) の後ろに「+」をつけてはいけません。

以上がggplot2 の最小の構成単位となります。
次回以降少しずつレイヤを増やしていき、複雑なグラフの描画を目指します。


## 参考文献
[Data visualisation using ggplot with R Programming](https://www.youtube.com/@RProgramming101/playlists) : Dr.Greg Martinが運営するYouTubeのチャンネルです。Martin さんはアイルランドのお医者さんのようです。リンク先の再生リストの中の"Data visualisation using ggplot..."にggplotに関するかなりいい動画が揃っています。

[Cheatsheet](https://github.com/tidyverse/ggplot2/tree/main#cheatsheet) : (公式)チートシートです。

トップページは[こちら](https://qiita.com/sflabtech/items/562dd78418926f00a0d5)