6.3 棒グラフ
ggplot2で棒グラフを作成するにはgeom_bar()
関数を使います。棒グラフは、質的変数に対する頻度や比例尺度での集計値を示すグラフです。標準では、aesとして1つの質的変数のみを指定します。例えば、mpg
データでclass
ごとの度数を棒グラフにしたい場合は次のようにします。
ggplot(mpg, aes(x = class)) +
geom_bar()
散布図の場合は、x
とy
に指定された変数の値がそのままプロットされましたが、棒グラフの場合は、指定した質的変数(class
)の度数を集計してからプロットするという流れになっています。これは、ggplot2のグラフ描画関数に連動する統計変換(Statistical Transformation)が実行される仕組みになっているためです。棒グラフの場合は度数の計算(count
)ですが、ヒストグラムの場合は階級ごとの度数(bin
)、箱ひげ図の場合は分位点(boxplot
というように、標準での統計処理が定められています。これらは標準設定であり、データの与えられ方によっては変更すべき場合があります。例えば、以下のように、度数がすでに計算されており、個人ごとのデータがないような場合には、統計変換をしない(identity
)設定にして、aesのx
とy
にそれぞれ、質的変数と度数を与えることによって棒グラフを描画することができます5。
<- data.frame(
fwu 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
)を描画することができます。この場合、aesのfill
に塗り分けたい(層別したい)質的変数を指定します。例えば集合縦棒グラフの場合は以下のようにします。
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
を指定せずにaesのfill
を指定すると以下のように、積み上げ縦棒グラフが描画されます。
ggplot(mpg, aes(class, fill = drv)) +
geom_bar()
6.3.2 カテゴリ(因子型の水準)の並べ替え
geom_bar()
関数は、x
軸の質的変数を因子型に設定されたカテゴリの順番で描画します。その変数が名義尺度の場合は、頻度の順番で並べ替えた方がいいです。これを簡単に行うには、forcatsパッケージ(これもtidyverseに含まれています)を使います。例えば、mpg
でclass
の頻度順に因子型の水準の順番を並べ替えるには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
を降順で並べ替えるようにしているからです。
散布図を描画する
geom_point()
の標準の統計変換はidentity
となっています。↩︎