はじめに
皆さん、こんにちは。
田中といいます。心理学を専攻している大学院生です。
この記事ではtidyverse
・ggplot
を使った簡単なデータ整形と可視化、論文ぽい棒グラフの作り方を紹介します。
データの形は2要因3×2水準デザイン。完成形はこんな感じです↓
この記事の対象者
- R をこれから学習していきたい人
- tidyverseやggplotをマスターしたい人
- Rで論文用にグラフを作りたい人
目次
- 下準備
- tidyverseを使ったデータ整形
- ggplotを使ったグラフを描画(簡単な可視化)
- グラフの色を指定する
- エラーバーをつける
- 軸ラベルやタイトル、テーマ、凡例をカスタマイズする
- x軸とy軸の交点について
- グラフを保存する
- 終わりに
- 参考文献
下準備
tidyverse
をインストールします。
以下のコードをRのコンソールに入力して実行してください。
途中、「yes/no?」みたいのが出てくることがありますが、とりあえずenterキーを押して飛ばしていきましょう。
インストールが完了したらlibrary()
からtidyverse
とggplot2
を呼び出します。
install.packages("tidyverse")
library(tidyverse)
library(ggplot2)
データの作成
2要因3×2のデータを作成します。要因Aが3水準(a1, a2, a3)、要因Bが2水準(b1, b2)です。
以下のコードを実行してデータを作成しましょう。
#データの作成
a1 <- data.frame(
B = c("b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2"),
Value = c(30, 26, 36, 24, 27, 24, 25, 22, 31, 23, 25, 28)
)
a2 <- data.frame(
B = c("b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2"),
Value = c(17, 23, 15, 21, 23, 21, 15, 18, 18, 17, 20, 25)
)
a3 <- data.frame(
B = c("b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2", "b1", "b2"),
Value = c(13, 26, 17, 21, 12, 24, 14, 16, 11, 15, 12, 22)
)
#データフレームにする
data <- rbind(data.frame(A = "a1", a1),
data.frame(A = "a2", a2),
data.frame(A = "a3", a3))
#データの出力
data
tidyverseを使ったデータ整形
Value
について条件ごとに平均・標準偏差を算出します。
まずgroup_by(A, B)
で要因A、要因Bごとにグループ化します。続いてmean
で平均、sd
で標準偏差を算出し、それぞれmean_Value
、sd_Value
の列に計算結果を入れていきます。
SummaryData <- data %>%
group_by(A, B) %>%
dplyr::summarise(mean_Value = mean(Value),
sd_Value = sd(Value))
#計算結果の出力
SummaryData
ちなみにgroup_by(A)
で実行すると要因Aごとに計算されます。
ggplotを使ったグラフを描画(簡単な可視化)
いざ!ggplot
を使ったグラフを描画のパートです!
まずは細かな装飾はせず、簡単に可視化していきます。
グラフの構成
ggplot()
でグラフの構成を決定します。今回は以下のような感じにします。
- 横軸
(x)
→ 要因A - 縦軸
(y)
→ mean_Value - グラフの中身
(fill)
→ 要因B
グラフの描画
geom_bar()
で棒グラフを描画します。
-
position
とかstat
とか書いてありますが、これは「おまじない」だと思ってそのまま実行してください。 -
colour()
は棒グラフの枠線です。ここを省くと枠線がないグラフになります。
Graph <- ggplot(SummaryData, aes(x=A, y=mean_Value, fill=B))+
geom_bar(position = position_dodge(), stat = "identity", colour = "black")
#データの出力
Graph
うまくいくと以下のようなグラフが出力されるはず。
グラフの色を指定する
今回は色見本 - RjpWikiから色を選んでいきましょう。
色見本から好みの色を選んだらimagecol()
の中に色を定義します。
試しにb1を"mediumorchid"
、b2を"yellow"
にしました。ついでに棒グラフの枠線を"chartreuse4"
にしてみました。
imagecol <- c("mediumorchid", "yellow") #グラフの色の設定
Graph <- ggplot(SummaryData, aes(x=A, y=mean_Value, fill=B))+
scale_fill_manual(values = imagecol)+
geom_bar(position = position_dodge(), stat = "identity", colour = "chartreuse4")
#データの出力
Graph
趣味悪そうなグラフですね
エラーバーをつける
グラフ作成の一つの山場がエラーバーです。これは僕も苦労しました。
やり方としては tidyverseを使ったデータ整形 で算出した標準偏差をgeom_errorbar()
で平均値の上・下方向に伸ばします。
imagecol <- c("gray50", "gray90") #グラフの色の設定
Graph <- ggplot(SummaryData, aes(x=A, y=mean_Value, fill=B))+
scale_fill_manual(values = imagecol)+
geom_bar(position = position_dodge(), stat = "identity", colour = "black") +
geom_errorbar(aes(ymin=mean_Value-sd_Value, ymax=mean_Value+sd_Value),
position=position_dodge(0.9), width=0.2)
#データの出力
Graph
position_dodge
の中身の数値をいじるとエラーバーがx軸方向にずれます。
width
でエラーバーの髭の幅の長さを設定できます。
軸ラベルやタイトル、テーマ、凡例をカスタマイズする
それっぽいグラフになってきました。
軸ラベルやタイトル、テーマ、凡例をいじってもっともっとそれっぽくしていきましょう。
軸ラベルとタイトル
- 軸ラベル →
ylab()
とxlab()
- タイトル →
ggtitle()
テーマ
theme_classic()
と入れるとテーマが白黒になります。論文っぽい落ち着いた雰囲気になります。ここでは詳しく紹介しませんが、papaja
というパッケージのtheme_apa()
もおすすめです。
凡例(位置と向き)
- 凡例の位置 →
legend.position()
です。top
、right
、left
、bottom
からお好きな位置に配置可能です。 - 凡例の向き →
legend.direction
で設定します。デフォルトで縦向きです。僕は横向きが好きなのでhorizontal
にしました。
文字サイズ
theme(text = element_text(size = 20))
で一気に変更できます。
x軸の要素の順番
デフォルトがアルファベット順位です。もし「a3 → a1 → a2」の順にしたければ、scale_x_discrete(limit=c("a3", "a1", "a2"))
にすることで、任意の順番に入れ替えることができます。
imagecol <- c("gray50", "gray90") #グラフの色の設定
Graph <- ggplot(SummaryData, aes(x=A, y=mean_Value, fill=B))+
scale_fill_manual(values = imagecol)+
geom_bar(position = position_dodge(), stat = "identity", colour = "black") +
geom_errorbar(aes(ymin=mean_Value-sd_Value, ymax=mean_Value+sd_Value),
position=position_dodge(0.9), width=0.2) +
ylab("Mean (Value)") + xlab("A") +
theme_classic() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(text = element_text(size = 20)) +
scale_x_discrete(limit=c("a3", "a1", "a2"))
#データの出力
Graph
論文に掲載されても遜色ない感じになってきましたね。
x軸とy軸の交点について
ggplotの棒グラフでちょっと面倒くさいのがx軸とy軸の交点なんですよね。
x軸のところに変な余白ができちゃう。ダサい。この上なくダサい。
僕はscale_y_continuous()
を使って、limits()
とexpand()
で解決しています。
Graph <- ggplot(SummaryData, aes(x=A, y=mean_Value, fill=B))+
scale_fill_manual(values = imagecol)+
geom_bar(position = position_dodge(), stat = "identity", colour = "black") +
geom_errorbar(aes(ymin=mean_Value-sd_Value, ymax=mean_Value+sd_Value),
position=position_dodge(0.9), width=0.2) +
ylab("Mean (Value)") + xlab("A") +
theme_classic() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(text = element_text(size = 20)) +
scale_x_discrete(limit=c("a3", "a1", "a2")) +
scale_y_continuous(breaks = c(0, 10, 20, 30, 40), limits = c(0, 40), expand = c( 0, 0) )
#データの出力
Graph
完成です。扱うグラフによってlimits = c(0, 40)
の40の部分を変更してください。
あまりクレバーな解決策ではないので、良い方法を知っている方いましたら教えてください〜
グラフを保存する
以下のコードを実行すると、現在のディレクトリにグラフがpng形式で保存されます。
ggsave(file = "名前.png", plot = Graph)
終わりに
いかがだったでしょうか。これで論文用のグラフもバッチリですね。
ぜひ今回紹介したtipsを利用して、Rのスキルを高めていただければと思います。