Cowplot обрезает метки при нанесении y> 1 на нескольких графиках - PullRequest
0 голосов
/ 23 января 2019

Во-первых, несколько фиктивных графиков:

df <- data.frame(x = 1:10, y = 2:11)

Поскольку мои реальные графики довольно сложны, я не собираюсь приводить их здесь, но буду использовать другие графики, которые воспроизводят проблему. Достаточно сказать, что когда align установлен на "hv" в plot_grid, это создает много пустого пространства между моими графиками. Чтобы это исправить, я установил поля в исходных графиках так:

library(ggplot2)

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))

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

library(cowplot)

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv")
plot5

Пока я не попытался добавить ярлыки. Поскольку я расширил графики, я хотел добавить метки выше предела y = 1.

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv", labels = c("A", "B", "C", "D"), 
                 label_x = 0.1,
                 label_y = 1.15)+
  theme(plot.margin = unit(c(3, 1, 1, 1), "cm"))
plot5

Возвращает это предупреждение:

Removed 1 rows containing missing values (geom_text).  

enter image description here

Это означает, что он снял две верхние метки, хотя, похоже, места достаточно. Итак, я подумал, что, возможно, поля графика не применяются до тех пор, пока не будут нанесены метки, или, возможно, обрезка вызывает проблему. Итак, я сделал это:

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv") + 
  theme(plot.margin = unit(c(3, 0, 0, 0), "cm")) +
  coord_cartesian(clip = "off")

plot5 + 
  draw_plot_label(c("A", "B", "C", "D"), c(0, 0.5, 0, 0.5), c(1.1, 1.1, .5, .5))   

enter image description here Это возвращает ту же ошибку, что и раньше, хотя, как вы можете видеть, в верхней части графика доступно больше места. В качестве последнего средства я также отключил вырезку на исходных графиках, но это тоже ничего не исправило, например:

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm")) + 
  coord_cartesian(clip = "off")

Проблема возникает только тогда, когда я прокладываю график y = 1. y = 1.01 вызывает проблемы, например. Как мне решить эту проблему? Это кажется довольно простой проблемой, если только нет проблем с ggplot или cowplot.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Следуя предложению использовать пакет 'egg', я устранил проблему: удалите пробелы между графиками и пометите графики разумным образом.

Также стоит отметить, что яйцо кажется быстрее, чем коровье.в рисовании сюжетов.

install.packages("egg")
library(egg)

df <- data.frame(x = 1:10, y = 2:11)

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))

figure <- egg::ggarrange(plot1, plot2, 
         plot3, plot4, 
             nrow = 2,ncol=2,
             labels=c("A", "B", "C","D"),
             label.args = list(gp=gpar(font=2), x=unit(.5,"line")))
figure

enter image description here

0 голосов
/ 24 января 2019

Хорошо, у меня есть ответ, который исправляет вопрос о ярлыках, но не решает проблему невозможности прорисовки прошлого y=1. Вместо того, чтобы уменьшать верхние поля на исходных графиках, я уменьшил нижние поля:

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv", labels = c("A", "B", "C", "D"), 
                   label_x = 0.1,
                   label_y = 1) +
  theme(plot.margin = unit(c(1, 1, 2, 1), "cm"))
plot5

Что позволяет мне наносить метки в разумном месте. enter image description here

Однако для меня все еще не имеет смысла, почему метки обрезаются (и это также происходит, когда y <0). </p>

...