【问题标题】:R Plot Filled Longitude-Latitude Grid Cells on MapR在地图上绘制填充的经纬度网格单元
【发布时间】:2012-06-22 22:30:19
【问题描述】:

我有一个包含多个 (x,y,z) 数据点的数据框,(x,y) 是大小为 w 的经纬度单元格的右下角坐标(例如 1 度网格)。 z 值已在此单元格上取平均值。

我想在 R 中绘制这些点,以便整个网格单元格填充一些源自z 的颜色。

结果将类似于以下图像之一:

投影本身(例如,Lambert 等角圆锥、等角)并不重要,只是网格单元格绘图。

我的数据是稀疏的:并非每个经纬度单元格都有与之关联的数据。

我希望是一个类似于

的解决方案
library(maps)
map("state")
grid_points(my_data,c("x","y","z"),0.5)

其中 0.5 是上面的网格分辨率,表示 0.5 度的单元格。

有什么想法吗?

谢谢!

【问题讨论】:

  • 我很高兴,@PaulHiemstra。你的回答是关于要寻找什么的,我只是想把事情再结合一点。非常感谢您的帮助。

标签: r plot ggplot2 geospatial


【解决方案1】:

使用spplotimage 的替代方法是使用ggplot2。相关的几何图形是geom_rastergeom_tile。第一个应该性能更好并产生更小的文件,第二个更标准。以下示例调用:

ggplot(aes(x = x, y = y, fill = value), data = dat_grid) + geom_tile() + 
  geom_path(data = ant_ggplot)

起源于我的this blogpost。此外,ggplot2 通过mapproj 包支持一系列投影,请参阅coord_map 了解更多详情。

以下是一个工作示例(前提是您已将 YOUR_DATA 定义为具有 x、y、z 列):

library(ggplot2)
library(maps)
us_states <- map_data("state")
(ggplot(aes(x=x,y=y,fill=z),data=YOUR_DATA) + geom_tile())+geom_polygon(data=us_states,aes(x=long, y=lat, group=group), colour="black", fill="white", alpha=0)

【讨论】:

    【解决方案2】:

    如果你的 data.frame 是“x”,试试这个:

    library(sp)
    coordinates(x) <- c("x", "y", "z")
    gridded(x) <- TRUE
    image(x, col = terrain.colors(256), useRaster = TRUE)
    

    要获得真正准确的答案,您应该提供数据样本,希望是整个 data.frame 或您下载的源以及您用来将其读入 R 的代码。

    如果上面的代码在gridded()&lt;- 步骤中失败,那么很可能您的xy 值实际上并未提供常规网格,您的绘图暗示了这一点。如果它们确实是网格化的经度/纬度值,并且您需要将它们投影到图像中的值,那么请参阅 raster 包,或更一般地说是 rgdal 包。

    library(raster)
    ?projectRaster
    
    library(rgdal)
    ?project
    ?spTransform
    

    (在我看来,这些图就像本网站上显示的“北美阿尔伯斯等面积和兰伯特等角圆锥投影”之一:http://www.colorado.edu/geography/gcraft/notes/mapproj/mapproj_f.html)。

    请参阅http://spatialreference.org 以获取投影的 PROJ.4 字符串,您可以在spraster 中使用它。

    【讨论】:

    • 投影本身并不重要,只是网格单元格的绘制。我将编辑问题以反映这一点。
    • 我的回答仍然适用。它也适用于稀疏坐标,只要它们是规则的。在不知道投影或有关您的数据的任何信息的情况下,我们只能猜测,并且投影非常重要,直到您向我们提供足够的详细信息以了解您对这些网格线的真正拥有和真正想要的东西。
    【解决方案3】:

    我最近尝试制作这种地图,最后使用库 akima 的函数 interp 在绘图之前将我的 z 数据内插到常规网格中(任何类型的投影都必须在使用之前完成interp):

    library(akima)
    interp(x,y,z,xo=seq(min(x),max(x),by=0.5),yo=seq(min(y),max(y),by=0.5),extrap=FALSE,linear=TRUE) -> xygrid
    image(xygrid,breaks=seq(min(z),max(z),length=10), col=1:10)
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      library(raster)
      r <- rasterFromXYZ(xyz)
      plot(r)
      

      【讨论】:

        猜你喜欢
        • 2015-08-19
        • 2012-04-19
        • 2014-07-18
        • 1970-01-01
        • 2017-10-09
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多