grid.text в ggplot дает ошибку в plot_grid

Я пытаюсь использовать функцию plot_grid из пакета cowplot R, чтобы соединить два графика. Однако я получал следующую ошибку:

Ошибка в переключателе (x [[2]] [[1]] $ name, C_abline = C_abline (x [[2]]), C_plot_new = C_plot_new (x [[2]]),: EXPR должен быть вектором длины 1

Поэтому при тестировании обеих графиков я обнаружил, что ошибка возникла из ggplot, который я использовал grid_text. Таким образом, в моем примере я включил только один сюжет. Ниже вы можете воспроизвести проблему:

library(cowplot)
library(ggplot2)
library(ggforce)
library(grid)


### Example
circles <- as.data.frame(cbind(c(0.5, 1.5, 2.5), c(1, 2, 1), c(0.2, 0.2, 0.2)))

# Behold the some circles
ggplot() + geom_circle(aes(x0=V1, y0=V2, r=V3, fill=c("red", "blue", "green")), data=circles)+
  theme_bw() + ylab(expression(symbol('\253'))) + xlab(expression(symbol('\253')))+ theme(legend.position="none",
                                                                                          axis.title.x=element_text(size = 50),
                                                                                          axis.text.x=element_blank(),
                                                                                          axis.ticks.x=element_blank(),
                                                                                          axis.title.y=element_text(size = 50),
                                                                                          axis.text.y=element_blank(),
                                                                                          axis.ticks.y=element_blank()) 

grid.text("Distinct", x = unit(0.04, "npc"), y = unit(0.80, "npc"))

exP <- recordPlot()

plot_grid(exP)

Я был бы рад получить любую идею, как использовать plot_grid для такого рода объектов (ggplot + grid_text).


person user3091668    schedule 17.10.2017    source источник
comment
Другой участок работает без проблем. Вот почему я включил только один для простоты. Я уточню по этому поводу.   -  person user3091668    schedule 17.10.2017
comment
Почему бы не использовать grid.arrange?   -  person Marco Sandri    schedule 17.10.2017
comment
Потому что он дает эту ошибку: Ошибка в gList (list (grobs = list (list (x = 0.5, y = 0.5, width = 1, height = 1,: только 'grobs' разрешены в gList   -  person user3091668    schedule 17.10.2017
comment
Ошибка вызвана тем, что делает recordPlot(). Я рекомендую не использовать его, особенно когда вы работаете только с сеточной графикой, как здесь. См. Предлагаемый мной ответ для альтернатив.   -  person Claus Wilke    schedule 23.11.2017


Ответы (2)


Попробуй это:

library(ggplot2)
library(ggforce)
library(grid)
library(gridExtra)


### Example
circles <- as.data.frame(cbind(c(0.5, 1.5, 2.5), c(1, 2, 1), c(0.2, 0.2, 0.2)))

# Behold the some circles
p1 <- ggplot() + 
  geom_circle(aes(x0=V1, y0=V2, r=V3, fill=c("red", "blue", "green")), data=circles)+
  theme_bw() + ylab(expression(symbol('\253'))) + xlab(expression(symbol('\253')))+ 
  theme(legend.position="none",
        axis.title.x=element_text(size = 50),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.title.y=element_text(size = 50),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank()) 

print(p1)
grid.text("Distinct", x = unit(0.04, "npc"), y = unit(0.80, "npc"))
p2 <- grid.grab()

grid.arrange(p1,p2, nrow=1)

введите здесь описание изображения

person Marco Sandri    schedule 17.10.2017
comment
Важно отметить, что этот ответ работает, потому что recordPlot() был заменен на grid.grab(), а не потому, что plot_grid() был заменен на grid.arrange(). Проблема в recordPlot(). Как только вы захватили текстовый grob с помощью grid.grab(), plot_grid() справится с этим отлично. - person Claus Wilke; 23.11.2017

Ваш пример должен работать, и тот факт, что это не так, - это ошибка, которую мне нужно изучить.

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

Во-первых, вы можете использовать сеточную графику, чтобы объединить ggplot и любой другой grob в комбинированный grob, который затем можно передать plot_grid():

library(cowplot)
library(ggplot2)
library(ggforce)
library(grid)

# Plot of mpg data, to use in plot_grid below
pmpg <- ggplot(mpg, aes(x=cty, y=hwy)) + geom_point()

# Plot with circles
circles <- as.data.frame(cbind(c(0.5, 1.5, 2.5), c(1, 2, 1), c(0.2, 0.2, 0.2)))
pcircles <- ggplot() + 
  geom_circle(aes(x0=V1, y0=V2, r=V3, fill=c("red", "blue", "green")),
              data=circles) +
  theme_bw() + ylab(expression(symbol('\253'))) + 
  xlab(expression(symbol('\253'))) + 
  theme(legend.position="none",
        axis.title.x=element_text(size = 50),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.title.y=element_text(size = 50),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank()) 

# text grob
gtext <- grid::textGrob("Distinct", x = unit(0.04, "npc"), y = unit(0.80, "npc"))

# make combined grob
gcombined <- grid::grobTree(ggplotGrob(pcircles), gtext)

plot_grid(pmpg, gcombined)

Результат:

введите здесь описание изображения

Во-вторых, я написал функцию ggdraw() и связанные с ней функции, чтобы упростить комбинирование объектов ggplot и других объектов сетки. Например, вы можете нарисовать свой текстовый гроб на графике следующим образом:

pcombined <- ggdraw(pcircles) + draw_grob(gtext)
plot_grid(pmpg, gcombined)

Результат выглядит точно так же, как и раньше.

И, если все, что вам нужно сделать, это нарисовать текст, вы также можете использовать draw_text() вместо draw_grob():

pcombined <- ggdraw(pcircles) + draw_text("Distinct", x = 0.04, y = 0.8)
plot_grid(pmpg, gcombined)

Наконец, я хотел бы отметить, что решение Марко Сандри, в котором используется grid.grab(), также работает с plot_grid() вместо grid.arrange().

person Claus Wilke    schedule 23.11.2017