LoginSignup
58
73

More than 5 years have passed since last update.

ggplot2で複数のプロットをまとめて表示する方法あれこれ

Last updated at Posted at 2018-07-24

プロットの準備

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)

unnamed-chunk-2-1.png

細かい指定もできるが、しなくても適当に並べてくれる。

gridExtra::grid.arrange(p1, p2, p3, p4)

unnamed-chunk-3-1.png

grid.arrange()では各グラフの表示領域が若干ずれる場合があり、例えば以下のような場合はy軸を揃えたいと考えるだろう。

gridExtra::grid.arrange(p2, p3)

unnamed-chunk-4-1.png

これを揃えたい場合は、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)

unnamed-chunk-5-1.png

ただし、後述の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)

unnamed-chunk-6-1.png

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)

unnamed-chunk-7-1.png

ところで、グラフの軸を揃えるための引数alignが用意されている(これはggpubr::ggarrangeでも当然使える)。これを使えばgridExtra::grid.arrange()では少し面倒だった作業が簡単に行える。

plot_grid(pc1, pc2, align = "h")

unnamed-chunk-8-1.png

※今後はこの「パッケージを読み込んだ時点でthemeが置き換わる」という挙動は無くなり、theme_cowplot()を明示的に使用する方向で修正が行われている模様。開発版をgithubからインストールしパッケージをロードすると、既にthemeが自動的に置き換わることは無くなっていること、themeを置き換えてしまいたかったらtheme_set(theme_cowplot())する必要があることを知らせるメッセージが表示される。

patchwork

この記事を公開したところ…

ということを教えて頂いた。(何か+とかでくっつけられるやつがあったような…)と思いつつ見つけられずモヤモヤしていたので非常にありがたかった。

見つけられないのは情報が少ないせいだ、という気もしたので、READMEを翻訳した。

その他色々

「単に並べる」以外のアレコレについて。

複数プロットを複数ページに出力したい

gridExtra::marrangeGrobを使うことができる。

gridExtra::marrangeGrob(list(p1, p2, p3), nrow = 2, ncol = 1)

unnamed-chunk-11-1.png

unnamed-chunk-11-2.png

また、ggpubr::ggarrange()も複数ページ出力に対応している。こちらはpage n of mのような表示は付かない。

ggpubr::ggarrange(pp1, pp2, pp3, pp4, nrow = 1, ncol = 2)

unnamed-chunk-7-1.png

unnamed-chunk-7-2.png

プロットの内部にプロットする

ggplotGrobでgrobを作成してからannotation_customで配置。

g <- ggplotGrob(p2)
p1 + annotation_custom(g, xmin = 25, xmax = 35, ymin = 3, ymax = 5)

unnamed-chunk-12-1.png

参考

58
73
1

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
58
73