使用spplot在R中的for循环中绘制绘图

时间:2017-11-07 04:51:54

标签: r for-loop gis

我在R中编写的东西有点麻烦,我通常会在另一种语言的for循环中进行...

我现在正在尝试使用sp包中的spplot创建一个绘图(它是一个chloropleth地图),但我想为一堆变量做这个。在for循环中,我会像这样编程:

for (TRAIT in c("height","bmi","whr","body_fat","income")){
pdf("plot_of_TRAIT.pdf")
spplot(MyData, "TRAIT", col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
}

其中每个TRAIT实例应该由我给for循环的变量替换(所以在pdf的文件名中,并作为spplot命令中的参数)。现在,显然这段代码不起作用,但是如何在R中执行此操作?

更新

我得到了创建不同pdf文件的代码,但spplot命令仍然不起作用。它会创建空的pdf文件:

for (TRAIT in c("height","bmi","whr","body_fat","income")){
outfile <- paste0("plot_of_", TRAIT, ".pdf")
pdf(outfile)
spplot(MyData, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()
}

如果我在for循环之外运行完全相同的代码,如下所示:

pdf("plot_of_height.pdf")
spplot(MyData, "height", col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()

它工作正常,我在plot_of_height.pdf文件中得到了所需的图。

更新2: 这似乎是spplot的一个问题。如果我运行这个:

TRAIT <- "height"
pdf("plot_of_height.pdf")
spplot(MyData, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5)
dev.off()

我收到以下错误:

Error in [.data.frame(obj@data, zcol) : undefined columns selected

2 个答案:

答案 0 :(得分:2)

您需要使用变量构造输出文件名。

例如:

outfile <- paste0("plot_of_", TRAIT, ".pdf")
pdf(outfile)

对于spplot,您可能需要使用TRAIT(无引号)。

修改

由于spplot(zcol = ...可以是列号,我想知道这是否可行?

traits <- c("height","bmi","whr","body_fat","income")
for(i in 1:length(traits)) {
  pdf(paste0("plot_of_", traits[i], ".pdf")
  spplot(MyData, i, col.regions = my.palette, cuts = 8, lwd = 0.5)
  dev.off()
}

答案 1 :(得分:1)

不看你的数据,我不能说你为什么会有未定义的列错误。复制您的更新2&#39;使用meuse数据集的代码不会为我抛出相同的错误:


library(sp)
demo(meuse, ask = FALSE, echo = FALSE)
TRAIT <- "copper"
my.palette <- c("black", "red", "green", "blue")
spplot(meuse, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5)

至于你问题的第一个案例:spplot(很像ggplot)除非明确打印,否则不会在循环内向设备输出任何内容。基本上你打开一个pdf文件,创建图但不保存到pdf文件,然后

以下代码适合您:

for (TRAIT in c("height","bmi","whr","body_fat","income")){
    outfile <- paste0("plot_of_", TRAIT, ".pdf")
    pdf(outfile)
    print(spplot(MyData, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5))
    dev.off()
}

我使用Meuse数据集对其进行了测试,它在那里运行良好:

library(sp)
demo(meuse, ask = FALSE, echo = FALSE)
my.palette <- c("black", "red", "green", "blue")
for(TRAIT in c("cadmium", "copper", "lead", "zinc")){
  outfile <- paste0("plot_of_", TRAIT, ".pdf")
  pdf(outfile)
  print(spplot(meuse, TRAIT, col.regions = my.palette, cuts = 8, lwd = 0.5))
  dev.off()
}

给我4个不同的pdf,每个pdf包含相应变量的空间图。