【R言語】ggplot2で描いたグラフを並べて保存する~gridExtraを使ってみた
こんにちは。Rを使って実験データからを論文レベルのグラフを描こうとして、プログラミングを勉強しているえいこです。
今回は、前回に引き続きirisのデータでヒストグラムを描いて描いたグラフを並べて保存していこうと思います。
今回の主題は、「描いたグラフを並べて出力する」。
描いたグラフを一つずつ保存するのは、"ggsave"で簡単にできます。
今回はそれを並べていきます。なぜ、並べようと思ったのか?
"ggsave"で保存した画像データってどうします?
いつもの私だったら、とりあえずPowerPointに貼り付けて、印刷して、実験ノートに張ったり、プレゼンに使ったり、論文用のFigに入れたりします。
そうすると、.pptファイルがものすごいことになってよくわからなくなってしまいます...(皆さん、どうやってデータ管理しているのか教えてほしい...)
そこで、画像データを並べて保存できたら実験ノートに貼るようのPowerPointファイルを作らなくて良いし、らくちんなのでは?と思ったり...
最終的には論文に載せる用のデータがきれいに並んでいる状態だと嬉しいなと思ったりしています。(最終目標なので今回の記事ではここまではいきません)
まぁ、とにかく出したデータを並べて出力できたら嬉しいなと思ったのでやってみようと思います。
irisのデータで4つのヒストグラムを描いておく
自分でデータを準備するのは大変なので、Rにデフォルトで入っているirisのデータを使って複数個のグラフをサクサク準備していきます。
ヒストグラムの描き方はこちらの記事を元に書きました。
書いたコードはこんな感じです↓
data<-iris
library(ggplot2)
hist<- ggplot(data, aes(y = ..density.., fill=Species, color=Species))+
scale_y_continuous(expand=c(0,0))+
theme_classic()
これでグラフのベースを作ったので、4つのデータ(がくの長さと幅、花びらの長さと幅)についてヒストグラムを描いていきます。
#がくの長さ
hist_sl<-hist+
geom_histogram(
aes(x=Sepal.Length),
position="identity",
alpha=0.7,
bins=40)+
geom_density(aes(x=Sepal.Length), alpha=0.5)
hist_sl
#がくの幅
hist_sw<-hist+
geom_histogram(
aes(x=Sepal.Width),
position="identity",
alpha=0.7,
bins=40)+
geom_density(aes(x=Sepal.Width), alpha=0.5)
hist_sw
#花びらの長さ
hist_pl<-hist+
geom_histogram(
aes(x=Petal.Length),
position="identity",
alpha=0.7,
bins=40)+
geom_density(aes(x=Petal.Length), alpha=0.5)
hist_pl
#花びらの幅
hist_pw<-hist+
geom_histogram(
aes(x=Petal.Width),
position="identity",
alpha=0.7,
bins=40)+
geom_density(aes(x=Petal.Width), alpha=0.5)
hist_pw
4つ描けました!
では、この4つのグラフを並べてみましょう。
グラフを並べて表示する3つの方法
グラフを並べて表示させる方法はどうやらいくつかの方法があるようなのですが、その中から3つの方法でやってみようと思います。
・Rの"layout()"で並べる
・"gridExtra"パッケージを使う
・”patchwork”パッケージを使う
Rの"layout()"はデフォルトのRで描いたグラフじゃないとどうやら適応されないっぽいので、ggplot2で描いたグラフを並べられませんでした...
この記事では、"gridExtra"パッケージを使った方法をご紹介します。
"gridExtra"パッケージを使ってみる
まずは、install.packages()でパッケージをインストールしておきます。
install.packages("gridExtra")
library()で呼び出しておきましょう。
library(gridExtra)
そして、描いたグラフを"gird.arrange()"を使って並べるだけ。
grid.arrange(hist_sl, hist_sw, hist_pl, hist_pw)
すると...
並べられました。
"gridExtra"で並べたグラフを保存する
並べたグラフを保存するときは、"grid.arrange()"で入れたものを変数に入れておいて、ggsaveを使って保存します。
a<- grid.arrange(hist_sl, hist_sw, hist_pl, hist_pw)
ggplot2::ggsave('並べる.png',a,
width=15, height =8, units = "cm", dpi=200)
ただ4つを並べるのではつまらないので、もう少し遊んでみようと思います。
"gridExtra"で複雑な並べ方をしてみる
一列目に1つ(Sepal.Lengthを)、二列目に縦に3つ(上からSepal.Width, Petal.Length, Petal.Widthの順番に)並べてみようと思います。
レイアウトはベクトルで事前に作成しておきます。
手順は、
・グラフと対応する番号を決めておく
・レイアウトを決めて番号を振っておく
・行を横に読んで数字を並べたベクトルを作る
・rbind()関数でベクトルをつなげて変数に入れておく
です。
layout1<- rbind(c(1,2), c(1,3), c(1,4))
grid.arrange(hist_sl, hist_sw, hist_pl, hist_pw, layout_matrix=layout1)
とすると、
上が切れてますが...こんな感じに出力されました。
"gridExtra"を使って凡例だけ切り出して並べる
で、これだとすべてのグラフに凡例が書かれてしまっているので、凡例だけ切り出して一つにしたいですよね...gridExtraならできるようです。
まずどのグラフの凡例を切り出すかを決めます。(どの凡例でも同じなのでSepal.Lengthの凡例を取り出すことにします)
詳しいコードの内容はよくわからないのですが...(勉強しなければ!)
まずは切り出す凡例をlegend変数に入れておきます。
g1<- ggplotGrob(hist_sl)
id.legend <- grep("guide", g1$layout$name)
legend <- g1[["grobs"]][[id.legend]]
で、ggplot2で描いたグラフの凡例を"theme(legend.position="none")"で削除しておきます。
で、こんな感じにすると...
grid.arrange(hist_sl + theme(legend.position="none"),
hist_sw + theme(legend.position="none"),
hist_pl + theme(legend.position="none"),
hist_pl + theme(legend.position="none"),
legend, ncol=3, nrow=2)
凡例だけ切り出せました!あとは好きに並べ替えればOK♪
あまり深入りしない方が良さそうなので、並べて保存するために使う感じで良いかと思います。
これをgtableという機能もあるようで、表も出力できるみたいです。(いずれやります)
ということで、今回はこの辺で。
それでは、また!
gridExtraの使い方はこちらの記事を参考にしました。
最後までお読みいただきありがとうございます。よろしければ「スキ」していただけると嬉しいです。 いただいたサポートはNGS解析をするための個人用Macを買うのに使いたいと思います。これからもRの勉強過程やワーママ研究者目線のリアルな現実を発信していきます。