1

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

开关错误(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)

我很高兴收到任何关于如何在那种对象(ggplot + grid_text)上使用 plot_grid 的想法。

4

2 回答 2

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)

在此处输入图像描述

于 2017-10-17T17:47:55.573 回答
2

您的示例应该可以工作,而事实并非如此,这是我需要研究的错误。

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

首先,您可以使用网格图形将 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 对象和其他网格对象。例如,您可以像这样将文本 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)

最后,我想指出Marco Sandri 的解决方案,它使用grid.grab(),也适用于plot_grid()而不是grid.arrange()

于 2017-11-23T20:00:58.090 回答