Я хотел бы разместить два графика рядом с помощью пакета ggplot2 , т.е. сделать эквивалент par(mfrow=c(1,2))
.
Например, я хотел бы, чтобы следующие два графика показывали бок о бок с одинаковым масштабом.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
Нужно ли помещать их в один и тот же data.frame?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Кристофер Дюбуа
источник
источник
Ответы:
Любые ggplots рядом (или n графиков в сетке)
Функция
grid.arrange()
вgridExtra
пакете объединит несколько графиков; это то, как вы положили два рядом.Это полезно, когда два графика не основаны на одних и тех же данных, например, если вы хотите построить разные переменные без использования reshape ().
Это будет выводить результат как побочный эффект. Чтобы напечатать побочный эффект в файл, укажите драйвер устройства (например
pdf
,png
и т. Д.), Напримерили использовать
arrangeGrob()
в сочетании сggsave()
,Это эквивалентно использованию двух разных графиков
par(mfrow = c(1,2))
. Это не только экономит время на организацию данных, это необходимо, когда вы хотите два разных графика.Приложение: Использование граней
Аспекты полезны для создания похожих сюжетов для разных групп. Это указано ниже во многих ответах ниже, но я хочу выделить этот подход примерами, эквивалентными приведенным выше графикам.
Обновить
plot_grid
функция вcowplot
стоит проверить в качестве альтернативыgrid.arrange
. Смотрите ответ по @ claus-wilke ниже и эту виньетку для эквивалентного подхода; но функция позволяет более точно контролировать местоположение и размер графика, основываясь на этой виньетке .источник
?grid.arrange
заставляет меня думать, что эта функция теперь называетсяrangeGrob. Я смог сделать то, что хотел,a <- arrangeGrob(p1, p2)
и потомprint(a)
.grid.arrange
все еще действительная, не осуждаемая функция. Вы пытались использовать функцию? Что произойдет, если не то, что вы ожидали.Один из недостатков решений, основанных на
grid.arrange
том, что они затрудняют маркировку графиков буквами (A, B и т. Д.), Как того требует большинство журналов.Я написал пакет cowplot для решения этой (и нескольких других) проблем, в частности функции
plot_grid()
:plot_grid()
Возвращаемый объект - это другой объект ggplot2, и вы можете сохранить егоggsave()
как обычно:Кроме того, вы можете использовать функцию cowplot
save_plot()
, которая представляет собой тонкую обертку вокруг,ggsave()
которая позволяет легко получить правильные размеры для комбинированных участков, например:(
ncol = 2
Аргумент говорит,save_plot()
что есть два графика рядом, иsave_plot()
делает сохраненное изображение в два раза шире.)Более подробное описание порядка расположения графиков в сетке см. В этой виньетке. Существует также виньетка, объясняющая, как создавать сюжеты с общей легендой.
Частая путаница заключается в том, что пакет cowplot меняет стандартную тему ggplot2. Пакет ведет себя так, потому что изначально был написан для внутреннего использования в лаборатории, и мы никогда не используем тему по умолчанию. Если это вызывает проблемы, вы можете использовать один из следующих трех подходов, чтобы обойти их:
1. Установите тему вручную для каждого сюжета. Я думаю, что это хорошая практика - всегда указывать определенную тему для каждого сюжета, как я это делал
+ theme_bw()
в примере выше. Если вы указываете конкретную тему, тема по умолчанию не имеет значения.2. Верните тему по умолчанию обратно к ggplot2 default. Вы можете сделать это с помощью одной строки кода:
3. Вызовите функции cowplot, не подключая пакет. Вы также не можете вызывать
library(cowplot)
илиrequire(cowplot)
и вместо этого вызывать функции cowplot, предварительно добавивcowplot::
. Например, приведенный выше пример, использующий тему по умолчанию ggplot2:Обновления:
источник
Вы можете использовать следующую
multiplot
функцию из книги поваров Winston Chang's Rисточник
Используя пакет заплаток , вы можете просто использовать
+
оператор:источник
Да, я думаю, вам нужно правильно организовать ваши данные. Одним из способов было бы это:
Я уверен, что есть лучшие трюки в plyr или rehape - я все еще не совсем в курсе всех этих мощных пакетов от Хэдли.
источник
Используя пакет reshape, вы можете сделать что-то вроде этого.
источник
Также стоит упомянуть пакет multipanelfigure . Смотрите также этот ответ .
Создано 2018-07-06 пакетом представлением (v0.2.0.9000).
источник
ggplot2 основан на сеточной графике, которая предоставляет другую систему для размещения графиков на странице. Команда
par(mfrow...)
не имеет прямого эквивалента, поскольку объекты сетки (называемые гробами ) не обязательно рисуются сразу, но могут быть сохранены и обработаны как обычные объекты R перед преобразованием в графический вывод. Это обеспечивает большую гибкость, чем рисование этой ныне модели базовой графики, но стратегия обязательно немного другая.Я написал,
grid.arrange()
чтобы обеспечить простой интерфейс как можно ближе кpar(mfrow)
. В простейшем виде код будет выглядеть так:Дополнительные параметры подробно описаны в этой виньетке .
Одна распространенная жалоба заключается в том, что графики не обязательно выровнены, например, когда они имеют метки осей разного размера, но это
grid.arrange
сделано по замыслу: не предпринимает попыток обращаться к объектам ggplot2 в особом случае и обрабатывает их в равной степени с другими гробами (например, решетчатые графики). ). Это просто помещает гробы в прямоугольную схему.Для особого случая объектов ggplot2 я написал другую функцию
ggarrange
с похожим интерфейсом, которая пытается выровнять панели графиков (включая граненые графики) и пытается соблюдать пропорции, когда они определены пользователем.Обе функции совместимы с
ggsave()
. Для общего обзора различных вариантов и некоторого исторического контекста эта виньетка предлагает дополнительную информацию .источник
Обновление: этот ответ очень старый.
gridExtra::grid.arrange()
сейчас рекомендуемый подход. Я оставляю это здесь на случай, если это будет полезно.Стивен Тернер опубликовал эту
arrange()
функцию в блоге Getting Genetics Done (инструкции см. В посте)источник
grid.arrange
(жаль, что я не размещал ее в списках рассылки в то время, когда нет возможности обновить эти онлайн-ресурсы), если вы спросите меня, лучше выбрать упакованную версиюИспользование
tidyverse
:источник
Приведенные выше решения могут оказаться неэффективными, если вы хотите построить несколько графиков ggplot с использованием цикла (например, как здесь предлагается: создание нескольких графиков в ggplot с различными значениями оси Y с использованием цикла ), что является желательным шагом для анализа неизвестного ( или большие) наборы данных (например, когда вы хотите построить график всех переменных в наборе данных).
Приведенный ниже код показывает, как это сделать, используя упомянутый выше метод multiplot (), источник которого находится здесь: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Теперь запустите функцию - чтобы получить Счет для всех переменных, напечатанных с использованием ggplot на одной странице
Следует отметить следующее:
использование
aes(get(strX))
, которое вы обычно используете в циклах при работеggplot
, в приведенном выше коде вместо того,aes_string(strX)
чтобы НЕ рисовать нужные графики. Вместо этого он построит последний сюжет много раз. Я не понял, почему - это, возможно, придется сделатьaes
иaes_string
вызвалиggplot
.В противном случае, надеюсь, вы найдете функцию полезной.
источник
plots
объекты, вfor-loop
которых крайне неэффективно и не рекомендуетсяR
. Пожалуйста, посмотрите эти замечательные статьи, чтобы узнать, как лучше это сделать: эффективное накопление в R , применение функции к строкам фрейма данных и ориентированные на строки рабочие процессы в R с помощью tidyversetidy evaluation
подход, который был доступен начиная сggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542По моему опыту gridExtra: grid.arrange отлично работает, если вы пытаетесь генерировать графики в цикле.
Короткий фрагмент кода:
источник
cowplot
Пакет дает вам хороший способ сделать это, таким образом , что костюмы публикации.источник