Как сделать несколько графиков на одном в r

Обновлено: 07.07.2024

Эта статья шаг за шагом покажет, как совместить несколько ggplot-графиков на одной или нескольких иллюстрациях, с помощью вспомогательных функций, доступных в пакетах R ggpubr, cowplot и gridExtra. Также опишем, как экспортировать полученные графики в файл.

Стандартные функции R — par() и layout() — нельзя использовать, чтобы поместить несколько ggplot2-графиков на одну иллюстрацию.

  • grid.arrange() и arrangeGrob() , чтобы совместить несколько ggplot-графиков в один
  • marrangeGrob() , чтобы разместить несколько ggplot-графиков на нескольких иллюстрациях

Если нужно привести оси к единой размерности, можно использовать пакет cowplot, в котором есть функция plot_grid() с аргументом align. Но этот пакет, в свою очередь, не содержит решения для размещения нескольких графиков на разных иллюстрациях. Чтобы сделать это, мы применим функцию ggarrange() [в ggpubr], обёртку над функцией plot_grid() , которая умеет упорядочивать графики на нескольких иллюстрациях. Она также поможет создать общую легенду для нескольких графиков.

Предварительные условия

Пакеты R

Вам потребуется установить ggpubr (версии 0.1.3 или выше). Это позволит легко создавать ggplot-графики для публикаций.

Мы рекомендуем установить последнюю версию от разработчиков из GitHub следующим образом:

Если не получилось установить с GitHub, попробуйте из CRAN, вот так:

Обратите внимание, что установка ggpubr также поставит пакеты gridExtra и cowplot, поэтому их не нужно устанавливать отдельно.

Загрузите ggpubr:

Наборы данных для примеров

Создадим несколько графиков

Здесь для создания графиков мы будем использовать функции ggpubr, основанные на ggplot2. Но вообще можно использовать любые функции ggplot2, чтобы сделать графики, а упорядочить их позже.

  • диаграммы рассеивания и точечные диаграммы для набора данных ToothGrowth
  • диаграммы рассеивания и разброса для набора данных mtcars

Создаем диаграмму рассеивания и точечную диаграмму




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




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

Чтобы совместить несколько ggplot-графиков, воспользуемся функцией ggarrange() [в ggpubr], обёрткой над функцией plot_grid() [в пакете cowplot]. По сравнению со стандартной функцией plot_grid() , ggarrange() может разместить несколько графиков на нескольких иллюстрациях.



Можно воспользоваться и функцией plot_grid() [в cowplot]:

или функцией grid.arrange() [в gridExtra]:

Подпишем упорядоченный график

Функция R annotate_figure() [в ggpubr]:



Обратите внимание, что функция annotate_figure() поддерживает любые ggplot-графики.

Выравниваем график и данные

Случай использования из практики, например — построение кривых выживания с таблицей рисков под основным графиком.

Чтобы проиллюстрировать этот случай, воспользуемся пакетом survminer. Сначала установите его ( install.packages(“survminer”) ), а потом сделайте следующее:

  • plot: кривые выживания
  • table: график с таблицей рисков



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

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

Если не получилось установить с GitHub, попробуйте из CRAN, вот так:

Обратите внимание, что установка ggpubr также поставит пакеты gridExtra и cowplot, поэтому их не нужно устанавливать отдельно.

Загрузите ggpubr:

Наборы данных для примеров

Создадим несколько графиков

Здесь для создания графиков мы будем использовать функции ggpubr, основанные на ggplot2. Но вообще можно использовать любые функции ggplot2, чтобы сделать графики, а упорядочить их позже.

Мы начнем с 4 разных графиков:

  • диаграммы рассеивания и точечные диаграммы для набора данных ToothGrowth
  • диаграммы рассеивания и разброса для набора данных mtcars

Вы научитесь совмещать эти диаграммы с помощью специальных функций в следующих разделах.

Создаем диаграмму рассеивания и точечную диаграмму

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

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

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

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

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

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

Чтобы совместить несколько ggplot-графиков, воспользуемся функцией ggarrange() [в ggpubr], обёрткой над функцией plot_grid() [в пакете cowplot]. По сравнению со стандартной функцией plot_grid() , ggarrange() может разместить несколько графиков на нескольких иллюстрациях.

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


Можно воспользоваться и функцией plot_grid() [в cowplot]:

или функцией grid.arrange() [в gridExtra]:

Подпишем упорядоченный график

Функция R annotate_figure() [в ggpubr]:

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


Обратите внимание, что функция annotate_figure() поддерживает любые ggplot-графики.

Выравниваем график и данные

Случай использования из практики, например — построение кривых выживания с таблицей рисков под основным графиком.

Чтобы проиллюстрировать этот случай, воспользуемся пакетом survminer. Сначала установите его ( install.packages(“survminer”) ), а потом сделайте следующее:

ggsurv — список с такими компонентами:

  • plot: кривые выживания
  • table: график с таблицей рисков

Можно расположить кривые выживания и таблицу рисков так:

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


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

У меня есть три набора данных о осадках: одно наблюдение и два набора моделей: исправлено исходное и смещенное. Каждый набор содержит пять моделей: CanESM2, GFDL.ESM2M, MRI.CGCM3, NorESM1.M, inmcm4 .

Следующий код воспроизводит мои данные:

Что мне нужно сделать, так это создать qq-графики между моделями против наблюдений. Поэтому у меня будет 10 сюжетов (5 моделей x 2 набора моделей).

Затем мне нужно объединить все графики на одной странице в матрице размером 5x2, где каждая строка будет содержать строки (CanESM2, GFDL.ESM2M и т.д.), А столбцы будут представлять каждую группу моделей: исходную и смещенную.

Я почти там. Это то, что я сделал до сих пор:

Я могу получить его на автономном R, но последняя фигура выглядит очень плохо, причем каждый сюжет выглядит "растянутым".

Как я могу объединить все эти графики с приемлемым внешним видом из RStudio?


Как сказано в известной книге Джона Чемберса и соавт. (Chambers J.M. et al. (1983) Graphical Methods for Data Analysis), ". нет статистического метода более мощного, чем хорошо подобранный график". Действительно, графическое представление данных играет очень важную роль в статистике. Например, графики являются неотъемлемой частью разведочного анализа данных, позволяют выявлять паттерны и тренды в сложных наборах данных, а также могут непосредственно быть результатом статистического анализа (см., например, деревья классификации).

В качестве примера используем данные по скорости выведения индометацина из организма человека (Kwan K.C. et al. (1976) Kinetics of Indomethacin absorption, elimination, and enterohepatic circulation in man. Journal of Pharmacokinetics and Biopharmaceutics 4, 255–280). Индометацин представляет собой один из наиболее активных противовоспалительных препаратов (подробнее см. здесь). В эксперименте приняли участие шесть испытуемых. Результаты этого исследования входят в базовый набор данных R и доступны по команде

видим, что в состав таблицы Indometh входят переменные Subject (испытуемый), time (время с момента введения препарата) и conc (концентрация препарата в крови). Чтобы облегчить дальнейшую работу, прикрепим таблицу Indometh к поисковому пути R:

Благодаря этой команде, теперь мы можем напрямую обращаться к переменным таблицы Indometh (т.е. использовать их имена непосредственно, например, time вместо Indometh$time ; подробнее об обращении к отдельным элементам таблиц с данными см. здесь).

Зависимость концентрации индометацина в крови от времени можно легко изобразить при помощи следующей команды:

tapply() (от table - таблица, и apply - применять; подробнее см. ?tapply ):

Обратите внимание на то, что при создании вектора means функция tapply() автоматически присвоила каждому из рассчитанных средних величин имя, соответствующее времени учета концентрации индометацина. Это легко проверить:

Мы можем воспользоваться этим обстоятельством при построении графика следующим образом:

Функция plot() имеет большое количество управляющих параметров, которые позволяют осуществлять очень тонкую настройку внешнего вида графика. Ниже рассмотрены лишь некоторые из них.

1. Параметры xlab и ylab

2. Параметр type

  • "p" - точки (points; используется по умолчанию)
  • "l" - линии (lines)
  • "b" - изображаются и точки, и линии (both points and lines)
  • "o" - точки изображаются поверх линий (points over lines)
  • "h" - гистограмма (histogram)
  • "s" - ступенчатая кривая (steps)
  • "n" - данные не отображаются (no points)

Эти два параметра контролирут размах значений на каждой из осей графика. По умолчанию они оба принимают значение NULL - в этом случае размах выбирается программой автоматически. Для отмены автоматических настроек соответствующему параметру необходимо присвоить значение в виде числового вектора, содержащего минимальное и максимальное значения, которые должны отображаться на оси. Например:

Эти два параметра контролируют отображение осей и их названий соответственно. Каждый из них может принимать два значения - TRUE или FALSE :

5. Параметр log

При помощи аргумента log можно перевести одну или обе оси графика на логарифмическую шкалу, например:

Аргумент main служит для создания названия графика. По умолчанию название размещается в верхней части рисунка:

6 Комментарии

Добрый день, я уже отчаялась найти простое нормальное объяснение, как просто присвоить всем точкам на графике их значения, от 1 до 79, которые собственно и выводятся на моем графике. Для интерпритации графика мне это необходимо, а как это сделать, простая команда в RStudio - нигде не найти, может вы подскажете? Заранее огромное спасибо!

Не понятно, почему Вы путаете R с RStudio. В RStudio такой команды действительно нет, а в R есть простая функция text() - сложно представить, что в ходе Ваших поисков Вы на нее не наткнулись - где искали?

Подскажите, пожалуйста, можно ли соединить несколько графиков в один? Никак не могу найти, как это можно сделать. Заранее спасибо!

Здравствуйте. Скажите пожалуйста, можно ли в R подписать координаты точек на самом графике? То есть грубо говоря, есть 5 точек, они соединены линией (при помощи geom_line) и я хочу, чтобы на графике возле каждой точки стояла её координата. Это вообще возможно?

Читайте также: