2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【R】データの可視化(棒グラフ)

Last updated at Posted at 2021-01-16

棒グラフの描き方

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

使用するパッケージ

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

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

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

データの読み込み

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

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

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

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

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

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 所属政党  日本語

データの整形

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

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

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

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

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

data_2005 <- data %>% 
  filter(year == 2005)

普通の棒グラフ

data_2005 %>% 
  ggplot(aes(x = party_jpn, 
             y = smd)) +
  geom_bar(stat = "identity") +
  labs(x = NULL, # X軸のラベル名を変える NULLを与えると無くなる
       y = "当選者数", # Y軸のラベル名を変える
       title = "2005年衆院選: 各政党の当選者数") # グラフにタイトルを付ける

image.png

棒の色を変える

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

棒の並び替え

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

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

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

data_2005 %<>% mutate(party_jpn = fct_reorder(party_jpn, smd, .desc = T)) 
data_2005 %>% 
  ggplot(aes(x = party_jpn, 
             y = smd)) +
  geom_bar(stat = "identity") +
  labs(x = NULL,
       y = "当選者数",
       title = "2005年衆院選: 各政党の当選者数") 

image.png

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

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

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

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

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

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

特定の棒の色を変える

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

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

data_2005 %<>% mutate(ldp = if_else(party_jpn == "自民党", 1, 0))
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

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

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

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

gghighlightを使った場合

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

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

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

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

描画範囲の設定

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

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

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

Xメモリの操作

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

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

Yメモリの操作

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

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

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

グラフを回転させる

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

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

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

実施年毎の棒グラフ

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

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

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

data %<>% mutate(year = fct_reorder(as.factor(year), year, .desc = F)) 
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

積み上げ棒グラフ

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

使用は非推奨です。

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

100%積み上げ棒グラフ

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


この記事のコードをまとめたものはGithubにあります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?