如何通过 ggplot2 绘制 shapefile?
How to plot the shapefile via ggplot2?
我有一个栅格数据和公园的多边形,我想将它重叠在栅格上。当我添加多边形时,它显示在此处但在 ggplot 上,我如何通过 ggplot2 在我的栅格数据上添加多边形(公园的多边形就像圆形)。我的代码附在下面。
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
pg <- readOGR("E:/park/1aa.shp") # loadshapfile
plot(r)
plot(pg, add= TRUE,) # it appears here like first picture (left).
但是我如何在我的 ggplot 2 中添加这个多边形 o 公园。我的 ggplot 2 代码附在下面。
centile90 <- quantile(r, 0.90)
df <- as.data.frame(as(r, "SpatialPixelsDataFrame"))
colnames(df) <- c("value", "x", "y")
library(ggplot2)
mybreaks <- seq(0, 500, 50)
ggplot(df, aes(x, y, z = value)) +
geom_contour_filled(breaks = mybreaks) +
geom_contour(breaks = centile90, colour = "pink",
size = 0.5) +
scale_fill_manual(values = hcl.colors(length(mybreaks) - 3, "Zissou1", rev = FALSE)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme_classic() +
theme()
需要帮助如何在我的 ggplot2 代码中添加 ** pg(多边形)**。
更新 1
多边形数据说明
如前所述,使用 sf
比使用 sp
更方便,除此之外 sf
是为了取代 sp
.
在这里找到一个可重现的例子。第一部分仅用于模拟您的文件 "E:/park/1aa.shp"
。由于没有提供,所以我无法使用您的真实数据,但我们假设它是相同的数据集...:[=21=]
library(raster)
library(sf)
library(sp)
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
# Let's mock your shapefile
poly <- st_as_sfc(st_bbox(st_as_sf(rasterToPolygons(r))))
# Sample 4 points
set.seed(3456)
sample <- st_sample(poly, 4)
sample <- st_buffer(sample, c(0.01, 0.02, 0.03))
sample <- st_sf(x=1:4, sample)
st_write(sample, "1aa.shp", append = FALSE)
# Mocked data
# Now let's start with your code -------
library(raster)
library(sf)
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
# Use sf!!
pg <- st_read("1aa.shp") # loadshapfile
plot(r)
plot(st_geometry(pg), add= TRUE,) # it appears here like first picture (left).
现在在您的 pg
对象上使用 geom_sf()
:
centile90 <- quantile(r, 0.90)
df <- as.data.frame(as(r, "SpatialPixelsDataFrame"))
colnames(df) <- c("value", "x", "y")
library(ggplot2)
mybreaks <- seq(0, 500, 50)
ggplot(df, aes(x, y, z = value)) +
geom_contour_filled(breaks = mybreaks) +
geom_contour(breaks = centile90, colour = "pink",
size = 0.5) +
# And here we have it
geom_sf(data=pg, fill="black", inherit.aes = FALSE) +
scale_fill_manual(values = hcl.colors(length(mybreaks)-1, "Zissou1", rev = FALSE)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme_classic() +
theme()
我有一个栅格数据和公园的多边形,我想将它重叠在栅格上。当我添加多边形时,它显示在此处但在 ggplot 上,我如何通过 ggplot2 在我的栅格数据上添加多边形(公园的多边形就像圆形)。我的代码附在下面。
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
pg <- readOGR("E:/park/1aa.shp") # loadshapfile
plot(r)
plot(pg, add= TRUE,) # it appears here like first picture (left).
但是我如何在我的 ggplot 2 中添加这个多边形 o 公园。我的 ggplot 2 代码附在下面。
centile90 <- quantile(r, 0.90)
df <- as.data.frame(as(r, "SpatialPixelsDataFrame"))
colnames(df) <- c("value", "x", "y")
library(ggplot2)
mybreaks <- seq(0, 500, 50)
ggplot(df, aes(x, y, z = value)) +
geom_contour_filled(breaks = mybreaks) +
geom_contour(breaks = centile90, colour = "pink",
size = 0.5) +
scale_fill_manual(values = hcl.colors(length(mybreaks) - 3, "Zissou1", rev = FALSE)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme_classic() +
theme()
需要帮助如何在我的 ggplot2 代码中添加 ** pg(多边形)**。
更新 1 多边形数据说明
如前所述,使用 sf
比使用 sp
更方便,除此之外 sf
是为了取代 sp
.
在这里找到一个可重现的例子。第一部分仅用于模拟您的文件 "E:/park/1aa.shp"
。由于没有提供,所以我无法使用您的真实数据,但我们假设它是相同的数据集...:[=21=]
library(raster)
library(sf)
library(sp)
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
# Let's mock your shapefile
poly <- st_as_sfc(st_bbox(st_as_sf(rasterToPolygons(r))))
# Sample 4 points
set.seed(3456)
sample <- st_sample(poly, 4)
sample <- st_buffer(sample, c(0.01, 0.02, 0.03))
sample <- st_sf(x=1:4, sample)
st_write(sample, "1aa.shp", append = FALSE)
# Mocked data
# Now let's start with your code -------
library(raster)
library(sf)
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
# Use sf!!
pg <- st_read("1aa.shp") # loadshapfile
plot(r)
plot(st_geometry(pg), add= TRUE,) # it appears here like first picture (left).
现在在您的 pg
对象上使用 geom_sf()
:
centile90 <- quantile(r, 0.90)
df <- as.data.frame(as(r, "SpatialPixelsDataFrame"))
colnames(df) <- c("value", "x", "y")
library(ggplot2)
mybreaks <- seq(0, 500, 50)
ggplot(df, aes(x, y, z = value)) +
geom_contour_filled(breaks = mybreaks) +
geom_contour(breaks = centile90, colour = "pink",
size = 0.5) +
# And here we have it
geom_sf(data=pg, fill="black", inherit.aes = FALSE) +
scale_fill_manual(values = hcl.colors(length(mybreaks)-1, "Zissou1", rev = FALSE)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme_classic() +
theme()