【问题标题】:How to overlap kriging spatial prediction map on a particular area of a country map in R?如何在R中的国家地图的特定区域上重叠克里金空间预测图?
【发布时间】:2016-07-16 16:12:03
【问题描述】:

我有一个名为“seoul032823”的 81 次观测的每小时 PM10 数据集。您可以从Here 下载。我已经在这个数据集上执行了普通的克里金法,还得到了用于克里金法预测的空间图。我还可以在国家地图上显示观察数据点。但是我不能在国家地图上重叠克里金空间预测图。

我想做什么:我想将我的空间预测地图重叠在韩国地图(不是整个韩国)上。我感兴趣的区域是纬度 37.2N 到 37.7N 和经度 126.6E 到 127.2E。这意味着我需要从韩国地图上裁剪这个区域并将预测地图重叠在上面。我还需要显示原始观测数据点,这些数据点将根据浓度值跟随空间图的颜色。 例如,我想要这种类型的地图:

我的克里金 R 代码,并在韩国地图上显示数据点:

library(sp)
library(gstat)
library(automap)
library(rgdal)
library(e1071)
library(dplyr)
library(lattice)

seoul032823 <- read.csv ("seoul032823.csv")

#plotting the pm10 data on Korea Map
library(ggplot2)
library(raster)

seoul032823 <- read.csv ("seoul032823.csv")
skorea<- getData("GADM", country= "KOR", level=1)
plot(skorea)

skorea<- fortify(skorea)
ggplot()+
  geom_map(data= skorea, map= skorea, aes(x=long,y=lat,map_id=id,group=group),
           fill=NA, colour="black") +
  geom_point(data=seoul032823, aes(x=LON, y=LAT), 
             colour= "red", alpha=0.7,na.rm=T) +
  #scale_size(range=c(2,4))+
  labs(title= "PM10 Concentration in Seoul Area at South Korea",
       x="Longitude", y= "Latitude", size="PM10(microgm/m3)")+
  theme(title= element_text(hjust = 0.5,vjust = 1,face= c("bold")))

# Reprojection
coordinates(seoul032823) <- ~LON+LAT
proj4string(seoul032823) <- "+proj=longlat +datum=WGS84" 
seoul032823 <- spTransform(seoul032823, CRS("+proj=utm +north +zone=52 +datum=WGS84"))

#Creating the grid for Kriging
LON.range <- range(as.integer(seoul032823@coords[,1 ])) + c(0,1)
LAT.range <- range(as.integer(seoul032823@coords[,2 ]))
seoul032823.grid <- expand.grid(LON = seq(from = LON.range[1], to = LON.range[2], by = 1500),
                                LAT = seq(from = LAT.range[1], to = LAT.range[2], by = 1500))
plot(seoul032823.grid)
points(seoul032823, pch= 16,col="red")
coordinates(seoul032823.grid)<- ~LON+LAT
gridded(seoul032823.grid)<- T
plot(seoul032823.grid)
points(seoul032823, pch= 16,col="red")

# kriging spatial prediction map
seoul032823_OK<- autoKrige(formula = PM10~1,input_data = seoul032823, new_data = seoul032823.grid )
pts.s <- list("sp.points", seoul032823, col = "red", pch = 16)
automapPlot(seoul032823_OK$krige_output, "var1.pred", asp = 1,
            sp.layout = list(pts.s), main = " Kriging Prediction")

我使用automap 包进行克里金法,ggplot2 用于绘制韩国地图。

【问题讨论】:

  • 您提供了赏金但没有奖励?哎呀。 :)
  • 真的非常抱歉。我忘了。我接受了你的回答。我应该怎么做才能给你赏金?
  • 不用担心。 SO自动奖励一半。无论如何,我希望你解决了你想要的其余外观更改。
  • 感谢您的关心。实际上,我正在尝试很多,但我还没有成功。 theme_minimal() 在许多情况下会产生一些问题。顺便说一句,祝你有美好的一天。

标签: r ggplot2 clip kriging


【解决方案1】:

我对空间分析不太熟悉,所以投影可能存在问题。

首先,根据 answer 引用 Zev Ross 的说法,ggplot2 与 data.frames 与空间对象相比效果更好。 知道了这一点,我们可以从您的克里金空间对象seoul032823_OK 中提取克里金预测。其余的相对简单。您可能必须修复经度/纬度轴标签并确保最终输出的尺寸正确。 (如果你这样做,我可以编辑/附加答案以包含这些额外的步骤。)

# Reprojection of skorea into same coordinates as sp objects
# Not sure if this is appropriate
coordinates(skorea) <- ~long+lat  #{sp} Convert to sp object
proj4string(skorea) <- "+proj=longlat +datum=WGS84" #{sp} set projection attributes
#{sp} Transform to new coordinate reference system
skorea <- spTransform(skorea, CRS("+proj=utm +north +zone=52 +datum=WGS84")) 

#Convert spatial objects into data.frames for ggplot2
myPoints <- data.frame(seoul032823)
myKorea <- data.frame(skorea)
#Extract the kriging output data into a dataframe.  This is the MAIN PART!
myKrige <- data.frame(seoul032823_OK$krige_output@coords, 
                      pred = seoul032823_OK$krige_output@data$var1.pred)   
head(myKrige, 3)  #Preview the data
#     LON     LAT     pred
#1 290853 4120600 167.8167
#2 292353 4120600 167.5182
#3 293853 4120600 167.1047

#OP's original plot code, adapted here to include kriging data as geom_tile
ggplot()+ theme_minimal() +
  geom_tile(data = myKrige, aes(x= LON, y= LAT, fill = pred)) +
  scale_fill_gradient2(name=bquote(atop("PM10", mu*g~m^-3)), 
                       high="red", mid= "plum3", low="blue", 
                       space="Lab", midpoint = median(myKrige$pred))  + 
  geom_map(data= myKorea, map= myKorea, aes(x=long,y=lat,map_id=id,group=group),
           fill=NA, colour="black") +
  geom_point(data=myPoints, aes(x=LON, y=LAT, fill=PM10), 
             shape=21, alpha=1,na.rm=T, size=3) +
  coord_cartesian(xlim= LON.range, ylim= LAT.range) +
  #scale_size(range=c(2,4))+
  labs(title= "PM10 Concentration in Seoul Area at South Korea",
       x="Longitude", y= "Latitude")+
  theme(title= element_text(hjust = 0.5,vjust = 1,face= c("bold")))

编辑: OP 要求映射到相同色标的点,而不是在 geom_point() 的美学之外定义的 fill="yellow"。从视觉上看,这并没有添加任何东西,因为这些点与克里格背景融为一体,但代码是按要求添加的。

Edit2:如果要在原来的经纬度坐标下绘图,那么需要将不同的图层转换成同一个坐标系。但是这种转换可能会导致不规则的网格不适用于geom_tileSolution 1stat_summary_2d 对不规则网格中的数据进行分箱和平均,或 Solution 2:绘制大正方形点。

#Reproject the krige data
myKrige1 <- myKrige
coordinates(myKrige1) <- ~LON+LAT 
proj4string(myKrige1) <-"+proj=utm +north +zone=52 +datum=WGS84" 
myKrige_new <- spTransform(myKrige1, CRS("+proj=longlat")) 
myKrige_new <-  data.frame(myKrige_new@coords, pred = myKrige_new@data$pred) 
LON.range.new <- range(myKrige_new$LON) 
LAT.range.new <- range(myKrige_new$LAT)

#Original seoul data have correct lat/lon data
seoul <- read.csv ("seoul032823.csv")   #Reload seoul032823 data

#Original skorea data transformed the same was as myKrige_new
skorea1 <- getData("GADM", country= "KOR", level=1)
#Convert SpatialPolygonsDataFrame to dataframe (deprecated.  see `broom`)
skorea1 <- fortify(skorea1)  
coordinates(skorea1) <- ~long+lat  #{sp} Convert to sp object
proj4string(skorea1) <- "+proj=longlat +datum=WGS84" #{sp} set projection attributes 1
#{sp} Transform to new coordinate reference system
myKorea1 <- spTransform(skorea1, CRS("+proj=longlat")) 
myKorea1 <- data.frame(myKorea1)  #Convert spatial object to data.frame for ggplot

ggplot()+ theme_minimal() +
  #SOLUTION 1:
  stat_summary_2d(data=myKrige_new, aes(x = LON, y = LAT, z = pred),
                  binwidth = c(0.02,0.02)) +
  #SOLUTION 2: Uncomment the line(s) below:
  #geom_point(data = myKrige_new, aes(x= LON, y= LAT, fill = pred),
  #           shape=22, size=8, colour=NA) + 
  scale_fill_gradient2(name=bquote(atop("PM10", mu*g~m^-3)), 
                       high="red", mid= "plum3", low="blue", 
                       space="Lab", midpoint = median(myKrige_new$pred)) + 
  geom_map(data= myKorea1, map= myKorea1, aes(x=long,y=lat,map_id=id,group=group),
           fill=NA, colour="black") +
  geom_point(data= seoul, aes(x=LON, y=LAT, fill=PM10), 
             shape=21, alpha=1,na.rm=T, size=3) +
  coord_cartesian(xlim= LON.range.new, ylim= LAT.range.new) +
  #scale_size(range=c(2,4))+
  labs(title= "PM10 Concentration in Seoul Area at South Korea",
       x="Longitude", y= "Latitude")+
  theme(title= element_text(hjust = 0.5,vjust = 1,face= c("bold")))

【讨论】:

  • Oshun,非常感谢您的回复。还存在一些问题。请按照我帖子中给出的示例地图进行操作吗? 1> 为了比较原因,我需要地图上的点与背景热图的格式相同。 2> 是否可以裁剪显示在 y 轴旁边的地图的扩展部分? 3> 传说也需要像我帖子中的示例图片! 4> 经纬度也需要按照您提到的原始格式显示。
  • 1) 在aes 中定义填充点。修改答案以显示这一点。从视觉上看,它对你的情节没有帮助。 2) 当然,编辑theme 属性。像axis.text.y = element_text(margin = margin(r = 0.3, unit = "cm")) 这样的东西应该可以工作。 3)您可以根据需要定义您的色阶。例如,请参阅scale_colour_gradientn。 4)我不使用空间数据,所以我不知道。这应该很容易,如果你弄明白了,我很乐意修改答案。
  • 感谢奥顺。我已将myKrige 数据帧的东向北转换为纬度/经度。我通过以下代码将此数据框命名为myKrige_newcoordinates(myKrige) &lt;- ~LON+LATproj4string(myKrige) &lt;-"+proj=utm +north +zone=52 +datum=WGS84"myKrige_new &lt;- spTransform(myKrige, CRS("+proj=longlat"))mykrige_new &lt;- data.frame(mykrige_latlon@coords,pred = mykrige_latlon@data$pred)LON.range.new &lt;- range(myKrige_new$LON)LAT.range.new &lt;- range(myKrige_new$LAT) 但是当我编写 ggplot 代码时geom_tile 功能无法工作!请检查一下好吗?
  • 1) 但是为什么形状不是矩形?如果我尝试binwidth = c(0.05,0.05) ,那么我会得到矩形但网格尺寸看起来更大!你可以在我的代码中看到,我为克里金插值制作了一个 1500m*1500m 的矩形网格。如果我使用带宽,这个网格大小(分辨率)会改变吗?现在我感到非常困惑! 2)我还想显示一个颜色条的符号,它看起来等于热图的长度,并清楚地显示不同颜色的值范围,如我帖子中的示例图所示。我尝试了scale_fill_gradientn,但没有成功!
  • 1) 你需要阅读stat_summary_2d。 2)你需要阅读scale_fill_
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多