ggplot2によるグラフ描画覚書

# 背景
Oreillyの「Rグラフィックスクックブック」をもとにグラフ描画方式の習得を行っていたところ、ggplot2のバージョンが上がったためか、本の記述と実際の動作する命令とに差が出てきました。
備忘録として動作する命令をまとめることにします。

# 環境
* OS: Windows 10(64bit)
* R: Ver3.4.4
* ggplot2: Ver2.2.1

# 棒グラフ
qplot()では、statがdeprecatedになりました。
そこで、geom="col"を使用します。

```R:棒グラフ.R
# エラー
> qplot(BOD$Time, BOD$demand, geom="bar", stat="identity")
Error: stat_count() must not be used with a y aesthetic.
In addition: Warning message:
`stat` is deprecated 

# 書き直し後
> qplot(BOD$Time, BOD$demand, geom = "col")
```

「棒グラフのグループ化」では、geom_bar()の引数statのデフォルト値が"count"であることで本の通りではエラーとなります。
明示的に"identity"を指定します。

```R:棒グラフグループ化.R
# エラー
> ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) + geom_bar(position = "dodge")
Error: stat_count() must not be used with a y aesthetic.

# 書き直し後
> ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) + geom_bar(stat="identity", position = "dodge")
```

積み上げ棒グラフの積み上げ順序を入れ替えるとき、エステティック属性のorder指定はdeprecateされました。
代わりに、forcatsパッケージのfct_rev指定を使用します。
凡例名を合わせるため、labs(fill="")を使用しています。

```R:積み上げ順序.R
# 積み上げ入れ替え前
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) + geom_bar(stat = "identity")

# クックブックの記載
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar, order=desc(Cultivar))) + geom_bar(stat = "identity")

# 書き直し後
library(forcats)
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=fct_rev(Cultivar))) + geom_bar(stat = "identity") + labs(fill="Cultivar")
```
| 積み上げ入れ替え前 | クックブックの記載(順序が変わっていない) | 書き直し後 |
|:---------------------:|:---------------------:|:---------------------:|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/52878/eba62bd3-4687-ae33-eec8-7a45bb9653e8.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/52878/6fd0d9cd-8ae5-f571-dbbf-3c65930fef12.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/52878/0161c3c4-9973-d9aa-599f-58b6a061b696.png) |


# 関数曲線
上に同じくqplot()でのstatがdeprecatedとなったのを受けて、書き方が変わります。
が、この書き直しは関数曲線っぽくないかもしれません。

```R:関数曲線.R
> myfun <- function(xvar) {
  1 / (1 + exp(-xvar + 10))
}

# エラー
> qplot(c(0, 20), fun=myfun, stat="function", geom="line")
Warning: Ignoring unknown parameters: fun
Error: geom_line requires the following missing aesthetics: y
In addition: Warning message:
`stat` is deprecated 

# 書き直し後
> x<-c(0:20)
> qplot(x, myfun(x)) + geom_line()
```

# 散布図
散布図で使われることの多いと思われるフィッティング。
stat_smooth()を使う際のオプションの指定方法が変わっています。
methodで指定した関数に渡す引数を、method.argsオプションでリストオブジェクト形式で指定します。

```R:フィッティング.R
# 事前準備
> library(MASS)
> b <- biopsy
> b$classn[b$class=="benign"] <- 0
> b$classn[b$class=="malignant"] <- 1

# エラー
> ggplot(b, aes(x=V1, y=classn)) +
  geom_point(position = position_jitter(width = 0.3, height = 0.06), alpha=0.4, shape=21, size=1.5) +
  stat_smooth(method = glm, family=binomial)
Warning: Ignoring unknown parameters: family

# 書き直し後
> ggplot(b, aes(x=V1, y=classn)) +
  geom_point(position = position_jitter(width = 0.3, height = 0.06), alpha=0.4, shape=21, size=1.5) +
  stat_smooth(method = glm, method.args = list(family="binomial"))
```

# ファセット
サブグラフを複数組み合わせて1つのグラフを構築する方法としてファセットがあります。
ファセットのテキストラベルを書き替える方法として、levels()関数が用いられていますが、それではうまく書き換わりませんでした。

```R:ファセットラベル名.R
# 事前準備
mpg2 <- mpg

# ファセットラベル名を変更できなかった方法
levels(mpg2$drv)[levels(mpg2$drv)=="4"] <- "4wd"
levels(mpg2$drv)[levels(mpg2$drv)=="f"] <- "Front"
levels(mpg2$drv)[levels(mpg2$drv)=="r"] <- "Rear"
ggplot(mpg2, aes(x=displ, y=hwy)) + geom_point() + facet_grid(drv ~ .)

# ファセットラベル名を変更できた方法
mpg2$drv[factor(mpg2$drv)=="4"] <- "4wd"
mpg2$drv[factor(mpg2$drv)=="f"] <- "Front"
mpg2$drv[factor(mpg2$drv)=="r"] <- "Rear"
ggplot(mpg2, aes(x=displ, y=hwy)) + geom_point() + facet_grid(drv ~ .)
```

|クックブックの記載(ラベル名変更なし)|書き直し後|
|:---------------------:|:---------------------:|
|![Facet_before.png](https://qiita-image-store.s3.amazonaws.com/0/52878/1238759e-12b5-63ff-00be-19a2566f4f87.png) | ![Facet_after.png](https://qiita-image-store.s3.amazonaws.com/0/52878/0a2596af-d8b0-4007-4510-86403a6cfe26.png) |