Эта статья шаг за шагом покажет, как совместить несколько ggplot-графиков на одной или нескольких иллюстрациях, с помощью вспомогательных функций, доступных в пакетах R ggpubr, cowplot и gridExtra. Также опишем, как экспортировать полученные графики в файл.
Стандартные функции R —
Простое решение — использовать пакет R gridExtra, в котором есть такие функции:
Однако, эти функции не выравнивают графики друг относительно друга; вместо этого они просто помещаются в координатную сетку, как есть, т.е. оси используют разные шкалы.
Если нужно привести оси к единой размерности, можно использовать пакет cowplot, в котором есть функция
Вам потребуется установить ggpubr (версии 0.1.3 или выше). Это позволит легко создавать ggplot-графики для публикаций.
Мы рекомендуем установить последнюю версию от разработчиков из GitHub следующим образом:
Если не получилось установить с GitHub, попробуйте из CRAN, вот так:
Обратите внимание, что установка ggpubr также поставит пакеты gridExtra и cowplot, поэтому их не нужно устанавливать отдельно.
Загрузите ggpubr:
Наборы данных: ToothGrowth и mtcars.
Здесь для создания графиков мы будем использовать функции ggpubr, основанные на ggplot2. Но вообще можно использовать любые функции ggplot2, чтобы сделать графики, а упорядочить их позже.
Мы начнем с 4 разных графиков:
Вы научитесь совмещать эти диаграммы с помощью специальных функций в следующих разделах.


Создадим упорядоченные диаграммы рассеивания. Изменим цвет заливки для группирующей переменной «cyl». Сортировка для всех данных, а не внутри групп.


Чтобы совместить несколько ggplot-графиков, воспользуемся функцией

Можно воспользоваться и функцией
или функцией
Функция R

Обратите внимание, что функция
Случай использования из практики, например — построение кривых выживания с таблицей рисков под основным графиком.
Чтобы проиллюстрировать этот случай, воспользуемся пакетом survminer. Сначала установите его (
ggsurv — список с такими компонентами:
Можно расположить кривые выживания и таблицу рисков так:

Можно видеть, что оси кривых выживания и таблицы рисков не выровнены вертикально. Чтобы сделать это, зададим аргумент align:

В следующей части:
Стандартные функции R —
par() и layout() — нельзя использовать, чтобы поместить несколько ggplot2-графиков на одну иллюстрацию.Простое решение — использовать пакет R gridExtra, в котором есть такие функции:
grid.arrange()иarrangeGrob(), чтобы совместить несколько ggplot-графиков в одинmarrangeGrob(), чтобы разместить несколько ggplot-графиков на нескольких иллюстрациях
Однако, эти функции не выравнивают графики друг относительно друга; вместо этого они просто помещаются в координатную сетку, как есть, т.е. оси используют разные шкалы.
Если нужно привести оси к единой размерности, можно использовать пакет cowplot, в котором есть функция
plot_grid() с аргументом align. Но этот пакет, в свою очередь, не содержит решения для размещения нескольких графиков на разных иллюстрациях. Чтобы сделать это, мы применим функцию ggarrange() [в ggpubr], обёртку над функцией plot_grid(), которая умеет упорядочивать графики на нескольких иллюстрациях. Она также поможет создать общую легенду для нескольких графиков.Предварительные условия
Пакеты R
Вам потребуется установить ggpubr (версии 0.1.3 или выше). Это позволит легко создавать ggplot-графики для публикаций.
Мы рекомендуем установить последнюю версию от разработчиков из GitHub следующим образом:
if(!require(devtools)) install.packages("devtools") devtools::install_github("kassambara/ggpubr")
Если не получилось установить с GitHub, попробуйте из CRAN, вот так:
install.packages("ggpubr")
Обратите внимание, что установка ggpubr также поставит пакеты gridExtra и cowplot, поэтому их не нужно устанавливать отдельно.
Загрузите ggpubr:
library(ggpubr)
Наборы данных для примеров
Наборы данных: ToothGrowth и mtcars.
# ToothGrowth data("ToothGrowth") head(ToothGrowth) len supp dose 1 4.2 VC 0.5 2 11.5 VC 0.5 3 7.3 VC 0.5 4 5.8 VC 0.5 5 6.4 VC 0.5 6 10.0 VC 0.5 # mtcars data("mtcars") mtcars$name <- rownames(mtcars) mtcars$cyl <- as.factor(mtcars$cyl) head(mtcars[, c("name", "wt", "mpg", "cyl")]) name wt mpg cyl Mazda RX4 Mazda RX4 2.620 21.0 6 Mazda RX4 Wag Mazda RX4 Wag 2.875 21.0 6 Datsun 710 Datsun 710 2.320 22.8 4 Hornet 4 Drive Hornet 4 Drive 3.215 21.4 6 Hornet Sportabout Hornet Sportabout 3.440 18.7 8 Valiant Valiant 3.460 18.1 6
Создадим несколько графиков
Здесь для создания графиков мы будем использовать функции ggpubr, основанные на ggplot2. Но вообще можно использовать любые функции ggplot2, чтобы сделать графики, а упорядочить их позже.
Мы начнем с 4 разных графиков:
- диаграммы рассеивания и точечные диаграммы для набора данных ToothGrowth
- диаграммы рассеивания и разброса для набора данных mtcars
Вы научитесь совмещать эти диаграммы с помощью специальных функций в следующих разделах.
Создаем диаграмму рассеивания и точечную диаграмму
# Диаграмма рассеивания (bp) bxp <- ggboxplot(ToothGrowth, x = "dose", y = "len", color = "dose", palette = "jco") bxp # Точечная диаграмма (dp) dp <- ggdotplot(ToothGrowth, x = "dose", y = "len", color = "dose", palette = "jco", binwidth = 1) dp


Создаем упорядоченные диаграммы рассеивания и разброса
Создадим упорядоченные диаграммы рассеивания. Изменим цвет заливки для группирующей переменной «cyl». Сортировка для всех данных, а не внутри групп.
# Столбчатая диаграмма (bp) bp <- ggbarplot(mtcars, x = "name", y = "mpg", fill = "cyl", # изменим цвет заливки для cyl color = "white", # сделаем границы столбцов белыми palette = "jco", # jco - journal color palett (палитра газетных цветов). см. ?ggpar sort.val = "asc", # отсортируем значения по возрастанию sort.by.groups = TRUE, # отсортируем внутри каждой группы x.text.angle = 90 # повернем вертикально подписи по оси абсцисс ) bp + font("x.text", size = 8) # Диаграммы разброса (sp) sp <- ggscatter(mtcars, x = "wt", y = "mpg", add = "reg.line", # добавим линию регрессии conf.int = TRUE, # добавим доверительный интервал color = "cyl", palette = "jco", # установим цвета для групп "cyl" shape = "cyl" # изменим форму точек для групп "cyl" )+ stat_cor(aes(color = cyl), label.x = 3) # добавим коэффициент корреляции sp


Размещение на одной диаграмме
Чтобы совместить несколько ggplot-графиков, воспользуемся функцией
ggarrange() [в ggpubr], обёрткой над функцией plot_grid() [в пакете cowplot]. По сравнению со стандартной функцией plot_grid(), ggarrange() может разместить несколько графиков на нескольких иллюстрациях.ggarrange(bxp, dp, bp + rremove("x.text"), labels = c("A", "B", "C"), ncol = 2, nrow = 2)

Можно воспользоваться и функцией
plot_grid() [в cowplot]:library("cowplot") plot_grid(bxp, dp, bp + rremove("x.text"), labels = c("A", "B", "C"), ncol = 2, nrow = 2)
или функцией
grid.arrange() [в gridExtra]:library("gridExtra") grid.arrange(bxp, dp, bp + rremove("x.text"), ncol = 2, nrow = 2)
Подпишем упорядоченный график
Функция R
annotate_figure() [в ggpubr]:figure <- ggarrange(sp, bp + font("x.text", size = 10), ncol = 1, nrow = 2) annotate_figure(figure, top = text_grob("Visualizing mpg", color = "red", face = "bold", size = 14), bottom = text_grob("Data source: \n mtcars data set", color = "blue", hjust = 1, x = 1, face = "italic", size = 10), left = text_grob("Figure arranged using ggpubr", color = "green", rot = 90), right = "I'm done, thanks :-)!", fig.lab = "Figure 1", fig.lab.face = "bold" )

Обратите внимание, что функция
annotate_figure() поддерживает любые ggplot-графики.Выравниваем график и данные
Случай использования из практики, например — построение кривых выживания с таблицей рисков под основным графиком.
Чтобы проиллюстрировать этот случай, воспользуемся пакетом survminer. Сначала установите его (
install.packages(“survminer”)), а потом сделайте следующее:# Смоделируем кривые выживания library(survival) fit <- survfit( Surv(time, status) ~ adhere, data = colon ) # Построим кривые выживания library(survminer) ggsurv <- ggsurvplot(fit, data = colon, palette = "jco", # jco палитра pval = TRUE, pval.coord = c(500, 0.4), # добавим p-значение risk.table = TRUE # добавим таблицу рисков ) names(ggsurv) [1] "plot" "table" "data.survplot" "data.survtable"
ggsurv — список с такими компонентами:
- plot: кривые выживания
- table: график с таблицей рисков
Можно расположить кривые выживания и таблицу рисков так:
ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7), ncol = 1, nrow = 2)

Можно видеть, что оси кривых выживания и таблицы рисков не выровнены вертикально. Чтобы сделать это, зададим аргумент align:
ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7), ncol = 1, nrow = 2, align = "v")

В следующей части:
- изменение интервала по строкам или столбцам с помощью разных пакетов
- общая легенда на совмещенных ggplot-графиках