【问题标题】:Plotting shapefile Error in loops在循环中绘制 shapefile 错误
【发布时间】:2013-07-03 02:38:17
【问题描述】:

我正在尝试绘制一个包含 12 个生态区的图,这些生态区以 shapefile 的形式出现。 举个例子:

ER_10.2<-Level.2.ecoregs[Level.2.ecoregs$NA_L2CODE=="10.2",]
> ER_10.2
class       : SpatialPolygonsDataFrame 
nfeatures   : 26 
extent      : -1693158, 44930.55, -2591002, -691719.8  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
nvariables  : 8
names       : NA_L2CODE,    NA_L2NAME, NA_L1CODE,              NA_L1NAME,           NA_L2KEY,                   NA_L1KEY,  Shape_Leng,   Shape_Area 
min values  :      10.2, WARM DESERTS,        10, NORTH AMERICAN DESERTS, 10.2  WARM DESERTS, 10  NORTH AMERICAN DESERTS,    11613.69,      8382714 
max values  :      10.2, WARM DESERTS,        10, NORTH AMERICAN DESERTS, 10.2  WARM DESERTS, 10  NORTH AMERICAN DESERTS, 11456404.58, 510159399963 

我需要循环执行此操作,因为我还包括其他分析。

Ecoregions.list <- c("ER_10.2", "ER_12.1", "ER_14.3","ER_13.2",
  "ER_09.6", "ER_09.5", "ER_14.1", "ER_13.3", "ER_09.4", "ER_08.3", "ER_13.1", "ER_11.1")

Ecoregions<-unique(as.character(Ecoregions.list))

for(i in 1:length(Ecoregions))
    {
    Ecoregions<-unique(as.character(Ecoregions.list))
    ER=as.name(Ecoregions[i])
    plot (ER)
    }

但是当我尝试在图中阅读以绘制它时,我总是得到这个错误:

Error in xy.coords(x, y, xlabel, ylabel, log) : invalid first argument

有人对如何解决此问题有任何建议吗?

提前致谢!

【问题讨论】:

    标签: r plot gis shapefile


    【解决方案1】:

    我不确定循环是否是这种情况下的最佳实践,但我相信在您当前的代码中使用 as.name 会让您感到悲伤。

    也不需要循环遍历1:length(x)for 语句只会迭代遍历像Ecoregions 这样的向量的每个元素,而不会被明确告知这样做。

    试试这个简化的例子,使用get

    ER_10.2 <- data.frame(v1=1:10)
    ER_12.1 <- data.frame(v1=2:11)
    Ecoregions.list <- c("ER_10.2", "ER_12.1")
    Ecoregions <- unique(Ecoregions.list)
    
    for(i in Ecoregions) {
        ER <- get(i)[[1]]
        # add the below line if you want 12 separate plots
        # dev.new() 
        plot(ER)
        # insert other code here which would presumably negate
        # your ability to use the 'lapply' function.
    }
    

    我还应该注意,在 R 中使用 get 之类的函数和文本字符串来表示数据名称通常不是一个好主意。通常,如果您有许多相关的data.frames 或其他对象,您会将它们放在一个list 中,例如:

    Ecoregions <- list(ER_10.2, ER_12.1)
    

    这允许您使用 lapplysapply 将函数应用于每个组件,如下所示:

    lapply(Ecoregions,function(x) plot(x[[1]]))
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您不想使用as.name,但我认为您正在寻找类似get 的东西。因此,只需将 ER=as.name(Ecoregions[i]) 替换为 ER=get(Ecoregions[i]) 即可。

      但这并不是处理这种情况的好方法。您可以创建一个list 的区域,而不是为每个区域创建一个新变量。这样,您将遍历 list 元素而不是变量名称。

      例如,代替ER_10.2&lt;-Level.2.ecoregs[Level.2.ecoregs$NA_L2CODE=="10.2",] 尝试执行以下操作:

      # Split your regions by the L2 Code.
      list.of.regions<-split(Level.2.ecoregs,Level.2.ecoregs$NA_L2CODE)
      

      现在,如果您的数据发生更改(例如添加了新的NA_L2CODE),您无需更改代码,因为它将成为列表中的新元素。

      现在,您可以遍历列表中的元素:

      # Loop over each element of the list.
      for (region in list.of.regions) 
          plot(region)
      

      而且,如果你想变得花哨,你可以使用lapply,它只是在list 的每个元素上运行一个函数。

      lapply(list.of.regions,plot)
      

      但是,如果您想变得更漂亮,并且想在网格中绘制所有区域的图,则可以使用 latticeggplot。尝试查找 ggmap 以获取一些不错的示例。

      【讨论】:

        猜你喜欢
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 2014-04-21
        • 2020-10-07
        相关资源
        最近更新 更多