grid.text 在 ggplot 中给出错误 plot_grid

grid.text in a ggplot give an error in plot_grid

我正在尝试使用 cowplot R 包中的 plot_grid 函数将两个图放在一起。但是,我收到以下错误:

Error in switch(x[[2]][[1]]$name, C_abline = C_abline(x[[2]]), C_plot_new = C_plot_new(x[[2]]), : EXPR must be a length 1 vector

因此,测试这两个图形我发现错误来自我使用的 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('3'))) + xlab(expression(symbol('3')))+ 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)。

试试这个:

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('3'))) + xlab(expression(symbol('3')))+ 
  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)

您的示例应该可以运行,但事实并非如此,这是一个我需要调查的错误。

但是,即使它确实有效,我还是建议不要使用它。我对录制的情节没有很好的经验,一般来说,先绘制情节然后捕捉它的整个往返过程对我来说似乎很尴尬且容易出错。我建议三种选择来做你想做的事。他们都给你相同的最终结果。

首先,您可以使用网格图形将 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('3'))) + 
  xlab(expression(symbol('3'))) + 
  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对象和其他网格对象结合起来。例如,您可以像这样将文本 grob 绘制到图上:

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()