論文用の棒グラフと折れ線グラフをggplot2で描く

author: Unadon (見習い飯炊き兵) 動作環境:Mac OS Sierra 10.12.1; R version3.3.1; rstan 2.10.1

 

ThesisPlotBar.jpeg ThesisPlotLine.jpegf

はじめに

美しいグラフを描くのに有用なRパッケージggplot2ですが、デフォルト設定は論文に用いる図には向いていません。

そこで今回は、ggplot2で描く棒グラフと折れ線グラフの体裁を、論文用に調整してみたいと思います。

themeを独自に定義して公開しようかともおもったのですが、投稿先の雑誌によって微妙に違ったりするので、 今回は”調整方法”を紹介することにしました。

想定しているのは、国内の学術誌『心理学研究』です。

心理学研究: 執筆・投稿の手引を参照しつつ、みなさまのデータにあわせてグラフを微調整してください。

本稿の目的

  1. 投稿論文、学位論文用の図をggplot2で描けるようになる
  2. 投稿先の規定にあわせて、その微調整ができるようになる

目標とする図

上記のリンクにある『心理学研究』の投稿の手引に、例として掲載されている図を以下に示します。

ExBar.jpg ExLine.jpg

目盛りのtick(ぴょんって出たとげみたいなやつ)が外側に変わってますね。あれ、内向きだったと記憶していたのですが、最近変わったのでしょうか。

さて、こういった図を描いていきましょう。

手引にはフォントサイズ以外に特段の制限が設けられていないので(要確認してください)、例にあわせて図を作成したいと思います。

データ

おなじみのirisを使います。アヤメの種類ごとに、がく片と花弁の長さと幅が入ったデータです。

ただ、色々な条件別でグラフを書いてみたいので、任意の変数を2つ追加します。

追加する一つ目の条件は”栽培”か”自生”か。分散分析の水準だとおもってください。

もう一つは観測時期(1月から5月)。こちらは折れ線のx軸に使います。

こうやって条件の変数を追加し・・・

#########################################################################
#ggplot2で論文用の棒グラフと折れ線グラフを書く
#########################################################################
invisible({rm(list=ls());gc();gc()})

library(ggplot2)
library(tidyverse)
library(data.table)


#データの用意----------------------------------------------------------------------------------------
irisOdered<-iris
irisOdered$栽培条件<-as.factor(rep(c("自生","栽培")))
names(irisOdered)<-c("萼の長さ","萼の幅","花弁の長さ", "花弁の幅", "種類", "栽培条件")
irisOdered$種類<-rep(c("ヒオウギアヤメ","ハナショウブ","カキツバタ"),each=50)
irisOdered <- transform(irisOdered, 種類= factor(種類, levels = c("カキツバタ","ハナショウブ","ヒオウギアヤメ")))
irisOdered$観測時期 <-rep(c("1月","2月","3月","4月","5月")) 

print(irisOdered)

こんな感じのデータを作りました。

SampleDat.jpg

棒グラフの作成

それでは、棒グラフを作成していきます。 「アヤメの種類(3種)✕栽培条件(自生vs栽培)で、花弁の長さに違いがあるか?」の分散分析をしたときのグラフです。

ggplot2の作画手順

ggplotは油絵と同じです。キャンバスを用意し、ざっくりと下書きをして、上に上にと塗り重ね、最後に微調整。 そういう順番でコードを書いていきます。

まずは、日本語fontの確認をしておきましょう

#Macフォントの確認(windowsは確か、windowsFonts()で出せた気がする)
quartzFonts()

$serif
[1] "Hiragino Mincho Pro W3"
[2] "Hiragino Mincho Pro W6"
[3] "Hiragino Mincho Pro W3"
[4] "Hiragino Mincho Pro W6"

$sans
[1] "Hiragino Kaku Gothic Pro W3"
[2] "Hiragino Kaku Gothic Pro W6"
[3] "Hiragino Kaku Gothic Pro W3"
[4] "Hiragino Kaku Gothic Pro W6"

$mono
[1] "Courier"            
[2] "Courier-Bold"       
[3] "Courier-Oblique"    
[4] "Courier-BoldOblique"

今回は”Hiragino Mincho Pro W3”を使用します。明朝体です。

以下にコードを書いていきますが、次のような順番で私は指定しました。

  1. キャンバスを用意する
  2. 棒グラフを描く
  3. エラーバーをつける
  4. 色をつけていく
  5. 表示範囲、軸のタイトルを設定
  6. 最終的な微調整

###################################################################
#分散分析の棒グラフ
###################################################################
#"グラフフォントサイズ12pt",”日本語表示HiraginoMinchoProW3”を初期設定する
#theme_classicが論文用の図に最も近いスタイルなので、これを基本とする
ggplot()+theme_set(theme_classic(base_size = 12,base_family="Hiragino Mincho Pro W3"))

#キャンバスを用意して、gに格納
g<-ggplot(irisOdered, aes(y=花弁の長さ, x=種類)) #irisOderedのデータフレームを使う。y軸とx軸の変数を指定。

#キャンバスgに棒グラフを描く
g<-g+stat_summary(aes(fill=栽培条件),   #塗りつぶしは栽培条件で変えますよ―
                  fun.y=mean,geom="bar", #栽培条件ごとに平均値を算出して、棒グラフを出しますよ―
                  alpha=0.8, #透過性0.8で
                  colour="black", #棒グラフの周りの線を黒色固定
                  position="dodge") 

#棒グラフの上からエラーバーをつける
g<-g+stat_summary(aes(group=栽培条件),#栽培条件ごとにグループ化して処理する
                  fun.data=mean_sdl,#mean_seで標準誤差、#mean_cl_normalで95%信頼区間(正規分布)
                  geom="errorbar",#エラーバーを描きますよー
                  size=0.5,#エラーバーの線の太さ
                  width=0.1,#ぴょんって横にでてるヤツの幅
                  position=position_dodge(.9))#エラーバー位置の調整

#塗りつぶしfill(上では棒グラフに使った)を濃いめのグレーと白で固定
#栽培条件は2種類だったので、2個指定する
g<-g+scale_fill_manual(values=c("gray10","white"))

#線はfillではなくcolour,全部ブラックで。栽培条件は2種だったので2個指定
g<-g+scale_colour_manual(values=c("black","black"))

#棒グラフの表示範囲の指定。expand=c(0,0)で棒グラフがx軸にくっつく。limitでy軸の下限と上限を指定
g<-g+scale_y_continuous(expand = c(0,0),limits = c(0,8))

#y軸の軸ラベル(軸タイトル)を変更(縦書きができないので、一文字ずつ\nで改行)
g<-g+ ylab("花\n弁\nの\n長\nさ")


#最終的なグラフの微調整をtheme()の中で行う
g<-g+theme(legend.position = c(1, 1), #レジェンド(横についてるやつ)を上詰め(1)、右詰め(1)にする¥
           legend.justification = c(1.5, 1.5), #レジェンドをちょっと内側に
           legend.text = element_text(size=12), #レジェンドの内容の文字サイズを変更
           legend.title = element_text(size=14), #レジェンドのタイトルサイズを変更
           axis.title.x = element_text(size=14), #x軸タイトルを上詰め(0)、黒色、サイズ14で
           axis.title.y = element_text(vjust = 0.5,angle=0,size=14),#vjustで上下の位置調整、英語の場合はangle = 90で
           axis.text.x = element_text(size=12),#x軸の目盛りに対応した文字サイズを12で
           axis.text.y = element_text(size=12,colour="black"),
           axis.ticks.x = element_line(size = 0),#x軸の目盛り線をゼロにして消す
           axis.line = element_line(size = 0.5, #軸の線を0.5の太さで
                                    linetype = "solid", #線のタイプは実線
                                    lineend = "round")#軸の線の終わりは整数値で丸める
)

#描画
plot(g)

できました。

フォントサイズ等の微調整は、最後の微調整のところで調整してみてください。

ThesisPlotBar.jpeg

折れ線グラフの作成

続いては折れ線グラフです。「観測時期によって、アヤメ種類別の花弁の長さに違いがあるか?」といったときのグラフです。

臨床心理学の話ですと、「治療群と待機群で、治療セッションごとに抑うつ得点がどう変化したか?」と読み替えていただいても構いません。

作画の順序は上と同じです。



###################################################################
#折れ線グラフ
###################################################################
#"グラフフォントサイズ12pt",”日本語表示HiraginoMinchoProW3”を初期設定する
#theme_classicが論文用の図に最も近いスタイルなので、これを基本とする
ggplot()+theme_set(theme_classic(base_size = 12,base_family="Hiragino Mincho Pro W3"))


#キャンバスを用意して、gに格納
#x軸は観測時期、y軸を花弁の長さ
g1<-ggplot(irisOdered, aes(y=花弁の長さ, x=観測時期)) 

#折れ線グラフを描き入れる
g1<-g1+stat_summary(aes(group=種類), #種類ごとに
                    fun.y=mean, #平均値を
                    geom="line",#線でつなげて
                    colour="black",#色は黒で
                    size=0.5)#先の太さは0.5mm


#エラーバーの追加
g1<-g1+stat_summary(aes(group=種類),#種類ごとに
                    fun.data=mean_sdl,#mean_seで標準誤差、#mean_cl_normalで95%信頼区間(正規分布)
                    geom="errorbar",
                    size=0.5,#線の太さ
                    width=0.1)#ぴょんって横に出てるアイツの幅



#エラーバーの上から重ねて、点(マーク)を描き入れる
g1<-g1+stat_summary(aes(shape=種類),#種類ごとに点の形を変えて
                    fun.y=mean,#種類ごとの平均値のところに
                    geom="point",#点で
                    colour="black",
                    size=4)
#形の指定
g1<-g1+scale_shape_manual(values=c(1,15,23))#点の形を1番◯、15番■、23番◇にマニュアル変更

##グラフの表示範囲の指定。expand=c(0,0)でy軸がゼロから始まる。limitでy軸の下限と上限を指定
g1<-g1+scale_y_continuous(expand = c(0,0),limits = c(0,10))

#y軸の軸ラベル(軸タイトル)を変更(縦書きができないので、一文字ずつ\nで改行)
g1<-g1+ ylab("花\n弁\nの\n長\nさ")


#最終的なグラフの微調整をtheme()の中で行う
g1<-g1+theme(legend.position = c(1, 1), #レジェンド(横についてるやつ)を上詰め(1)、右詰め(1)にする¥
           legend.justification = c(1, 1), #レジェンドをちょっと内側に
           legend.text = element_text(size=12), #レジェンドの内容の文字サイズを変更
           legend.title = element_text(size=14), #レジェンドのタイトルサイズを変更
           axis.title.x = element_text(size=14), #x軸タイトルを上詰め(0)、黒色、サイズ14で
           axis.title.y = element_text(vjust = 0.5,angle=0,size=14),#vjustで上下の位置調整、英語の場合はangle = 90で
           axis.text.x = element_text(size=12),#x軸の目盛りに対応した文字サイズを12で
           axis.text.y = element_text(size=12,colour="black"),
           axis.ticks.x = element_line(size = 0),#x軸の目盛り線をゼロにして消す
           axis.line = element_line(size = 0.5, #軸の線を0.5の太さで
                                    linetype = "solid", #線のタイプは実線
                                    lineend = "round")#軸の線の終わりは整数値で丸める
            )

#描画
plot(g1)

よいしょっと!!

ThesisPlotLine.jpeg

改めてポイントですが、

棒グラフでは、「棒グラフ→エラーバー」の順序。

折れ線グラフは、「線→エラーバー→点」の順番で描きました。

ggplot2は油絵と同じですので、後に描いたものが、先に描いたものの上に上塗りされます。

そのあたりを意識できれば、透過性(alpha)を調整したりして見やすい見せ方が提供できます。

Enjoy!!

Written on January 29, 2017