У меня есть два ggplots, которые я выравниваю по горизонтали grid.arrange
. Я просмотрел много постов на форуме, но все, что я пытаюсь сделать, похоже, это команды, которые теперь обновлены и названы как-то иначе.
Мои данные выглядят так:
# Data plot 1
axis1 axis2
group1 -0.212201 0.358867
group2 -0.279756 -0.126194
group3 0.186860 -0.203273
group4 0.417117 -0.002592
group1 -0.212201 0.358867
group2 -0.279756 -0.126194
group3 0.186860 -0.203273
group4 0.186860 -0.203273
# Data plot 2
axis1 axis2
group1 0.211826 -0.306214
group2 -0.072626 0.104988
group3 -0.072626 0.104988
group4 -0.072626 0.104988
group1 0.211826 -0.306214
group2 -0.072626 0.104988
group3 -0.072626 0.104988
group4 -0.072626 0.104988
#And I run this:
library(ggplot2)
library(gridExtra)
groups=c('group1','group2','group3','group4','group1','group2','group3','group4')
x1=data1[,1]
y1=data1[,2]
x2=data2[,1]
y2=data2[,2]
p1=ggplot(data1, aes(x=x1, y=y1,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)
p2=ggplot(data2, aes(x=x2, y=y2,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)
#Combine plots
p3=grid.arrange(
p1 + theme(legend.position="none"), p2+ theme(legend.position="none"), nrow=1, widths = unit(c(10.,10), "cm"), heights = unit(rep(8, 1), "cm")))
Как мне извлечь легенду из любого из этих графиков и добавить ее в конец / центр комбинированного графика?
Ответы:
Обновление 2015-февраль
Смотрите ответ Стивена ниже
Вот результирующий сюжет:
источник
arrangeGrob()
. Вам также нужноheights=c(1,10)
Вы также можете использовать ggarrange из пакета ggpubr и установить "common.legend = TRUE":
источник
print(ggarrangeobject)
один из своихggarrange
объектов, когда мне было нужно, чтобы он был нанесен какой-то другой функцией, что может быть похоже на решение для вашейrenderPlot()
?common.legend = TRUE
это все что мне нужно!Ответ Роланда нуждается в обновлении. Смотрите: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
Этот метод был обновлен для ggplot2 v1.0.0.
Обратите внимание на отсутствие
ggplot_gtable
иggplot_build
.ggplotGrob
используется вместо Этот пример немного более запутанный, чем вышеупомянутое решение, но он все же решил его для меня.источник
grid_arrange_shared_legend
? Спасибо!ncol = 1
?Новое, привлекательное решение заключается в использовании
patchwork
. Синтаксис очень прост:Создано в 2019-12-13 пакетом представлением (v0.2.1)
источник
combined <- p1 + p2 + plot_layout(guides = "collect") & theme(legend.position = "bottom")
Я предлагаю использовать cowplot. Из их виньетки R :
источник
annotate_figure(ggarrange())
, используя legend_b (). Большое вам спасибо, да благословит вас Бог!@ Giuseppe, вы можете рассмотреть это для гибкой спецификации расположения графиков (изменено здесь ):
Дополнительные аргументы
nrow
иncol
управление макетом упорядоченных участков:источник
Если вы рисуете одни и те же переменные на обоих графиках, самый простой способ - объединить кадры данных в один, а затем использовать facet_wrap.
Для вашего примера:
Еще один пример использования набора данных о бриллиантах. Это показывает, что вы даже можете заставить его работать, если у вас есть только одна общая переменная между вашими графиками.
Единственная сложность второго примера в том, что факторные переменные преобразуются в числовые, когда вы объединяете все в один фрейм данных. Поэтому в идеале вы будете делать это в основном тогда, когда все интересующие вас переменные имеют одинаковый тип.
источник
@Guiseppe:
Я не имею ни малейшего представления о Гробсе и т. Д., Но я взломал решение для двух графиков, должно быть возможно расширить до произвольного числа, но это не в сексуальной функции:
источник
Если легенда одинакова для обоих графиков, существует простое решение с использованием
grid.arrange
(при условии, что вы хотите, чтобы ваша легенда выровнялась с обоими графиками по вертикали или по горизонтали). Просто оставьте легенду для самого нижнего или самого правого сюжета, опуская легенду для другого. Однако добавление легенды только к одному сюжету изменяет размер одного сюжета относительно другого. Чтобы избежать этого, используйтеheights
команду для ручной настройки и сохранения их одинакового размера. Вы даже можете использовать,grid.arrange
чтобы сделать общие названия осей. Обратите внимание, что это потребуетlibrary(grid)
в дополнение кlibrary(gridExtra)
. Для вертикальных участков:y_title <- expression(paste(italic("E. coli"), " (CFU/100mL)"))
grid.arrange(arrangeGrob(p1, theme(legend.position="none"), ncol=1), arrangeGrob(p2, theme(legend.position="bottom"), ncol=1), heights=c(1,1.2), left=textGrob(y_title, rot=90, gp=gpar(fontsize=20)))
Вот результат для аналогичного графика для проекта, над которым я работал:
источник