2016-05-25 18 views
11

Tôi có mảng dữ liệu 2 chiều, với một số giá trị bị thiếu. Có ba cột:Nội suy hai chiều trong R, không có bất kỳ phép ngoại suy

  • x
  • y
  • cường

tôi có thể vẽ x chống lại y trong ggplot2, với cường độ như một thang màu.

enter image description here

Tôi muốn mịn chuyển giữa các màu sắc, và đã đi qua các idw chức năng, thuộc về gói gstat. idw nhằm mục đích nội suy NA trong 2-dimenstions. Nó không nên ngoại suy, và trong khi nó về mặt kỹ thuật không tôn trọng các giới hạn của dữ liệu (± 20 theo cả hai hướng), nó cũng cố gắng lấp đầy khoảng trống ở rìa của cốt truyện, như hình dưới đây:

enter image description here

Tôi muốn tránh bất kỳ ngoại suy nào xảy ra ngoài giới hạn của dữ liệu tôi có, bao gồm góc dưới bên phải của dữ liệu được hiển thị trong hình đầu tiên.

Làm cách nào để đạt được điều này?

Chỉnh sửa: Đây là tập dữ liệu mẫu. Đây không phải chính xác cùng một tập dữ liệu như được hiển thị ở trên, nhưng lại chứa một vùng bị thiếu lớn ở góc dưới bên phải.

structure(list(x = c(10L, 15L, -10L, 0L, -5L, -10L, -15L, 0L, 
-15L, 15L, 5L, 10L, -20L, -5L, -15L, -15L, -5L, 5L, 20L, -20L, 
-15L, 20L, -15L, 5L, -5L, -20L, -5L, 15L, 0L, 0L, 15L, 10L, 0L, 
20L, -10L, 5L, 5L, 0L, 20L, 5L, -15L, 5L, -5L, -5L, -15L, -10L, 
-10L, -10L, -5L, -10L, 15L, 20L, 0L, 20L, -15L, 20L, -20L, -15L, 
10L, 15L, 15L, -5L, 5L, 15L, 20L, 20L, -10L, -20L, -20L, 15L, 
-10L, 10L, 5L, -20L, 20L, 10L, 0L, 10L, -10L, 0L, 10L, 10L, 10L, 
-20L, 15L, -20L, 0L, -20L, -5L, 5L), y = c(0L, -10L, 0L, 20L, 
0L, -10L, 0L, 0L, -20L, 20L, 0L, -10L, -10L, -10L, -10L, 20L, 
10L, -10L, -20L, -20L, -10L, -10L, 0L, 10L, -20L, 20L, 0L, 0L, 
0L, -20L, 0L, 0L, 10L, 10L, -20L, -20L, -10L, 20L, 10L, 20L, 
10L, -20L, 20L, -10L, 20L, 20L, 10L, 10L, -20L, -10L, -10L, 20L, 
-10L, -10L, -20L, 0L, -10L, 10L, -10L, 10L, -20L, 10L, 20L, 20L, 
-20L, 20L, 0L, 10L, 10L, -20L, 20L, -20L, 10L, 0L, 0L, 10L, 10L, 
-20L, -20L, -20L, 20L, 20L, 10L, 20L, 10L, -20L, -10L, 0L, 20L, 
0L), intensity = c(12.9662, NA, 24.4379, 26.3923, 26.9449, 16.7372, 
13.7691, 8.029, 11.922, 11.1967, 15.2792, NA, 14.4159, 20.6542, 
22.0509, 17.356, 14.3841, NA, NA, 10.326, 6.0451, NA, 12.9515, 
3.6745, NA, 18.1552, 9.9532, 9.9361, 7.0392, NA, 10.9814, 10.8351, 
4.9017, 5.7864, 14.098, NA, NA, 6.3305, 6.4405, 49.2791, 19.9774, 
NA, 25.1955, 28.5234, 20.2077, 20.3224, 12.688, 22.1371, NA, 
17.5108, NA, 7.9351, NA, NA, 11.0975, 8.2349, 12.1194, 21.865, 
NA, 10.7178, NA, 21.8222, 13.5971, 6.9751, NA, 8.8046, 22.0709, 
14.2043, 27.8561, NA, 17.4329, NA, 7.4057, 15.2797, 1.0122, 11.1874, 
35.5814, NA, 27.5919, NA, 11.8159, 15.8433, 12.297, 29.1978, 
20.4151, 22.6336, NA, 16.0019, 16.9746, 10.8613)), .Names = c("x", 
"y", "intensity"), row.names = c(NA, -90L), class = "data.frame") 
+0

Bạn chỉ có thể Resample dữ liệu gốc với kích thước lưới bạn muốn, để lại NA mà bạn không có dữ liệu. Sau đó, sử dụng dữ liệu được lấy mẫu đó để che dấu đầu ra IDW của bạn. –

+0

Tôi thấy nó tò mò rằng bạn tìm thấy một điểm cường độ cao trong khu vực ngoại suy của bạn (khoảng 5, -20). Theo như tôi hiểu idw, điều này không nên xảy ra. –

Trả lời

6

Nếu tôi hiểu những gì bạn đang cố gắng làm, bạn có thể thực hiện điều này bằng phương pháp cơ bản trong ggplot2 bằng cách xóa NA trước khi nội suy.

library(ggplot2) 

data<-data.frame(data) 
data_NA.rm<-data[!is.na(data$intensity),] 

ggplot(data=data_NA.rm,aes(x=x,y=y))+ 
     geom_raster(aes(fill=intensity),interpolate=TRUE) 

Kết quả trong:

enter image description here

Các vấn đề liên quan