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

ggplot gridded SpatialPolygonsDataFrame producing odd triangles and subsetting data based on point data

使用下面的代码我可以绘制以下内容: 此代码改编自 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,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)似乎与 sfsp 更好用。以下建议摘自相关 broom 包中的帮助文件之一:

Note that the sf package now defines tidy spatial objects and is the recommended approach to spatial data. sp tidiers are likely to be deprecated in the near future in favor of sf::st_as_sf(). Development of sp tidiers has halted in 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))