Нарисуйте «сетку» между расположенными участками - PullRequest
6 голосов
/ 05 июля 2019

Я работаю с 4 разными графиками и использую ggarrange () из пакета ggpubr, чтобы поместить их в один график. Я подготовил пример:

library(ggpubr)
library(ggplot2)

p1 <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + ggtitle("Plot 1")
p2 <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point() + ggtitle("Plot 2")
p3 <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Width)) + geom_point() + ggtitle("Plot 3")
p4 <- ggplot(iris, aes(x = Petal.Length, y = Sepal.Width)) + geom_point() + ggtitle("Plot 4") +
  facet_wrap(~Species)

plot.list <- list(p1, p2, p3, p4)

ggarrange(plotlist = plot.list)

Выход: enter image description here

Я хотел бы нарисовать границу вокруг отдельных участков, вот так:

enter image description here

Есть ли способ нарисовать эту границу? Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 июля 2019

grid.polygon() довольно ручной, но я думаю, что он может сделать трюк:

Использование RStudio

library("ggpubr")
library(ggplot2)
library(gridExtra)
library(grid)
p1 <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + ggtitle("Plot 1")
p2 <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point() + ggtitle("Plot 2")
p3 <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Width)) + geom_point() + ggtitle("Plot 3")
p4 <- ggplot(iris, aes(x = Petal.Length, y = Sepal.Width)) + geom_point() + ggtitle("Plot 4") +
  facet_wrap(~Species)

plot.list <- list(p1, p2, p3, p4)

ggarrange(plotlist = plot.list)
x = c(0, 0.5, 1, 0.5, 0.5, 0.5)
y = c(0.5, 0.5, 0.5,0, 0.5, 1)
id = c(1,1,1,2,2,2)
grid.polygon(x,y,id)

enter image description here Использование Shiny (Правка)

Когда вы делаете это в приложении блестяще, необходимо добавить сетку, используя annotation_custom(), следующим образом:

    ggarrange(plotlist = plot.list) + 
    annotation_custom(
             grid.polygon(c(0, 0.5, 1, 0.5, 0.5, 0.5),
                          c(0.5, 0.5, 0.5,0, 0.5, 1), 
                          id = c(1,1,1,2,2,2), 
                          gp = gpar(lwd = 1.5)))
2 голосов
/ 05 июля 2019

Не уверен, что это будет работать для вас, но вы можете просто поставить границы вокруг ваших отдельных участков. Однако это включает в себя границы снаружи макета. Ваше описание выглядит так, как будто вы не против этого, но в вашем примере сюжета только внутренние линии сетки.

Вы можете добавить вызов theme при создании графиков; вместо того, чтобы редактировать создание графика, я просто сделал это для каждого графика в списке, прежде чем соединить их все вместе.

library(ggpubr)
library(ggplot2)

#### same plot creation here ######

plot.list <- lapply(list(p1, p2, p3, p4), 
                    function(p) p + theme(plot.background = element_rect(color = "black")))

ggarrange(plotlist = plot.list)

...