Эта статья шаг за шагом покажет, как совместить несколько ggplot-графиков на одной или нескольких иллюстрациях, с помощью вспомогательных функций, доступных в пакетах R ggpubr, cowplot и gridExtra. Также опишем, как экспортировать полученные графики в файл.
Стандартные функции 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-графиках
Автор: Анна Каплун