ggplot導入の導入　-習うより慣れる編①

この投稿はRの基本グラフィクス以上に自由度が高く、かつ時間効率を高めてくれる（と評判の）ggplot2による作図を投稿主が導入するログです。

なお、描画パッケージとしては、ggplot2とlatticeがあるとのことですが、機能数と人気の双方で前者が圧倒的です。

※ 本稿は、[みんなのR 第2版] (https://www.amazon.co.jp/dp/B07MLQ6XWJ/ref=cm_sw_r_tw_dp_U_x_QefLEbEBC4F)　7章を基に作成しています。



##ggplot2の考え方

ggplot2の基本的なシンタックス構造は、
・ggplot関数からはじまり、第1引数としてデータを指定する
・”＋”記号で、レイヤー（層）を追加していく

以下で、いくつかの例を実践します。
その前に、ggplot2内にあるサンプルデータ、"diamonds”を取得します。

```R:R
#ggplot2のライブラリをロード
> library(ggplot2)

#diamonds データの取得、head()関数で表示
> data(diamonds)
> head(diamonds)

# A tibble: 6 x 10
  carat cut       color clarity depth table price     x     y     z
  <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
```

なお、基本グラフィクスでのヒストグラム、散布図、箱ひげ図の描画は下記の通り。

```R:R

hist(diamonds$carat, main = "Carat Histogram", xlab = "Carat")

plot( price ~ carat, data = diamonds)

boxplot(diamonds$carat)

```



##ggplot2を使用したヒストグラムと密度推定結果の描画

まずは、同じdiamondsデータでヒストグラムを描画する

```R:R

#ggplot関数で使用するデータを指定
#geom_histogram関数でx軸のマッピングを指定
ggplot( data = diamonds) + geom_histogram(aes ( x = carat))

```
描画結果はこちら

![plot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/0e474443-91cc-127f-b43d-3878c52bceff.jpeg)


ヒストグラムは離散的な記述であるので、これを連続的な記述にするために密度推定を行って、その結果を描画する。
（厳密には1次元カーネル密度推定を実施している）

```R:R
#geom_histogramに似た表現で、密度描画を実行する関数 geom_density
#fill引数は密度を表示する色指定
ggplot( data = diamonds) + geom_density( aes (x= carat), fill = "grey50")
```

推定結果はこちら。

![karnel.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/fa7e6154-af9f-0339-0c24-14bf4c5e1e1f.jpeg)


##ggplot2 を使用した散布図

```R:R
#冒頭のデータ宣言をオブジェクト変数としておくと便利
g<- ggplot( diamonds, aes (x= carat, y=price))

#colorと言うデータを基にプロットの色が指定され、凡例が自動的に表示される
g+ geom_point(aes(color = color))

````
![color scatter.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/057dc395-7fcc-def4-3d15-843538aacabe.jpeg)

また、層別に表示する機能もあり、それが、facet_wrap関数、facet_grid関数である。

```R:R
#colorデータで層別に表示
g+ geom_point(aes(color = color))+ facet_wrap(~color)
```
![facetwrap scatter.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/924379ca-480a-9e69-2d1b-031d46c7109f.jpeg)

```R:R
#cutとclarityの種類によって層別されたデータのcarat vs　priceの散布図を描きたいとき
#Grid表示という

g+ geom_point(aes(color = color))+ facet_grid(cut~clarity)
```
![cut clarity.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/cfc36987-37fb-8eed-baa9-fd37eb8a3c20.jpeg)


このように　ggplot関数でデータを指定、geom関数とfacet関数で層別やグリッド表示などの操作ができる。
（色の変化は後述・・・？）


##ggplot2の箱ひげ図、ヴァイオリンプロット

個人的に一番使う機会があるのではと期待するトピックです。
これまでと同じく　diamondsデータを使って、箱ひげ図・Box-plotを実行していきます。

```R:R

ggplot(diamonds, aes(y=carat, x=1)) + geom_boxplot()
````
![simple boxplot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/f4dff3ed-1d02-c68e-494c-6f604303dab1.jpeg)


```R:R

ggplot(diamonds, aes(y = carat,x=cut)) + geom_boxplot()

```
![rayer box plot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/d1cbc88c-2d01-100c-9523-d23012fb1448.jpeg)


```R:R
ggplot(diamonds, aes(y = carat,x=cut)) + geom_violin()
```
![boxplot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/d3c7efa3-32a6-e9d4-c426-c5d566c0d068.jpeg)

```R:R
#　ヴァイオリンの上に、ポイントデータを表示
ggplot(diamonds, aes(y = carat,x=cut)) + geom_violin() + geom_point()
#　ポイントデータの上に、ヴァイオリンを表示
ggplot(diamonds, aes(y = carat,x=cut)) + geom_point() + geom_violin()
```

![point on violin.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/b97e0afc-059f-b106-5e24-c2b8732d0a35.jpeg)
![violin on point.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/5a41a3ea-10e1-5198-14dc-739289d1e74b.jpeg)


##参考文献
[みんなのR 第2版](https://www.amazon.co.jp/dp/B07MLQ6XWJ/ref=cm_sw_r_tw_dp_U_x_QefLEbEBC4FH3)