Вот.

ющее пришло в комментарии кэта почта: При создании маргинальных участков сaxis_canvas() Функция в Cowplot, как мы можем создать разрыв между основным сюжетом и маргинальным участком?

Пример кода:

require(cowplot)

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy, color = factor(cyl))) + 
  geom_point() + 
  xlab("City driving (miles/gallon)") +
  ylab("Highway driving (miles/gallon)") +
  theme_minimal()

xbox <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = factor(cyl), color = factor(cyl))) + 
  scale_x_discrete() + coord_flip()
ybox <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = factor(cyl), color = factor(cyl))) +
  scale_x_discrete()

p1 <- insert_xaxis_grob(pmain, xbox, grid::unit(0.6, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox, grid::unit(0.6, "in"), position = "right")
ggdraw(p2)

Как мы видим в этом примере, маргинальные поля непосредственно касаются основной панели. Цель состоит в том, чтобы создать некоторый разрыв. Как это может быть сделано?

Ответы на вопрос(1)

Решение Вопроса

Вставить пустой участок

Мы можем применитьinsert_xaxis_grob() / insert_yaxis_grob() функционирует итеративно для вставки нескольких гробов, один из которых может быть пустым Таким образом, мы можем вставить определенное количество места с любой стороны маргинальных графиков. Здесь я показываю, как это сделать изнутри, чтобы создать зазор между основной панелью и маргинальными участками:

# pmain, xbox, ybox are defined as in the question
pnull <- ggdraw() # generate empty plot

p1 <- insert_xaxis_grob(
        insert_xaxis_grob(pmain, xbox, grid::unit(0.6, "in"), position = "top"),
        pnull, grid::unit(0.2, "in"), position = "top")

p2 <- insert_yaxis_grob(
        insert_yaxis_grob(p1, ybox, grid::unit(0.6, "in"), position = "right"),
        pnull, grid::unit(0.2, "in"), position = "right")
ggdraw(p2)

Создать разрыв на маргинальных участках

В качестве альтернативы, поскольку маргинальные графики нарисованы с помощью ggplot2, мы можем просто указать пределы оси, которые генерируют пространство в соответствующем месте. Т.е. вместоxbox а такжеybox в исходном коде мы определяемxbox2 а такжеybox2 через:

xbox2 <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = as.numeric(factor(cyl)), color = factor(cyl))) + 
  scale_x_continuous(limits = c(-2, 4.5)) + coord_flip()
ybox2 <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = as.numeric(factor(cyl)), color = factor(cyl))) +
  scale_x_continuous(limits = c(-2, 4.5))

p1 <- insert_xaxis_grob(pmain, xbox2, grid::unit(0.8, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox2, grid::unit(0.8, "in"), position = "right")
ggdraw(p2)

Чтобы понять, что здесь происходит, давайте сравнимxbox а такжеxbox2 бок о бок:

plot_grid(xbox + panel_border("black"), 
          xbox2 + panel_border("black"), nrow = 1, scale = 0.9)

Мы видим какxbox2 (справа) имеет дополнительное пространство внизу, которое было создано, начиная ось с -2, даже если первый прямоугольник расположен в позиции 1. Более подробную информацию о том, как выбрать диапазоны осей для этих краевых графиков, можно получить нашелВот.

Ваш ответ на вопрос