LoginSignup
2
1

More than 1 year has passed since last update.

【初心者向け】R Studioで論文用に棒グラフを作りたい!(tidyverse & ggplot)

Last updated at Posted at 2022-07-17

はじめに

皆さん、こんにちは。
田中といいます。心理学を専攻している大学院生です。

この記事ではtidyverseggplotを使った簡単なデータ整形と可視化、論文ぽい棒グラフの作り方を紹介します。

データの形は2要因3×2水準デザイン。完成形はこんな感じです↓

完成.jpeg

この記事の対象者

  • R をこれから学習していきたい人
  • tidyverseやggplotをマスターしたい人
  • Rで論文用にグラフを作りたい人

目次

  1. 下準備
  2. tidyverseを使ったデータ整形
  3. ggplotを使ったグラフを描画(簡単な可視化)
  4. グラフの色を指定する
  5. エラーバーをつける
  6. 軸ラベルやタイトル、テーマ、凡例をカスタマイズする
  7. x軸とy軸の交点について
  8. グラフを保存する
  9. 終わりに
  10. 参考文献

下準備

tidyverseをインストールします。

以下のコードをRのコンソールに入力して実行してください。
途中、「yes/no?」みたいのが出てくることがありますが、とりあえずenterキーを押して飛ばしていきましょう。
インストールが完了したらlibrary()からtidyverseggplot2を呼び出します。

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_Valuesd_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 

うまくいくと以下のようなグラフが出力されるはず。

外観.jpeg

グラフの色を指定する

今回は色見本 - 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

色.jpeg

趣味悪そうなグラフですね

エラーバーをつける

グラフ作成の一つの山場がエラーバーです。これは僕も苦労しました。
やり方としては 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

エラーバー.jpeg

position_dodgeの中身の数値をいじるとエラーバーがx軸方向にずれます。
widthでエラーバーの髭の幅の長さを設定できます。

軸ラベルやタイトル、テーマ、凡例をカスタマイズする

それっぽいグラフになってきました。
軸ラベルやタイトル、テーマ、凡例をいじってもっともっとそれっぽくしていきましょう。

軸ラベルとタイトル

  • 軸ラベル → ylab()xlab()
  • タイトル → ggtitle()

テーマ

theme_classic()と入れるとテーマが白黒になります。論文っぽい落ち着いた雰囲気になります。ここでは詳しく紹介しませんが、papajaというパッケージのtheme_apa()もおすすめです。

凡例(位置と向き)

  • 凡例の位置 → legend.position()です。toprightleftbottomからお好きな位置に配置可能です。
  • 凡例の向き → 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

軸ラベルやタイトル、テーマ、凡例.jpeg

論文に掲載されても遜色ない感じになってきましたね。

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

完成.jpeg

完成です。扱うグラフによってlimits = c(0, 40)の40の部分を変更してください。
あまりクレバーな解決策ではないので、良い方法を知っている方いましたら教えてください〜

グラフを保存する

以下のコードを実行すると、現在のディレクトリにグラフがpng形式で保存されます。

ggsave(file = "名前.png", plot = Graph)

終わりに

いかがだったでしょうか。これで論文用のグラフもバッチリですね。
ぜひ今回紹介したtipsを利用して、Rのスキルを高めていただければと思います。

参考文献

2
1
2

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
1