【R】データの可視化（棒グラフ）

# 棒グラフの描き方

```{r}
knitr::opts_chunk$set(warning = F,
                      message = F,
                      comment = "",
                      fig.align = "center",
                      fig.width = 8,
                      fig.height = 5)
```

# 使用するパッケージ

準備していないパッケージは`install.packages("packge_name")`でインストールする。

```{r}
# 使用するパッケージ
library(tidyverse) # データの整形から可視化まで
library(magrittr) # パイプ処理を使いこなすせ！
library(gghighlight) # 重要なデータを強調する

# ggplot2 の theme をあらかじめ設定しておく
theme_set(theme_minimal(base_size = 15))
```

# データの読み込み

今回使用するのは衆院選に出馬した各候補者のデータだ。

1996年から2017年までのデータが詰まっている。

```{r}
data <- read_csv("./data/House_of_Councilors_1996_2017.csv") # 1996年～2017年までの衆院選データ
```

## データ内の変数名を確認する

どんな変数があるか見てみよう。

```{r}
names(data)
```
```
 [1] "year"       "ku"         "kun"        "status"     "name"      
 [6] "party"      "party_code" "previous"   "wl"         "voteshare" 
[11] "age"        "nocand"     "rank"       "vote"       "eligible"  
[16] "turnout"    "exp"        "expm"       "vs"         "exppv"     
[21] "smd"        "party_jpn" 
```

各変数が意味するものは以下のようになっている。

|変数名    |内容    　|備考                                  |
|----------|----------|--------------------------------------|
|year      |実施年  　|                                      |
|ku        |都道府県  |                                      |
|kun       |区域    　|                                      |
|status    |現職か否か|0 = 新人・元, 1 = 現職                |
|name      |名前      |                                      |
|party     |所属政党  |ローマ字での略語                      |
|party_code|所属政党  |数字で通し番号                        |
|previous  |当選回数  |                                      |
|wl        |当落結果　|0 = 落選, 1 = 当選, 2 = 復活当選      |
|voteshare |得票率    |単位: %                               |
|age       |年齢      |                                      |
|nocand    |候補者数  |                                      |
|rank      |順位　　　|                                      |
|vote      |得票数　　|                                      |
|eligible  |有権者数  |                                      |
|turnout	 |投票率    |単位: %                               |
|exp	     |選挙費用  |単位: 円                              |
|expm      |選挙費用　|単位: 百万円                          |
|vs	       |得票割合  |小数で表記                            |
|exppv     |選挙費用  |単位: 円（有権者一人当たりの選挙費用）|
|smd	     |当落      |0 = 落選, 1 = 当選                    |
|party_jpn |所属政党　|日本語                                |

## データの整形

今回は当選者数を使って棒グラフを描いていく。

棒グラフは複数の属性を比較する際に使用する。例えば、各地の積雪量を比較する際に使用される。

今回は選挙データを使用するので、各政党の当選者数を可視化してみる。

```{r}
data %<>% 
  group_by(year, party_jpn) %>% # 年ごと、各政党ごとに処理を行う
  summarise(smd = sum(smd)) %>%  # 各政党の当選者数を計算
  filter(party_jpn %in% c("自民党", "民主党", "公明党")) %>% 
  as.data.frame() %>% # 一応
  drop_na() # naを落とす
```

また、2005年の衆院選データを可視化することとする。

```{r}
data_2005 <- data %>% 
  filter(year == 2005)
```

# 普通の棒グラフ

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn, 
             y = smd)) +
  geom_bar(stat = "identity") +
  labs(x = NULL, # X軸のラベル名を変える　NULLを与えると無くなる
       y = "当選者数", # Y軸のラベル名を変える
       title = "2005年衆院選: 各政党の当選者数") # グラフにタイトルを付ける
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/14778696-ce72-f301-2838-fb8573a944d1.png)

# 棒の色を変える

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,
             y = smd)) +
  geom_bar(stat = "identity",
           color = "black", # 棒の枠の色を変える
           fill = "orange") + # 棒の中の色を変える
  labs(x = NULL, 
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/d1761bce-e825-f41d-1890-492b46bceceb.png)

# 棒の並び替え

より見やすい棒グラフを作るのに、大きい順や小さい順に並び変えることは非常に有効だ。

`fct_reorder(x, y, .desc = T)`でYが大きい順にXを並び変える。

ggplot2のコード内で計算するのはおすすめしない。なるべくggplot2のコード外で計算を行う。

```{r}
data_2005 %<>% mutate(party_jpn = fct_reorder(party_jpn, smd, .desc = T)) 
```

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn, 
             y = smd)) +
  geom_bar(stat = "identity") +
  labs(x = NULL,
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/1a9b9151-b9d8-d03b-93af-c2e5335a7e51.png)

# Yの値をラベルで表示する

大きい順や小さい順に並び変えても細かい数値が読み取れるわけではない。

そのため、ラベルを付けるとより見やすい棒グラフになる。

また、`paste()`を使うと数値の後に単位を付けられる。

その場合は、`paste(smd, "人", sep = "")`を`label = `に代入する。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,
             y = smd)) +
  geom_bar(stat = "identity") +
  labs(x = NULL, 
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd), # ラベルの数値
             size = 8, # ラベルのサイズ
             position = position_stack(vjust = 0.5)) # ラベルの位置 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/915422d0-005c-34b4-4d1a-697e70d36438.png)

# 特定の棒の色を変える

図の中に、視線を集中させたい棒がある場合は色を活用しよう。

まずは、注目させたいものを1、それ以外を0とするダミー変数を作成する。

```{r}
data_2005 %<>% mutate(ldp = if_else(party_jpn == "自民党", 1, 0))
```

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) + 
  geom_bar(aes(fill = factor(ldp)), # ldpの値によって色を変える
           stat = "identity",
           show.legend = F) + # show.legend = Fでlegendを非表示に
  labs(x = NULL,
       y = "当選者数", 
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),                                  
             size = 8,                                                          
             position = position_stack(vjust = 0.5)) 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/c5e9cf38-ee9b-29a7-1fd9-68aedf1132c2.png)

有彩色と無彩色で色分けをすると、より棒を強調することができる。

今回は赤とグレーで色分けしてみた。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) + 
  geom_bar(aes(fill = factor(ldp)), 
           stat = "identity",
           show.legend = F) +
  labs(x = NULL,
       y = "当選者数", 
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),                                  
             size = 8,                                                          
             position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = c("grey","red")) # values = c("color0","color1")で色を選ぶ
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/62c07590-8830-198c-ff30-d2b4050ee598.png)

# gghighlightを使った場合

簡単にグラフの強調を行うパッケージとして`gghighlight`がある。

ただし、`gghighlight`はもっと大量のデータかつ、線グラフに使うほうが一般的だろう。

また、`scale_fill_manual()`を使えば色を選べる。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) + 
  geom_bar(aes(fill = party_jpn),
           stat = "identity",
           show.legend = F) +
  labs(x = NULL, 
       y = "当選者数", 
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),                                  
             size = 8,                                                          
             position = position_stack(vjust = 0.5)) +
  gghighlight(party_jpn %in% c("自民党", "民主党")) # gghighlight()の中に色々条件を入れる
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/e06502ab-f968-6249-153d-6c771f7ee560.png)

# 描画範囲の設定

棒グラフの上のほうが詰まりすぎると見えづらいことがある。

また、ラベルを棒の上に付けると見切れることがある。そういうときは描画範囲を調整する。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) +
  geom_bar(stat = "identity") + 
  labs(x = NULL,
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),                                  
             size = 8) +
  lims(y = c(0, 250)) # y軸を0～250まで表示する
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/dadeea7f-5ea9-1c29-fc59-a96818602654.png)

# Xメモリの操作

xがカテゴリカル変数の場合、このような工夫で図を分かりやすくできる。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) +
  geom_bar(stat = "identity") +       
  labs(x = NULL,
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),
             size = 8,                                                          
             position = position_stack(vjust = 0.5)) +
  scale_x_discrete(labels = c("自民党" = "自民党\n(346人)", # 自民党を自民党\n(候補者数)に
                              "民主党" = "民主党\n(299人)", # 民主党を民主党\n(候補者数)に
                              "公明党" = "公明党\n(52人)")) # 公明党を公明党\n(候補者数)に
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/5b120263-7980-68a1-8f06-b87460a8d3f9.png)

# Yメモリの操作

メモリの刻みを増やしたり、メモリの範囲を制限したりできる。

あくまでもメモリの調整なので、`xlim()`や`ylim()`とは別物だ。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) +
  geom_bar(stat = "identity") +       
  labs(x = NULL,
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),                                  
             size = 8,                                                          
             position = position_stack(vjust = 0.5)) +
  scale_x_discrete(labels = c("自民党" = "自民党\n(346人)", 
                              "民主党" = "民主党\n(299人)", 
                              "公明党" = "公明党\n(52人)")) + 
  scale_y_continuous(breaks = seq(0, 220, length = 12)) # メモリの範囲と刻みを決める
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/1dba5aba-69b3-c35a-a6d0-cf58c164395d.png)

# グラフを回転させる

xが増えると文字が重なって見えにくくなる。文字の角度を変えてもいいが、視認性が低下する。

そのため、グラフを回転することをおすすめする。

```{r}
data_2005 %>% 
  ggplot(aes(x = party_jpn,                  
             y = smd)) +
  geom_bar(stat = "identity") +       
  labs(x = NULL,
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd),                                  
             size = 8,                                                          
             position = position_stack(vjust = 0.5)) +
  coord_flip() # coord_flip()でグラフを回転させる。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/abaa7ac0-63d8-361a-a59b-8361f9df4c93.png)

# 実施年毎の棒グラフ

小規模な時系列データは棒グラフで良いだろう。

ただ、大規模な時系列データは素直に折れ線グラフを使ったほうが見やすい。

今回は折れ線グラフのほうが視認性が高いだろう。

```{r}
data %<>% mutate(year = fct_reorder(as.factor(year), year, .desc = F)) 
```

```{r}
data %>% 
  ggplot(aes(x = party_jpn,
             y = smd)) +
  geom_bar(aes(fill = party_jpn), 
           stat = "identity",
           show.legend = F) +
  labs(x = NULL,
       y = "当選者数", 
       title = "1996～2017年衆院選: 各政党の当選者数") +
  geom_label(aes(label = smd), 
             position = position_stack(vjust = .9),
             size = 3) + 
  facet_wrap(~ year) 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/33ad2bae-e810-89ca-9edb-c188ed36b862.png)

# 積み上げ棒グラフ

正直、積み上げ棒グラフ使うより折れ線グラフの方が視認性が高い。

使用は非推奨です。

```{r}
data %>% 
  ggplot(aes(x = year,
             y = smd)) +
  geom_bar(aes(fill = party_jpn), 
           stat = "identity") +
  labs(x = "実施年", 
       y = "当選者数",
       title = "1996～2017年衆院選: 各政党の当選者数",
       fill = NULL) + # fill = で生成されたlegendのタイトルを変更する
  geom_label(aes(label = smd,
                 group = party_jpn),
             size = 3,
             position = position_stack(vjust = 0.5)) +
  theme(legend.position = c(.06, .85)) # legendの位置を動かす
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/44e2b567-3c9b-c562-865c-d9550548318d.png)

# 100％積み上げ棒グラフ

```{r}
data %>% 
  ggplot(aes(x = year,
             y = smd)) +
  geom_bar(aes(fill = party_jpn), 
           stat = "identity",
           position = "fill") +
  labs(x = NULL, 
       y = "当選者数",
       title = "1996～2017年衆院選: 各政党の当選者割合",
       fill = NULL) +
  scale_y_continuous(labels = scales::percent) +
  theme(legend.position = "bottom") # legendの位置を動かす
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025774/e44d8b8a-6e9c-412a-d449-8e45e12c5b16.png)

<HR>

この記事のコードをまとめたものは[Github](https://github.com/FruitGranola/R_Barplot)にあります。