Rで棒グラフ

R（ggplot2）による棒グラフのあれこれです。

ライブラリを読み込み

```R:R
library(ggplot2)
library(dplyr)
```

# 基本
`geom_col`を呼び出します。`x`および`y`にカラムを指定します。 

## 縦棒グラフ
```R:R
ggplot(BOD, aes(x=Time, y=demand)) +
  geom_col()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/cb309c92-f8e8-ba79-0879-ff4d0ae0e6b0.png)


## 横棒グラフ
```R:R
ggplot(BOD, aes(x=demand, y=Time)) +
  geom_col()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/922303a9-0d07-f0cc-5af1-184e31bcb375.png)

## （参考）連続値とカテゴリによるx軸の違い
上記は、`Time`が連続値で、かつ'Time==6'のエントリが存在しないため、該当する棒は歯抜けとなります。
`Time`をカテゴリ値に変換することで、'Time==6'の描画対象ではなくなります。

```R:R
ggplot(BOD, aes(x=factor(Time), y=demand)) +
  geom_col()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/21b4b0ae-3e9d-a1b7-c27e-15867f88ab6b.png)


# 色を指定する
## 枠線と塗りつぶしを指定
```R:R
ggplot(BOD, aes(x=Time, y=demand)) +
  geom_col(fill="lightgreen", colour="black")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/c49703ad-f109-04d6-3278-adad764be1ae.png)


# 棒のサイズを調整する
```R:R
ggplot(BOD, aes(x=Time, y=demand)) +
  geom_col(width=0.4)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/d6d21476-9a35-7de8-d6e2-24f1db502327.png)


# カラーパレットでグラデーションを指定
```R:R
df <- data.frame(
  name=c("A", "B", "C", "D", "D", "E", "F"),
  value=c(0.87, 0.34, 0.12, -0.19, -0.25, -0.45, -0.79))

ggplot(df, aes(x=value, y=name, fill=value)) +
  geom_col() +
  scale_y_discrete(limits = rev(levels(df$name))) +
  scale_fill_gradient(high="skyblue", low="salmon")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/cd79966b-9840-50df-9f17-abe42e055f9c.png)


# データの個数を数える棒グラフ
`geom_bar()`を呼び出します。`y`には何も指定しません。

```R:R
ggplot(iris, aes(x=Species)) +
  geom_bar()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/1e4b9c00-6df1-13c9-0e69-c1a5b1b3fb87.png)


# データの平均値を示す棒グラフ
`stat_summary()`を呼び出し、平均値を計算します。

```R:R
ggplot(iris, aes(x=Species, y=Sepal.Length)) +
  stat_summary(fun = mean, geom = "bar")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/04293654-e1b4-f359-03e9-1d2dc8480a35.png)


# 変数でグループ化して描画する
* データ準備

```R:R
df <- data.frame(Titanic) %>%
  group_by(Survived, Class) %>%
  summarize(n=n(), mean=mean(Freq))
```
  
## それぞれを独立して描く
```R:R
ggplot(df, aes(x=Class, y=mean, fill=Survived)) +
  geom_col(position="dodge")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/68e4a09b-10a4-6a45-0c73-56cd189b6db2.png)


## 積み上げて描く
```R:R
ggplot(df, aes(x=Class, y=mean, fill=Survived)) +
  geom_col(position="stack")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/31e3dccb-2286-a4e3-c9ed-237cb9067716.png)


## 割合で描く
```R:R
ggplot(df, aes(x=Class, y=mean, fill=Survived)) +
  geom_col(position="fill")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/6fcd87d5-21fa-0ce8-dd5b-0f4c4ab4ce46.png)

## 複数グラフに分けて描く
```R:R
ggplot(df, aes(x=Class, y=mean, fill=Survived)) +
  geom_col() +
  facet_grid(Survived~ .)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/51d9799e-ebe1-1157-e737-9107140c2206.png)

## 特定の棒だけ異なる色にする
```R:R
df <- mutate(df, focus=ifelse((Class == "Crew") & (Survived == "No"), T, F))

ggplot(df, aes(x=Class, y=mean, group=Survived, fill=focus)) +
  geom_col(position="dodge", colour="white") +
  scale_fill_manual(values=c("grey40", "pink"))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/4de5f126-e1cf-5479-b96b-59c75cde07b5.png)

# 正負で分岐させた色を塗る
```R:R
df <- mtcars %>%
  scale() %>%
  data.frame() %>%
  mutate(positive=mpg>0)

ggplot(df, aes(x=rownames(mtcars), y=mpg, fill=positive)) +
  geom_col() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/46df12e7-fa36-209b-5425-88d92234ce74.png)

# 棒ごとのラベルを付加する
```R:R
ggplot(BOD, aes(x=Time, y=demand)) +
  geom_col() + 
  ylim(0,22) + # これを入れないとラベルがグラフ(上)をはみ出してしまう
  geom_text(aes(label=demand), vjust=-1.5)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/fa4480ca-afaa-e78f-fe25-5f1417141de4.png)