プロットの準備
library(ggplot2)
p1 <- qplot(mpg, wt, data = mtcars, colour = cyl)
p2 <- qplot(mpg, data = mtcars, ylab = "count")
p3 <- qplot(mpg, data = mtcars, ylab = "count", geom = "dotplot")
p4 <- ggplot(mtcars, aes(mpg, wt, col = cyl)) + geom_point() + facet_wrap( ~ carb, nrow = 1)
gridExtra
よくあるのがgridExtra
パッケージのgrid.arrange()
を使う方法。
#install.packages("gridExtra")
gridExtra::grid.arrange(p1, p2, nrow = 1)
細かい指定もできるが、しなくても適当に並べてくれる。
gridExtra::grid.arrange(p1, p2, p3, p4)
grid.arrange()
では各グラフの表示領域が若干ずれる場合があり、例えば以下のような場合はy軸を揃えたいと考えるだろう。
gridExtra::grid.arrange(p2, p3)
これを揃えたい場合は、ggplotGrob()
でgrobを作成してrbindで並べる。
g2 <- ggplotGrob(p2)
g3 <- ggplotGrob(p3)
g <- rbind(g2, g3, size = "first")
g$widths = grid::unit.pmax(g2$widths, g3$widths)
plot(g)
ただし、後述のggpubrやcowplotパッケージを使用した方がより分かりやすい書き方ができる。
ggpubr
ggpubr(‘ggplot2’ Based Publication Ready Plots •
ggpubr)はggplot2に類似の記法であまり細かい調整をせずともpublication-readyなプロットが作成できるパッケージで、複数プロット配置用の関数としてggarrange()
が用意されている。使い方はgridExtra::gird.arrange()
とほぼ同じだが、各プロットにラベルをつけられるlabels
等の少し気の利いた引数が用意されている。ggarrange()
は後述のcowplotパッケージのplot_grid()
のラッパーである。
# install.packages("ggpubr")
library(dplyr)
pp1 <- ggpubr::ggscatter(mtcars, "mpg", "wt")
pp2 <- ggpubr::gghistogram(mtcars, "mpg", fill = "gray", color = "white")
pp3 <- mutate(mtcars, cyl = factor(cyl)) %>%
ggpubr::ggscatter("wt", "mpg", add = "reg.line", conf.int = TRUE, color = "cyl") +
ggpubr::stat_cor(aes(color = cyl), label.x = 4)
pp4 <- ggpubr::desc_statby(iris, "Sepal.Length", grps = "Species") %>%
select(Species, min, max, median) %>%
ggpubr::ggtexttable(rows = NULL)
ggpubr::ggarrange(pp1, pp2, pp3, pp4, labels = LETTERS)
cowplot
cowplotもpublication-readyなプロットが作成できるパッケージだが、パッケージを読み込んだ時点でggplotのthemeに変更が加わるので(※)、ggplot2の記法そのままでも使える。先程のggpubr::ggarrange()
と同様にcowplot::plot_grid()
もgridExtra::grid.arrange()
とほぼ同じように使用できる。
library(cowplot)
pc1 <- ggplot(mpg, aes(x = cty, y = hwy, color = factor(cyl))) +
geom_point()
pc2 <- ggplot(diamonds, aes(clarity, fill = cut)) +
geom_bar() +
theme(axis.text.x = element_text(angle = 70, vjust = 0.5))
plot_grid(pc1, pc2)
ところで、グラフの軸を揃えるための引数align
が用意されている(これはggpubr::ggarrange
でも当然使える)。これを使えばgridExtra::grid.arrange()
では少し面倒だった作業が簡単に行える。
plot_grid(pc1, pc2, align = "h")
※今後はこの「パッケージを読み込んだ時点でthemeが置き換わる」という挙動は無くなり、theme_cowplot()
を明示的に使用する方向で修正が行われている模様。開発版をgithubからインストールしパッケージをロードすると、既にthemeが自動的に置き換わることは無くなっていること、themeを置き換えてしまいたかったらtheme_set(theme_cowplot())
する必要があることを知らせるメッセージが表示される。
patchwork
この記事を公開したところ…
個人的にはpatchworkが神です.https://t.co/0BX0l1ZrlY
— Atsushi (Atusy) (@Atsushi776) 2018年7月24日
ということを教えて頂いた。(何か+
とかでくっつけられるやつがあったような…)と思いつつ見つけられずモヤモヤしていたので非常にありがたかった。
見つけられないのは情報が少ないせいだ、という気もしたので、READMEを翻訳した。
その他色々
「単に並べる」以外のアレコレについて。
複数プロットを複数ページに出力したい
gridExtra::marrangeGrob
を使うことができる。
gridExtra::marrangeGrob(list(p1, p2, p3), nrow = 2, ncol = 1)
また、ggpubr::ggarrange()
も複数ページ出力に対応している。こちらはpage n of m
のような表示は付かない。
ggpubr::ggarrange(pp1, pp2, pp3, pp4, nrow = 1, ncol = 2)
プロットの内部にプロットする
ggplotGrob
でgrobを作成してからannotation_custom
で配置。
g <- ggplotGrob(p2)
p1 + annotation_custom(g, xmin = 25, xmax = 35, ymin = 3, ymax = 5)