无法将ggplots的网格保存到文件

时间:2015-09-06 12:10:46

标签: r ggplot2 png gridextra

我正在尝试并且无法在我的硬盘驱动器上将ggplots网格保存为.png,并希望对我的代码进行疑难解答。

以下是使用乐高星球大战集上的公共数据重现我的错误的示例:

library(dplyr)
library(ggplot2)
library(grid)
library(gridExtra)

# Load the Lego data and subset it to Lego Star Wars sets
Lego <- read.csv("https://raw.githubusercontent.com/seankross/lego/master/data-tidy/legosets.csv", stringsAsFactors=FALSE)
Lego.SW <- filter(Lego, Theme=="Star Wars")

# Make a list with the ggplot objects to plot
lego_plot_list = list()
lego_plot_list[[1]] = ggplot(tally(group_by(Lego.SW, Year)), aes(x=Year, y=n)) + geom_line() + theme_bw() + ylab("Number of sets released")
lego_plot_list[[2]] = ggplot(Lego.SW, aes(Pieces)) + geom_histogram(binwidth=10) + theme_bw() + ylab("Number of sets")
lego_plot_list[[3]] = ggplot(Lego.SW, aes(USD_MSRP)) + geom_histogram(binwidth=10) + theme_bw() + xlab("Price (USD)") + ylab("Number of sets")
lego_plot_list[[4]] = ggplot(Lego.SW, aes(x=Pieces, y=USD_MSRP)) + geom_point() + theme_bw() + xlab("Number of pieces") + ylab("Price")

# Make the plots
lego.grid = marrangeGrob(lego_plot_list, nrow=2, ncol=2, top="")
lego.grid  # show in terminal to make sure we're getting what we want
ggsave("legostarwars.png", lego.grid)

这是我在该过程结束时得到的错误,无论我之前是否在终端显示lego.grid

Error in ggsave("legostarwars.png", lego.grid) : 
  plot should be a ggplot2 plot

认为我的代码遵循arrangeGrob()文档中给出的示例,我没有在相关问题中看到不同的解决方案。如果我忽略了某些事情而道歉,这是重复的。

如果相关,这是我的会话信息:

R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.4.2     gridExtra_2.0.0 ggplot2_1.0.1  

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.0      assertthat_0.1   digest_0.6.8     MASS_7.3-43      R6_2.1.0         plyr_1.8.3       DBI_0.3.1        gtable_0.1.2     magrittr_1.5    
[10] scales_0.2.5     stringi_0.5-5    lazyeval_0.1.10  reshape2_1.4.1   labeling_0.3     proto_0.3-10     tools_3.2.1      stringr_1.0.0    munsell_0.4.2   
[19] parallel_3.2.1   colorspace_1.2-6

3 个答案:

答案 0 :(得分:2)

如果png对结果不是强制性的,则替代方法是使用函数png('legostarwars.png') lego.grid dev.off() ,它将通过此​​代码产生类似(如果不相同)的结果:

document.getElementById()

答案 1 :(得分:2)

如果您要保存到单个png文件中,您可能不想使用marrangeGrob() m 多页),但arrangeGrob() 。 您看到的错误是由于ggplot2::ggsave中的签入,该签入应在下一版本中消失。在此期间,您可以显式调用png(),也可以安装ggp​​lot2的开发版本。

答案 2 :(得分:1)

dplyr/ggplot2中使用R 3.2.2的devel版本,它对我有用。

lego.grid <- marrangeGrob(lego_plot_list, nrow=2, ncol=2, top="")
grid.newpage()#from @baptiste's comments
ggsave("legostarwars.png", lego.grid)
#Saving 7 x 6.99 in image

enter image description here

sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.2 LTS

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] lazyeval_0.1.10.9000 gridExtra_2.0.0      ggplot2_1.0.1.9003  
[4] data.table_1.9.5     dplyr_0.4.3.9000     overflow_0.2-1      
[7] stringr_1.0.0        reshape2_1.4.1      

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.0      assertthat_0.1   chron_2.3-45     plyr_1.8.2      
 [5] R6_2.0.1         gtable_0.1.2     DBI_0.3.1        magrittr_1.5    
 [9] scales_0.3.0     stringi_0.5-1    labeling_0.3     tools_3.2.2     
[13] munsell_0.4.2    parallel_3.2.2   colorspace_1.2-6