Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

プロットの準備

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

参考

water-cell
地球人口100億の時代への農業革命をWebテクノロジで支える
https://water-cell.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away