【问题标题】:How to fix missing values in interpolation using interp2xyz in AKIMA如何在 AKIMA 中使用 interp2xyz 修复插值中的缺失值
【发布时间】:2019-08-18 15:46:43
【问题描述】:

我正在尝试在以下代表 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()

【问题讨论】:

  • 对于表面,我建议对栅格使用绘图方法。这很好用 -> plot(raster::rasterFromXYZ(interpdf)) raster 库。
  • 换句话说,那些白点正在绘制来自 ggplot2 的伪影,我很确定。 akima 插值可能工作正常。
  • 我在尝试创建 interpdf 时遇到错误:“is.list(al) 中的错误:$ 运算符对原子向量无效”。这并不奇怪,因为在处理矩阵时 $ 是非法的。
  • 感谢@JMT2080AD 我尝试将您的代码与光栅一起使用,它可以工作,但地图不像使用 geom_contour 和 ggplot2 那样平滑。有没有其他方法可以获得更平滑的表面贴图(即不锯齿状)?

标签: r ggplot2 interpolation contour


【解决方案1】:

akima::interp 正在通过从已知位置插入未知位置的值,从不规则点创建网格。此功能将结果放在用户可以定义的网格上。在您的示例中,您没有定义网格,因此正如函数帮助所示:

默认值是在 x 范围内均匀分布的 40 个点。

您想要一个平滑的网格。这是通过多种方式完成的。在屏幕或数据中插入更高分辨率的值。

Hijmans 在这里描述了几种方法:

https://gis.stackexchange.com/a/152533/19056

或者也可以增加interp函数的解析参数。

【讨论】:

  • 我现在明白了。非常感谢@JMT2080AD 在这里的帮助。这太棒了!
  • 我也尝试使用 geom_raster ggplot,它给出了与使用 plot(raster::rasterFromXYZ(interpdf)) 类似的图形
  • ggplot() + geom_raster(data = interpdf , aes(x = x, y = y, fill = z)) + scale_fill_distiller("PM", palette="Spectral", na.value= "白色",limits = c(0, 70)) + theme_bw()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多