r - ggplot gridded SpatialPolygonsDataFrame 根据点数据生成奇数三角形和子集数据
问题描述
使用下面的代码,我可以绘制以下内容:此代码改编自此处
如您所见,该情节几乎没有问题。我正在努力
- 删除情节中的奇怪线条
- 仅绘制有数据的单元格(网格)
gridSpatialPolygons$values
在网格单元顶部绘制 ID(请参阅)
我意识到这个问题有几点,但我希望一个解决方案可以解决所有问题。
# 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)似乎sf
比sp
. 以下建议取自相关broom
软件包中的帮助文件之一:
请注意,该
sf
包现在定义了整洁的空间对象,并且是推荐的空间数据方法。sp
tidiers 很可能在不久的将来被弃用,取而代之的是sf::st_as_sf()
.sp
tidiers的开发已经停止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))
推荐阅读
- gitlab-ci - 如何定义一个 GitLab CI 工作以依赖于一个或另一个以前的工作?
- flutter - Firebase 身份验证:构建函数绝不能返回 null
- python - 如何只运行一次嵌套for循环外循环的python
- reactjs - 调度到组件外部的反应存储
- mysql - 这个 MySQL 过程的目的是什么?
- python-3.x - Discord.py/rewrite - 放大表情符号命令
- google-apps-script - 自动分组新行,因为这些新行按日、月和年添加到日志中
- python - 将数据帧转换为具有 3d 形状 (x,y,z) 的数组
- docker - 错误:运行“docker-compose up”命令时,卷“...telegraf.conf:ro 格式不正确,应为 external:internal[:mode]”
- git - GIT取消链接本地分支并将它们单独复制到远程