Один из недостатков решений, основанных на grid.arrange
том, что они затрудняют маркировку графиков буквами (A, B и т. Д.), Как того требует большинство журналов.
Я написал пакет cowplot для решения этой (и нескольких других) проблем, в частности функции plot_grid()
:
library(cowplot)
iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot() + theme_bw()
iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.7) + theme_bw() +
theme(legend.position = c(0.8, 0.8))
plot_grid(iris1, iris2, labels = "AUTO")
plot_grid()
Возвращаемый объект - это другой объект ggplot2, и вы можете сохранить его ggsave()
как обычно:
p <- plot_grid(iris1, iris2, labels = "AUTO")
ggsave("plot.pdf", p)
Кроме того, вы можете использовать функцию cowplot save_plot()
, которая представляет собой тонкую обертку вокруг, ggsave()
которая позволяет легко получить правильные размеры для комбинированных участков, например:
p <- plot_grid(iris1, iris2, labels = "AUTO")
save_plot("plot.pdf", p, ncol = 2)
( ncol = 2
Аргумент говорит, save_plot()
что есть два графика рядом, и save_plot()
делает сохраненное изображение в два раза шире.)
Более подробное описание порядка расположения графиков в сетке см. В этой виньетке. Существует также виньетка, объясняющая, как создавать сюжеты с общей легендой.
Частая путаница заключается в том, что пакет cowplot меняет стандартную тему ggplot2. Пакет ведет себя так, потому что изначально был написан для внутреннего использования в лаборатории, и мы никогда не используем тему по умолчанию. Если это вызывает проблемы, вы можете использовать один из следующих трех подходов, чтобы обойти их:
1. Установите тему вручную для каждого сюжета. Я думаю, что это хорошая практика - всегда указывать определенную тему для каждого сюжета, как я это делал + theme_bw()
в примере выше. Если вы указываете конкретную тему, тема по умолчанию не имеет значения.
2. Верните тему по умолчанию обратно к ggplot2 default. Вы можете сделать это с помощью одной строки кода:
theme_set(theme_gray())
3. Вызовите функции cowplot, не подключая пакет. Вы также не можете вызывать library(cowplot)
или require(cowplot)
и вместо этого вызывать функции cowplot, предварительно добавив cowplot::
. Например, приведенный выше пример, использующий тему по умолчанию ggplot2:
## Commented out, we don't call this
# library(cowplot)
iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot()
iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.7) +
theme(legend.position = c(0.8, 0.8))
cowplot::plot_grid(iris1, iris2, labels = "AUTO")
Обновления:
- Начиная с версии 1.0, тема ggplot2 по умолчанию больше не изменяется.
- Начиная с ggplot2 3.0.0, графики могут быть помечены напрямую, см., Например, здесь.