ggplot2: как легко совместить несколько графиков в одном, часть 1

в 17:46, , рубрики: ggplot2, R, визуализация, визуализация данных

Эта статья шаг за шагом покажет, как совместить несколько 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

ggplot2: как легко совместить несколько графиков в одном, часть 1 - 1
ggplot2: как легко совместить несколько графиков в одном, часть 1 - 2

Создаем упорядоченные диаграммы рассеивания и разброса

Создадим упорядоченные диаграммы рассеивания. Изменим цвет заливки для группирующей переменной «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

ggplot2: как легко совместить несколько графиков в одном, часть 1 - 3
ggplot2: как легко совместить несколько графиков в одном, часть 1 - 4

Размещение на одной диаграмме

Чтобы совместить несколько 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)

ggplot2: как легко совместить несколько графиков в одном, часть 1 - 5
Можно воспользоваться и функцией 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"
                )

ggplot2: как легко совместить несколько графиков в одном, часть 1 - 6
Обратите внимание, что функция 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)

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

ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7),
          ncol = 1, nrow = 2, align = "v")

ggplot2: как легко совместить несколько графиков в одном, часть 1 - 8

В следующей части:

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

Автор: Анна Каплун

Источник

Поделиться

* - обязательные к заполнению поля