Одним из недостатков решений, основанных на 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()
, которая позволяет легко получить правильные размеры для комбинированных графиков, например ::1010 *
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 по умолчанию. Вы можете сделать это с помощью одной строки кода:
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")
Обновление: Начиная с ggplot2 3.0.0, участки могут быть помечены напрямую, см., Например, здесь.