6.3 棒グラフ

ggplot2で棒グラフを作成するにはgeom_bar()関数を使います。棒グラフは、質的変数に対する頻度や比例尺度での集計値を示すグラフです。標準では、aesとして1つの質的変数のみを指定します。例えば、mpgデータでclassごとの度数を棒グラフにしたい場合は次のようにします。

ggplot(mpg, aes(x = class)) +
  geom_bar()

散布図の場合は、xyに指定された変数の値がそのままプロットされましたが、棒グラフの場合は、指定した質的変数(class)の度数を集計してからプロットするという流れになっています。これは、ggplot2のグラフ描画関数に連動する統計変換(Statistical Transformation)が実行される仕組みになっているためです。棒グラフの場合は度数の計算(count)ですが、ヒストグラムの場合は階級ごとの度数(bin)、箱ひげ図の場合は分位点(boxplotというように、標準での統計処理が定められています。これらは標準設定であり、データの与えられ方によっては変更すべき場合があります。例えば、以下のように、度数がすでに計算されており、個人ごとのデータがないような場合には、統計変換をしない(identity)設定にして、aesxyにそれぞれ、質的変数と度数を与えることによって棒グラフを描画することができます5

fwu <- data.frame(
  dept = c("国際教養学科", "環境科学科", "食・健康学科"),
  students = c(605, 283, 148)
)
fwu
##           dept students
## 1 国際教養学科      605
## 2   環境科学科      283
## 3 食・健康学科      148
ggplot(fwu, aes(dept, students)) +
  geom_bar(stat = "identity")

geom_bar()stat = "identity"とする代わりに、geom_col()を用いて、

ggplot(fwu, aes(dept, students)) +
  geom_col()

とすることもできます。例えば、構成比率を棒グラフにしたい場合は、以下のようにするとよいでしょう。

mpg %>% 
  group_by(class) %>% 
  summarise(n = n(), .groups = "drop") %>% 
  mutate(prop = n / sum(n)) %>% 
  ggplot() +
  geom_col(aes(class, prop))

6.3.1 帯グラフと集合縦棒グラフ

geom_bar()関数では、position引数を使うことによって、集合縦棒グラフ(position = "dodge")や帯グラフ(position = fill)を描画することができます。この場合、aesfillに塗り分けたい(層別したい)質的変数を指定します。例えば集合縦棒グラフの場合は以下のようにします。

ggplot(mpg, aes(class, fill = drv)) +
  geom_bar(position = "dodge")

また、帯グラフの場合は以下のようになります。

ggplot(mpg, aes(class, fill = drv)) +
  geom_bar(position = "fill")

geom_bar()関数におけるposition引数のデフォルト設定はstackであり、positionを指定せずにaesfillを指定すると以下のように、積み上げ縦棒グラフが描画されます。

ggplot(mpg, aes(class, fill = drv)) +
  geom_bar()

6.3.2 カテゴリ(因子型の水準)の並べ替え

geom_bar()関数は、x軸の質的変数を因子型に設定されたカテゴリの順番で描画します。その変数が名義尺度の場合は、頻度の順番で並べ替えた方がいいです。これを簡単に行うには、forcatsパッケージ(これもtidyverseに含まれています)を使います。例えば、mpgclassの頻度順に因子型の水準の順番を並べ替えるにはfct_infreq()関数を以下のように適用します。

ggplot(mpg, aes(fct_infreq(class))) +
  geom_bar()

一方、頻度を集計した後のfwuデータでは、因子型の水準を集計された別の変数(ここではstudents)の順番で並べ替えるようにします。この場合は、fct_reorder()関数を以下のように適用します。

ggplot(fwu, aes(fct_reorder(dept, -students), students)) +
  geom_bar(stat = "identity")

-studentsとなっているのは、fct_reorder()関数が昇順で並べ替えるため、studentsの符号を反転したものを昇順に並べ替えることで、studentsを降順で並べ替えるようにしているからです。


  1. 散布図を描画するgeom_point()の標準の統計変換はidentityとなっています。↩︎