r - 当ggsave输出为.svg时缺少对象

时间:2015-12-18 21:49:31

标签: r svg ggplot2 gridextra gtable

我尝试单步执行数据集并为每个因子创建直方图和摘要表,并将输出保存为.svg。直方图使用ggplot2创建,汇总表使用summary()创建。

我已成功使用下面的代码将输出保存到单个.pdf,每个页面都包含相关的直方图/表格。但是,当我尝试使用.svg将每个直方图/表格组合保存为一组ggsave图像时,只有ggplot直方图显示在.svg中。桌子只是空白区域。

我已尝试使用dev.copy Cairosvg但最终得到的结果相同:直方图呈现,但表没有。如果我将图像保存为.png,则表格会显示出来。

我使用iris数据作为可重现的数据集。我没有使用R-Studio,我看到它导致一些"空图"对别人的悲伤。

#packages used
library(ggplot2)
library(gridExtra)
library(gtable)
library(Cairo)
#Create iris histogram plot
  iris.hp<-ggplot(data=iris, aes(x=Sepal.Length)) +
    geom_histogram(binwidth =.25,origin=-0.125,
      right = TRUE,col="white", fill="steelblue4",alpha=1) + 
       labs(title = "Iris Sepal Length")+
        labs(x="Sepal Length", y="Count")
   iris.list<-by(data = iris, INDICES = iris$Species, simplify = TRUE,FUN = function(x) 
     {iris.hp %+% x + ggtitle(unique(x$Species))})

#Generate list of data to create summary statistics table
  sum.str<-aggregate(Sepal.Length~Species,iris,summary)
  spec<-sum.str[,1]
  spec.stats<-sum.str[,2]
  sum.data<-data.frame(spec,spec.stats)
  sum.table<-tableGrob(sum.data)
  colnames(sum.data) <-c("species","sep.len.min","sep.len.1stQ","sep.len.med",
  "sep.len.mean","sep.    len.3rdQ","sep.len.max")
  table.list<-by(data = sum.data, INDICES = sum.data$"species", simplify =   TRUE, 
     FUN = function(x) {tableGrob(x)})

#Combined histogram and summary table across multiple plots
 multi.plots<-marrangeGrob(grobs=(c(rbind(iris.list,table.list))),
   nrow=2, ncol=1, top = quote(paste(iris$labels$Species,'\nPage', g, 'of',pages)))

#bypass the class check per @baptiste
ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]
#
for(i in 1:3){
  multi.plots<-marrangeGrob(grobs=(c(rbind(iris.list[i],table.list[i]))),
    nrow=2, ncol=1,heights=c(1.65,.35),
    top = quote(paste(iris$labels$Species,'\nPage', g, 'of',pages)))
  prefix<-unique(iris$Species)
  prefix<-prefix[i]
  filename<-paste(prefix,".svg",sep="")
  ggsave(filename,multi.plots)
  #dev.off()
}

编辑删除了@rawr引用的主题tt3。它是在示例代码中意外遗留的。这并没有引起问题,万一有人好奇。

1 个答案:

答案 0 :(得分:0)

编辑:删除之前关于它在32位安装下工作而不是x64安装的答案,因为这不是问题。仍然不确定是什么导致了这个问题,但它现在正在运作。保留有关grid.export的信息,因为它可能是其他人的有用替代方案。

以下是使用.svg's保存grid.export()的循环,尽管我对此(不同的数据集)存在一些文本格式问题。

for(i in 1:3){
 multi.plots<-marrangeGrob(grobs=(c(rbind(iris.list[i],table.list[i]))),
    nrow=2, ncol=1,heights=c(1.65,.35), top =quote(paste(iris$labels$Species,'\nPage', g, 
    'of',pages)))
prefix<-unique(iris$Species)
prefix<-prefix[i]
filename<-paste(prefix,".svg",sep="")
grid.draw(multi.plots)
grid.export(filename)
grid.newpage()
}

编辑:至于使用arrangeGrob per @ baptiste的评论。以下是更新的代码。我错误地将单括号[]用于返回的by列表,因此我切换到了正确的双括号[[]]并使用了grid.drawggsave呼叫。

for(i in 1:3){
prefix<-unique(iris$Species)
prefix<-prefix[i]
multi.plots<-grid.arrange(arrangeGrob(iris.list[[i]],table.list[[i]],
   nrow=2,ncol=1,top = quote(paste(iris$labels$Species))))
filename<-paste(prefix,".svg",sep="")
ggsave(filename,grid.draw(multi.plots))
}