【R言語】ggplot2|棒グラフとドットプロットを重ね合わせる
こんにちは。プログラミング超初心者のえいこです。
最近はggplot2を使って、棒グラフとかドットプロットとかを描けるようになりました。
さらに、有意差を示すスターもつけられるようになったので、あとは作った棒グラフとドットプロットを重ね合わせたい!
というのも、最近論文投稿したNature系の雑誌ではデータを一つ一つプロットすることを要求されたからです。
ライフサイエンスの世界ではデータの明示、オープンアクセス性がとても求められるようになっています。
そこで、今回はデータ一つ一つをプロットしたドットプロットと、平均値と標準偏差がわかる棒グラフを重ね合わせる。ということをやっていきたいと思います。
Excelでは描くのが大変(というか不可能)だったのですが、Rを使うとどうなんでしょう?
早速やってみようと思います。
棒グラフとドットプロットで使うデータが違う!
私は、棒グラフを描くときは平均値と標準偏差を計算したリスト(dplyrを使って作った)を、ドットプロットを描くときには読み込んだデータファイル(生データ)を使ってグラフを描いていました。
使っているデータが違うものを同じグラフ上にプロットできるんでしょうか?
ggplot2の特長として、まず"ggplot()"で使うデータセット、X軸、Y軸、データによる処理などを宣言してグラフを描いていくことがあります。
「使うデータセットが違う場合はどうしたら良いのーーー?!」
と言って、googleで調べてみました。
干からびたウェット教授の場合は、"aggregate"という関数を使って平均値と標準偏差のデータセットを別個に用意して、"+"でつないでグラフを描いているようです。
せっかくなら、dplyrで作ったリストを使って、今まで書いたコードを使って重ね合わせたい!
と、もう少し調べてみたところ棒グラフと折れ線グラフを重ね合わせて描いている方がいました。
この方は、最初の"ggplot"の宣言のところを”NULL(空白)”にしてグラフごとに指定していました。
私もこれに倣ってコードを書いてみたいと思います。
まずは、グラフのベースを作ろう
コードはどういう順番で書いていけばよいのか、模索中ですが...
最初にグラフのベースとなるところを作っていきます。
グラフのベースとは具体的には、
・グラフのX軸、Y軸
・浮いてるY軸を戻す
・背景色を整える
ここの設定は、棒グラフでもドットプロットでも同じなので先に設定しておいてしまいましょう。
実際に書いたコードはこちら↓
#棒グラフとドットプロットが一緒になったものを描いていくよ
bdp1<- ggplot(NULL) #複数種類のデータを使うときにはNULLにしておく
#グラフのベースを作っていくよ
bdp2<- bdp1+
labs(x="", y="expression level")+
scale_y_continuous(expand = c(0,0), limits = c(0,ylim))+
theme_classic()
bdp2
※初めて作るグラフなので、ステップごとに変数を用意して確認しながら作っていきます。
で、"bdp2"を実行するとどうなるかと言うと...
何にも書かれていないベースのグラフができました。
次に、このベースにグラフを描き込んでいくのですが順番が大事なんだそうです。
ggplot2は後から描いたコードが上に重ねられていく構造
だから、コードの順番を
ドットプロット→棒グラフ
にしてしまうと、ドットプロットが棒グラフに隠れてしまいます。
なので、棒グラフ→ドットプロットの順番でコードを書いていきます。
ggplot2で重ね合わせ用の棒グラフを作る
棒グラフとドットプロットでデータの形が違うので、geom_barの中に使うデータなどを記入したコードを書いていきます。
実際に書いたコードはこちら↓
#棒グラフを描くよ
bdp3<-bdp2+
geom_bar(
data=data_mean_sd,
aes(x= treatment, #X軸はtreatment
y=mean, #y軸は平均値
fill=treatment #treatmentによって塗りつぶしを変える
),
stat="identity", #統計処理はしないでグラフを表示する
color="black", #線の色は黒
position="dodge" #棒グラフの間の調整はここを使う
)+
scale_fill_manual(values=c("gray","white"))
bdp3
ここで使っているデータの”data_mean_sd”とは、dplyrで作った平均値と標準偏差を収めたリストのことです。
その他のところは、棒グラフを描いた時と基本的の同じコードになっています。
エラーバーはドットプロットを描いた後に重ね合わせようと思っていたので、ここではエラーバーのコードは抜いてあります。
ちなみにbdp3を実行するとこんな感じ
ggplot2で重ね合わせ用のドットプロットを作る
次に重ね合わせるためのドットプロットのコードを書いていきます。
#散布図を描くよ
bdp4<-bdp3+
geom_jitter(
data=rawdata,
aes(x= treatment, #xはtreatmentのfactorによって分ける
y= value, #Y軸で使う値
shape=treatment),
stat="identity",
size=3,
position=position_jitter(0.17))
bdp4
使うデータは"rawdata"で、全部のデータを載せたリストを使います。
前回のドットプロットを描いたときに苦労したマーカーの形ですが、●と○だと重ね合わせると見にくいことが分かったので今回は●と▲のデフォルトの形を使うことにしました。
デフォルトなので特に、"scale_shape_manual()"などで指定していません。
形を変えたい場合には、このコードに追加すればマーカーの形は変更可能です。
bdp4を実行すると...
重ね合わせができました!
ついでにエラーバーもつけておきましょう。
#エラーバーをつけるよ
bdp5<-bdp4+
geom_errorbar(
data=data_mean_sd,
aes(x=treatment,
y=mean,
ymin=mean-sd,
ymax=mean+sd),
width=0.17
)
bdp5
エラーバーのコードを加えたbdp5を実行すると、
もう、これで完成!っとしてしまいたいところですが...
有意差を示すスターと実際のpの値を書き加えたい!
ということで、次回は重ね合わせたグラフにスターとpの値をつけていきたいと思います。
それでは、また!
今回書いたコードはこちら↓
#棒グラフとドットプロットが一緒になったものを描いていくよ
bdp1<- ggplot(NULL) #複数種類のデータを使うときにはNULLにしておく
#グラフのベースを作っていくよ
bdp2<- bdp1+
labs(x="", y="expression level")+
scale_y_continuous(expand = c(0,0), limits = c(0,ylim))+
theme_classic()
bdp2
#棒グラフを描くよ
bdp3<-bdp2+
geom_bar(
data=data_mean_sd,
aes(x= treatment, #X軸はtreatment
y=mean, #y軸は平均値
fill=treatment #treatmentによって塗りつぶしを変える
),
stat="identity", #統計処理はしないでグラフを表示する
color="black", #線の色は黒
position="dodge" #棒グラフの間の調整はここを使う
)+
scale_fill_manual(values=c("gray","white"))
bdp3
#散布図を描くよ
bdp4<-bdp3+
geom_jitter(
data=rawdata,
aes(x= treatment, #xはtreatmentのfactorによって分ける
y= value, #Y軸で使う値
shape=treatment),
stat="identity",
size=3,
position=position_jitter(0.17))
bdp4
#エラーバーをつけるよ
bdp5<-bdp4+
geom_errorbar(
data=data_mean_sd,
aes(x=treatment,
y=mean,
ymin=mean-sd,
ymax=mean+sd),
width=0.17
)
bdp5
最後までお読みいただきありがとうございます。よろしければ「スキ」していただけると嬉しいです。 いただいたサポートはNGS解析をするための個人用Macを買うのに使いたいと思います。これからもRの勉強過程やワーママ研究者目線のリアルな現実を発信していきます。