使用for循环保存多个ggplot图表

59

我希望自动化生成多个ggplot:

通用数据集:

mydata<-data.frame(matrix(rnorm(100),ncol=5))
names(mydata)<-c("Tijd","X1","X2","X3","X4") 

指定要包含的变量:

Start=2
Stop=5

保存绘图的列表:

gvec<-vector("list",length=length(Start:Stop))

创建图表:

for(i in Start:Stop){
  graphy<-ggplot(mydata,aes_string(x="Tijd",y=names(mydata)[i]))+geom_point()+mytheme
  gvec[[i-Start+1]]<-graphy
}

保存图表:

for(i in Start:Stop){
tiff(paste0("Test/Residu/Plots/Prei/mydata.",names(mydata)[i],"09.14.tiff"),width=720,height=720)
gvec[[i-Start+1]]
graphics.off()
}

生成了图形列表;我也可以手动保存这些图形。然而,使用最后一个循环后生成的所有文件都是空白的。我无法弄清楚原因。

根据Roland的建议,我尝试了print(gvec[[i-Start+1]]),但仍然得到空白文件作为输出。


print(gvec[[i-Start+1]]) - Roland
似乎无效。仍然是空文件。 - Pinemangoes
3
你需要显式调用 print 函数才能将绘图结果显示在设备上(这就是 Roland 所说的)。 - Roman Luštrik
我刚刚运行了你的代码,它对我有效。当在你的最终循环中添加建议的 print 函数时,它会生成 4 个 tiff 文件。 - bdemarest
3个回答

115

以下是在循环中创建ggplot的可完全再现示例。

# Plot separate ggplot figures in a loop.
library(ggplot2)

# Make list of variable names to loop over.
var_list = combn(names(iris)[1:3], 2, simplify=FALSE)

# Make plots.
plot_list = list()
for (i in 1:3) {
    p = ggplot(iris, aes_string(x=var_list[[i]][1], y=var_list[[i]][2])) +
        geom_point(size=3, aes(colour=Species))
    plot_list[[i]] = p
}

# Save plots to tiff. Makes a separate file for each plot.
for (i in 1:3) {
    file_name = paste("iris_plot_", i, ".tiff", sep="")
    tiff(file_name)
    print(plot_list[[i]])
    dev.off()
}

# Another option: create pdf where each page is a separate plot.
pdf("plots.pdf")
for (i in 1:3) {
    print(plot_list[[i]])
}
dev.off()

在此输入图像描述


这对我没有用,但下面的答案有效,顺便说一句——也许它已经过时了? - Bajcz
1
@Bajcz,这个答案中的代码在我的电脑上仍然可以正常运行,没有出现错误。以下是sessionInfo()的部分输出:R version 3.6.1 (2019-07-05) Running under: macOS Catalina 10.15.7 ggplot2_3.3.2。你可以看到,我的R版本已经过时了3年。也许最近的更改导致了错误? - bdemarest

32

你还可以使用 ggplot2 库中的 ggsave 函数。

library(ggplot2)
data("iris")

# list of values to loop over
  uniq_species = unique(iris$Species)


# Loop

for (i in uniq_species) {

  temp_plot = ggplot(data= subset(iris, Species == i)) + 
                  geom_point(size=3, aes(x=Petal.Length, y=Petal.Width )) +
                  ggtitle(i)

  ggsave(temp_plot, file=paste0("plot_", i,".png"), width = 14, height = 10, units = "cm")
}

阅读这篇文章时,对我来说,这个解决方案比被接受的答案更好。 - Bajcz
为什么 ggsave 保存的图表背景是黑色,而不是在 RStudio 面板中显示的白色背景? - Julien

8

您可以在同一个循环内创建和导出图表。合并后的代码如下:

for(i in Start:Stop){
  graphy<-ggplot(mydata,aes_string(x="Tijd",y=names(mydata)[i]))+geom_point()+mytheme
  tiff(paste0("Test/Residu/Plots/Prei/mydata.",names(mydata)[i],"09.14.tiff"),width=720,height=720)
  print(graphy)
  dev.off()  
}

对于具有堆叠数据的常规情况,其中id变量对应于子组(国家、个人等):

for (i in 1:10) {
  mydata_id <- subset(mydata, id == i) # subselect group
  p <- ggplot(mydata_id, aes(x, y)) + geom_line() # create graph
  png(paste("plot_", i, ".png", sep = ""), width=600, height=500, res=120) # start export
  print(p) 
  dev.off() # finish export
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接