Есть ли другой способ соединить 3 графика в 1 изображение, кроме использования ggpubr в R? - PullRequest
0 голосов
/ 01 мая 2019

Я использовал приведенный ниже код для создания 3 отдельных графиков, а затем использовал ggarrange в пакете ggpubr, чтобы объединить их в один график и сохранить его в виде изображения.Однако, как только я создал Rmd моего скрипта, эта функция стала очень темпераментной и выдает мне ошибку «Переменные граней должны иметь хотя бы одно значение», даже если она отлично работает вне Rmd.Есть ли другой способ получить те же результаты, используя что-то в пакете ggplot2?или другой более простой способ?Изменить: Я хотел бы сохранить балки на моем графике и не использовать сложный способ получить общую легенду, которая требуется коровьего сюжета.

graph_1 <- ggplot(subset(data_p, Target == "1"), aes(x=as.integer(volume), y=percent_yield, color=Tech.Rep))+
  geom_point()+
  geom_smooth(se=FALSE)+
  facet_wrap(~sample)+
  ggtitle(paste("Graph 1"))+
  ylab("PERCENT YIELD")+
  scale_x_discrete(limits= levels(data_p$volume))+
  ylim(min=-150, max=150)+
  theme(axis.text.x=element_text(size=10,angle=85,hjust=1,vjust=1))+
  theme(legend.position="none")+
  geom_ribbon(aes(ymax=100, ymin=50), alpha = 0.2, fill="green", col="green")+
  geom_ribbon(aes(ymax=0, ymin=0), alpha = 0.2, fill="black", col="black", size=1.0)

graph_2 <- ggplot(subset(data_p, Target == "2"), aes(x=as.integer(volume), y=percent_yield, color=Tech.Rep))+
  geom_point()+
  geom_smooth(se=FALSE)+
  facet_wrap(~sample)+
  ggtitle(paste("Graph 2"))+
  ylab("PERCENT YIELD")+
  scale_x_discrete(limits= levels(data_p$volume))+
  ylim(min=-150, max=150)+
  theme(axis.text.x=element_text(size=10,angle=85,hjust=1,vjust=1))+
  theme(legend.position="none")+
  geom_ribbon(aes(ymax=100, ymin=50), alpha = 0.2, fill="green", col="green")+
  geom_ribbon(aes(ymax=0, ymin=0), alpha = 0.2, fill="black", col="black", size=1.0)


graph_3 <- ggplot(subset(data_p, Target == "3"), aes(x=as.integer(volume), y=percent_yield, color=Tech.Rep))+
  geom_point()+
  geom_smooth(se=FALSE)+
  facet_wrap(~sample)+
  ggtitle(paste("Graph 3"))+
  ylab("PERCENT YIELD")+
  scale_x_discrete(limits= levels(data_p$volume))+
  ylim(min=-150, max=150)+
  theme(axis.text.x=element_text(size=10,angle=85,hjust=1,vjust=1))+
  theme(legend.position="none")+
  geom_ribbon(aes(ymax=100, ymin=50), alpha = 0.2, fill="green", col="green")+
  geom_ribbon(aes(ymax=0, ymin=0), alpha = 0.2, fill="black", col="black", size=1.0)

ggarrange(graph_1, graph_2, graph_3, ncol=3, nrow=1, common.legend=TRUE, legend= "bottom")

Вот пример того, как будет выглядеть один график: enter image description here

и вот как выглядят комбинированные графики:

enter image description here

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Вы можете попробовать использовать функцию plot_grid() из пакета cowplot. Вы найдете пакет виньетка https://cran.r -project.org / веб / пакеты / cowplot / виньетки / introduction.html .

В вашем случае попробуйте, cowplot::plot_grid(graph_1, graph_2, graph_3, ncol = 3, align = "h")

0 голосов
/ 01 мая 2019

Возможно, вы захотите взглянуть на пакет patchwork .

В качестве альтернативы, если все ваши графики имеют одинаковое количество строк в виде графических элементов, вы можете преобразовать свои графики в gtables и связать (или rbind) их вместе.

library(grid)
p <- p <- ggplot(iris, aes(Petal.Length, Sepal.Length)) + 
  geom_point() + 
  facet_wrap(~ Species, nrow = 3)

grobs <- ggplotGrob(p)

multi <- cbind(grobs, grobs, grobs, size = "first")

grid.newpage(); grid.draw(multi)

enter image description here

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

Если вы хотитеПогрузитесь в детали, которые вы можете возиться с gtables, если вы хотите интуитивно-понятное объединение графиков, я предлагаю пакет лоскутных.

0 голосов
/ 01 мая 2019

Вы также можете попробовать функцию grid.arrange() в пакете gridExtra. Вот пример из R Blogger: https://www.r -bloggers.com / extra-extra-get-your-gridextra / . Вот также пакет виньетка https://cran.r -project.org / web / packages / gridExtra / vignettes /rangeGrob.html .

Попробуйте grid.arrange(graph_1,graph_2,graph_3, ncol = 3)

...