Rのggplot2で棒グラフを作りたい!
エクセルなら棒グラフは簡単だけど、Rではどうやって作る?
そのような疑問にお答えします。
本記事の内容
この記事の内容は以下の通りです。
使用するデータセット
ggplot2パッケージに入っているmpgデータセットを使用して解説します。tidyverseパッケージをロードすると、ggplot2も一緒にロードされます。
# tidyverseをインストールしていない人はインストールから
install.packages("tidyverse")
# tidyverseをロード
library(tidyverse)
ggplot2の基本についてはこちらの記事もご参考ください。
Rのオススメ本
tidyverseパッケージを使ったオススメの実践入門書を紹介します。データの前処理や分析、可視化(ggplot2)が学べるのでとてもオススメ!
Rを使ってもっとデータ分析をしてみたい!と思わせてくれる一冊です。
ggplot2で棒グラフを作成する方法
ggplot2で棒グラフを作る時は、geom_bar()もしくはstat_summary()を使用します。
geom_barの基本構造
ggplot2(使用するデータセット)+
geom_bar(aes(x = 横軸, y = 縦軸),
stat = "統計的な処理方法",
fun = "変数に使用する関数")
作りたい棒グラフによってはxとyどちらか一方で良かったり、statやfunの記述が不要だったりします。
ではさっそく棒グラフを作っていきましょう!
データの"個数"を棒グラフ化する
データの個数をカウントし、棒グラフ化します。
ここでは、mpgデータセットのclass(車種)ごとのデータ個数についてグラフ化します。
ggplot(mpg)+
geom_bar(aes(x = class),
stat = "count")
データ個数をグラフ化する場合、aesの中身はx(またはy)のみになります。y = classにすると、縦横が入れ替わったグラフになります。
stat = "count"でデータの個数をカウントする、という意味になりますが、geom_barのstat引数はデフォルトで"count"になっているので省略することができます。
値をそのまま棒グラフ化する
エクセルでよく作られる以下のような表を棒グラフにする方法です。
下の表は、年と体重(* 架空です)なので、年ごとの体重の推移を棒グラフで示すグラフになります。
年 | 体重 |
---|---|
2020 | 50 |
2021 | 52 |
2022 | 55 |
上記のデータをRで作って棒グラフにしてみます。まずはデータセットを作成します。
#テストデータとして年(Year)とWeight(体重)のtestデータセットを作成
test <- tibble(Year = c(2020, 2021, 2022),
Weight = c(50, 52, 55))
test
# A tibble: 3 × 2
Year Weight
<dbl> <dbl>
1 2020 50
2 2021 52
3 2022 55
横軸Year, 縦軸Weightの棒グラフを作る場合は以下のコードになります。
ggplot(test)+
geom_bar(aes(x = Year,
y = Weight),
stat = "identity")
デフォルト表示をそのまま載せましたのでイケてないグラフですがご容赦ください。
値をそのまま棒グラフにする場合は、stat = "identity"を追加します。"identity"で"値をそのままグラフ化する”という意味になります。
水準ごとの"平均値"を棒グラフにする (geom_bar(), stat_summary())
こちらもエクセルでよく作られるグラフですね。エクセルの場合は水準ごとの平均値を算出してグラフ化しますが、Rの場合は必要ありません!
方法としては2つあります。
方法1: geom_bar()を使う方法
一つ目はこれまでと同様geom_barを使う方法です。
ここでは、class(車種)ごとのdispl(排気量)の平均値をグラフ化します。
ggplot(mpg)+
geom_bar(aes(x = class,
y = displ),
stat = "summary",
fun = "mean")
・stat = "summary"で"統計的な処理をする
・fun = "mean"で変数に対してmean関数を適用する
という意味になります。
方法2: stat_summary()を使う方法
二つ目の方法はstat_summary()を使う方法です。
stat_summary()では、引数geomで棒グラフ(bar)を指定します。funは先ほどと同じです。
ggplot(mpg)+
stat_summary(aes(x = class,
y = displ),
geom = "bar",
fun = "mean")
geom_barを使った場合と同じグラフになります。
そう思った人も少なからずいるのではないでしょうか。
私は心配性なので、ついつい思ってしまうタイプです笑
エクセルの計算結果を電卓で確認する人もいるそうですが、それと同じですよね。笑
ということで、本当に平均を示す棒グラフになっているのか確認しておきましょう。
(おまけ)本当に平均の棒グラフになっているか確認する
各class(車種)ごとのMean_displ(平均排気量)を算出します。
Ave <- mpg %>%
group_by(class) %>% # class別でグループ化する
summarise(Mean_displ = mean(displ)) # classごとのdisplにmean()を適用
Ave
> Ave
# A tibble: 7 × 2
class Mean_displ
<chr> <dbl>
1 2seater 6.16
2 compact 2.33
3 midsize 2.92
4 minivan 3.39
5 pickup 4.42
6 subcompact 2.66
7 suv 4.46
先ほど紹介した値をそのままグラフ化する方法を使ってグラフ化します。同じ色だと比較できないのでピンクにします。
なお、棒グラフの塗りつぶしはfillを使います。colorではないのでご注意ください。棒グラフの場合、colorは枠線の色を指定する時に使います。
ggplot(Ave)+
geom_bar(aes(x = class,
y = Mean_displ),
stat = "identity",
fill = "pink")
同じになっていることが確認できました!
平均値を別で算出してグラフ化してもいいですが、geom_barやstat_summaryなら一撃で平均値をグラフ化出来るのでラクチンです。
積み上げ棒グラフを作る
積み上げ棒グラフは、要素ごとの内訳を見ることができるグラフです。
ここではclass(車種)ごとのyear(年式)の内訳を見てみます。
ggplot(mpg)+
geom_bar(aes(x = class,
fill = factor(year)),
position = "stack")
position="stack"にすることで"積み上げ"の意味になります。
なお、position = "stack"はgeom_barのデフォルトなので省略することができます。
100%積み上げ棒グラフを作る
単なる積み上げでなく、要素ごとの割合が見られる100%積み上げグラフにしてみましょう。
class(車種)ごとのデータのうち、1999年および2008年の年式がどの割合で含まれているか確認します。
ggplot(mpg)+
geom_bar(aes(x = class,
fill = factor(year)),
position = position_fill())+
scale_y_continuous(labels = scales::percent)+
labs(y = "Percentage")
引数positionをposition_fill()にすることで100%積み上げグラフにすることができます。
また、y軸をパーセンテージにするためにscale_y_continuousでy軸のスケールをpercentに設定します。この部分を省略すると縦軸の最大値が1になります。
最後に、labs関数でy軸の名前を"Percentage"にしてグラフ完成です。
classごとの年式の割合はおおよそ半々になっていましたね。
要素が横並びになった棒グラフを作る
先ほどは積み上げグラフでclass(車種)ごとのyear(年式)の内訳を見ましたが、横並びの方が見やすいです。
ggplot(mpg)+
geom_bar(aes(x = class,
fill = factor(year)),
position = position_dodge())
position = position_dodge()とすることで"横方向に並べる"という意味になり、各classの年式を横並びで見ることができます。poisition = "dodge"といった略記でもOKですが、棒グラフの幅の変更をしたい場合はposition = position_dodge(width = 任意の値)を使います。
横向き棒グラフにする
グラフを横向きに変えたい場合は、aesの中のxとyを入れ替えるだけでOKです。
g1 <- ggplot(mpg)+
geom_bar(aes(y = class,
fill = factor(year)),
position = position_dodge())
g2 <- ggplot(mpg)+
geom_bar(aes(x = displ,
y = class),
stat = "summary",
fun = "mean")
まとめ:ggplot2で棒グラフを作る時はgeom_bar()を使う
今回はggplot2を使った棒グラフの作り方について紹介しました。
エクセルでも簡単に作ることができる棒グラフですが、Rだとやっぱり綺麗に描けるのが嬉しいですね。
次のステップとして、棒グラフにエラーバーをつける方法やプロットをつける方法についてもまとめております。ぜひご参考ください。
R言語の勉強におすすめの本
今後Rの勉強をしていきたい!という方に、こちらの参考書がおすすめです。
特に、RユーザのためのRStudio実践入門は、tidyverseパッケージに特化して書かれていてとても実用的でしたのでオススメです。私自身、この本を読んでRで出来ることが一気に増えた実感のある本です。kindleで試し読みもできるのでぜひ参考にしてください。