ggplot gridded SpatialPolygonsDataFrame 基于点数据生成奇数三角形和子集数据

问题描述

使用下面的代码,我可以绘制以下内容: 此代码改编自 here

enter image description here

如您所见,情节几乎没有问题。我正在努力

  1. 删除情节中的奇怪线条
  2. 只在有数据的地方绘制单元格(网格)
  3. 在网格单元顶部绘制 ID(参见 gridSpatialpolygons$values

我意识到这个问题有几点,但我希望一个解决方案可以解决所有问题。

# Load libraries
library(sp)
library(raster)
library(ggplot2)

# Projection
wgs.84 <- CRS("+proj=longlat +datum=wgs84 +no_defs +ellps=wgs84 +towgs84=0,0")

# Load data
x <- c(76.82973,76.82972,76.82969,76.83076,76.83075,76.83071,76.83129,76.83126,76.83125) 
y <- c(28.26734,28.26644,28.26508,28.26778,28.26733,28.26507,28.26912,28.26732,28.26687) 
z <- c(-56.7879,-58.22462,-58.4211,-55.75333,-58.55153,-56.38619,-56.11011,-58.17415,-59.77212)

# Create data frame
dataset <- data.frame("LONGITUDE" = x,"LATITUDE" = y,"VALUES" = z)

# Create SpatialPointsDataFrame object  
datasetSP <- SpatialPointsDataFrame(coords = dataset[,c(1,2)],data = data.frame("id" = 1:nrow(dataset),"values" = dataset$VALUES),proj4string = wgs.84)

# Extent
extentDatasetSP <-extent(datasetSP)

# Make grid options

# Cell size (map units)
xCellSizeGrid <- 0.001
yCellSizeGrid <- 0.001

# Grid
grid <- GridTopology(cellcentre.offset = c(extentDatasetSP@xmin,extentDatasetSP@ymin),cellsize = c(xCellSizeGrid,yCellSizeGrid),cells.dim = c(3,7))

# Create SpatialGrid object
gridSpatial <- SpatialGrid(grid = grid,proj4string = wgs.84)


# Convert to SpatialPixels object
gridSpatialPixels <- as(gridSpatial,"SpatialPixels")

# Convert to Spatialpolygons object
gridSpatialpolygons <- as(gridSpatialPixels,"Spatialpolygons")

# Add 'id' and 'values' to every polygon
gridSpatialpolygons$id <- 1:nrow(coordinates(gridSpatialpolygons))
gridSpatialpolygons$values <- paste("Gridvalue",1:nrow(coordinates(gridSpatialpolygons)),sep = ":")

# Get attributes from polygons 
samplePointsInpolygons2 <- datasetSP %over% gridSpatialpolygons

ggplot(gridSpatialpolygons,aes(x = long,y = lat)) + 
  geom_polygon(color = "red") +
  geom_point(data = dataset,aes(x = LONGITUDE,y = LATITUDE))

解决方法

谈到空间对象时,ggplot2(以及一般的 tidyverse)似乎与 sf 的搭配比 sp 更好。以下建议取自相关 broom 包中的帮助文件之一:

请注意,sf 包现在定义了整洁的空间对象,并且是 空间数据的推荐方法。 sp 整理者很可能是 在不久的将来不赞成使用 sf::st_as_sf()。发展 sp 个整理器已在 broom 停止。

转换为 sf 后,事情应该相当简单。

library(dplyr)

sf::st_as_sf(gridSpatialPolygons) %>%
  filter(id %in% samplePointsInPolygons2$id) %>%       # keep only grid cells with data 
  ggplot() +
  geom_sf(colour = "red") +
  geom_sf_text(aes(label = values),# label cells 
               nudge_y = 0.0003,colour = "grey40") +
  geom_point(data = dataset,aes(x = LONGITUDE,y = LATITUDE))

plot