Как исправить пропущенные значения при интерполяции с использованием interp2xyz в AKIMA

#r #ggplot2 #interpolation #contour

#r #ggplot2 #интерполяция #контур

Вопрос:

Я пытаюсь интерполировать мой неравномерно расположенный набор точек по следующим координатам, которые представляют концентрации ТЧ, а затем создать контурную карту, которая представляет концентрацию ТЧ по всей области. Я использовал interp2xyz из AKIMA для интерполяции, но заметил эти маленькие треугольные белые пятна на контурной карте. Они пропускают значения из-за невозможности экстраполировать с использованием средних значений? Как мне исправить это, чтобы создать гладкую контурную карту?

 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()
  

PMcontour_map

Комментарии:

1. Для поверхностей я рекомендую использовать метод plot для растров. Это прекрасно работает -> plot(raster::rasterFromXYZ(interpdf)) < — Возможно, вам потребуется сначала установить raster библиотеку.

2. Другими словами, я почти уверен, что эти белые пятна отображают артефакты из ggplot2. Интерполяция akima, вероятно, работает нормально.

3. Я получаю сообщение об ошибке при попытке создания interpdf: «Ошибка в is.list (al): оператор $ недопустим для атомарных векторов». Неудивительно, поскольку $ является незаконным при работе с матрицами.

4. Спасибо @JMT2080AD Я пытался использовать ваш код с растром, и это работает, но карта не такая гладкая, как при использовании geom_contour и ggplot2. Есть ли другой способ получить более гладкую карту поверхности (т. Е. не зазубренный)?

Ответ №1:

akima::interp создает сетку из неправильных точек путем интерполяции значений для неизвестных местоположений из известных местоположений. Эта функция помещает результаты в сетку, которую может определить пользователь. В вашем примере вы не определяете сетку таким образом, как указано в справке функции:

По умолчанию используется 40 точек, равномерно расположенных в диапазоне x.

Вы хотели бы получить гладкую сетку. Это делается несколькими способами. Интерполируйте значения с более высоким разрешением на экране или в данных.

Хиджманс описывает здесь несколько методов:

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

Или вы также можете увеличить параметры разрешения interp функции.

Комментарии:

1. Теперь я понял. Большое спасибо @JMT2080AD за вашу помощь здесь. Это потрясающе!

2. Я также пробую ggplot с geom_raster, и он выдает график, аналогичный графику с использованием plot (raster::rasterFromXYZ(interpdf))

3. ggplot() geom_raster(данные = interpdf, aes(x = x, y = y, fill = z)) scale_fill_distiller(«PM», палитра = «Спектральная», na.значение =»белый»,пределы = c(0, 70)) theme_bw()