r - 如何在 AKIMA 中使用 interp2xyz 修复插值中的缺失值
问题描述
我试图在以下代表 PM 浓度的坐标处插入我不规则间隔的点集,然后生成一个代表整个区域 PM 浓度的等高线图。我使用 AKIMA 的 interp2xyz 进行插值,但请注意等高线图上的那些小三角形白点。他们是否因为无法使用平均值进行推断而丢失了值?如何修复这些以生成平滑的等高线图?
library(tidyr)
library(dplyr)
library(ggplot2)
library(akima)
site <- c(1:20)
long <- c(171.2496,171.1985,171.2010, 171.2076, 171.2236,171.2165,171.2473,171.2448,171.2416,171.2243,171.2282,171.2344,171.2153,171.2532,171.2444,171.2443,171.2562,171.2330,171.2356,171.2243)
lati <- c(-44.40450,-44.38520,-44.38010,-44.38530,-44.38750,-44.39195,-44.41436,-44.38798,-44.38934,-44.37958,-44.37836,-44.37336,-44.37909,-44.40801, -44.40472,-44.39558,-44.39919,-44.40971,-44.39577,-44.39780)
PM <- c(57,26,12,39,44,48,31,44,46,33,29,12,29,51,50,43,28,40,45,33)
fixed <- cbind(site,long,lati,PM)
### interpolate from fixed monitors
interpdf <-interp2xyz(interp(x=fixed$long, y=fixed$lati, z=fixed$PM, duplicate="mean"), data.frame=TRUE) %>%
filter(!is.na(z)) %>%
tbl_df()
ggplot(interpdf, aes(x=x,y=y,z=z, fill=z)) +
geom_contour(binwidth = 0.0005, aes(color= ..level..)) +
scale_color_distiller("PM", palette = "Spectral", limits = c(0, 70)) +
theme_bw()
解决方案
akima::interp
通过从已知位置插入未知位置的值,从不规则点创建网格。此函数将结果放在用户可以定义的网格上。在您的示例中,您没有定义网格,因此正如函数帮助所示:
默认值为在 x 范围内均匀分布的 40 个点。
你想要一个平滑的网格。这是通过多种方式完成的。在屏幕或数据中插入更高分辨率的值。
Hijmans 在这里描述了一些方法:
https://gis.stackexchange.com/a/152533/19056
或者你也可以增加interp
函数的分辨率参数。
推荐阅读
- reactjs - 与 if 函数一起使用渲染时,无法获取发送到子类组件的道具值
- sql - 我怎样才能获得同名员工的所有ID
- c++ - 如何将 boost::combine 限制为两个范围的最小值
- spring-boot-actuator - 使用 Eureka 和执行器时无法启动服务器
- python - 正则表达式:提取一个由 "" 包围的 27 长字符子字符串
- xml - XML 和 XSLT - 单独的节点包括逗号
- apache-kafka - 卡夫卡经纪人重启后卡夫卡主题不平衡
- javascript - 如何在对象 vanilla JavaScript 中将一个变量分配给另一个变量
- javascript - React 中的 Axios.delete:`Error:DELETE chrome-extension://...`
- sql-server - 如果您想在根存储过程中调用其他存储过程,仅在根存储过程中使用 SET NOCOUNT ON 是否正确