Saya memiliki file NetCDF dari permukaan probabilitas. Ini adalah kisi 30x30 dengan interval lintang/bujur 0,25 derajat dengan permukaan probabilitas yang dijelaskan dalam dimensi z. Saya dapat dengan mudah mengimpor ini ke Panoply, penampil NetCDF:

Raw Grid Data

Dan kemudian sangat mudah (memeriksa satu kotak) untuk menginterpolasi/memperhalus data mentah ke ukuran kisi yang lebih halus:

Interpolated Grid Data

Namun, saya tidak hanya ingin memvisualisasikan data, saya ingin memplotnya dalam R bersama dengan batimetri dan data titik. Itu semua tidak masalah, tetapi saya belum menemukan cara langsung untuk menginterpolasi data grid di R. Berikut kode yang saya gunakan untuk mengimpor dan memplot data:

library(RNetCDF)

nc <- open.nc("132235-1.nc")
print.nc(nc)
tmp <- read.nc(nc)
probs<-tmp$likelihoods

xran <- range(tmp$longitude)
yran <- range(tmp$latitude)
zran <- range(probs,na.rm=T)
lon <- tmp$longitude
lat <- tmp$latitude[30:1]

z <- array(probs, dim=dim(probs))

z <- z[,rev(seq(ncol(z)))]
z <- z[,seq(ncol(z))]



prob.pal<-colorRampPalette(
  c("#C1FFC1","#8FBC8F","#2F4F4F")
)

zbreaks <- seq(0.0001, 0.063, by=0.001)

cols<- c(prob.pal(length(zbreaks)-1))

png("ProbTest.png", width=7.5, height=6, units="in", res=200)
layout(matrix(1:2, 1,2), widths=c(6,1.5), heights=c(6))

par(mar=c(2,2,1,1), ps=10)
image(lon, lat, z=z, col=cols, breaks=zbreaks, useRaster=TRUE, ylim=c(13,28), xlim=c(-115,-100))

dev.off()

Dan saya berakhir dengan ini, yang sama dengan menggunakan Panoply tetapi dengan skema warna yang berbeda:

R-plotted Prob Surface

Apakah ada cara langsung untuk menginterpolasi/memuluskan data ini? Saya tahu cara membuat kepadatan pemanfaatan kernel, dll., menggunakan data titik, tetapi tidak menggunakan data grid.

Banyak terima kasih atas bantuan Anda!

2
stewart6 29 Mei 2015, 21:48
Saya akan menggunakan paket raster untuk pertama kali membaca di file NetCDF menggunakan raster() atau brick() dan kemudian menghaluskan data ke resolusi skala yang lebih baik menggunakan resample().
 – 
Josh O'Brien
29 Mei 2015, 22:31

1 menjawab

Jawaban Terbaik

Ini adalah solusi yang saya pikir Anda cari, yang menggunakan resampling bilinear. Namun ini bukan satu-satunya cara untuk melakukan interpolasi seperti itu dan Anda mungkin perlu membenarkan untuk tidak menggunakan pendekatan yang lebih canggih (misalnya geostatistik, splines, dll.):

library(raster)
set.seed(2002)

##  Create an extent boundary:
ex <- extent(c(0, 20, 0, 20))

##  Simulate a coarse raster:
r.small <- raster(ex, vals=rnorm(10*10, mean=5, sd=1), nrow=10, ncol=10)

##  Simulate the grid of a finer-scale raster:
r.big <- raster(ncol=200, nrow=200, ext=ex)

##  Resample the coarser raster to match finer grid:
r.res <- resample(x=r.small, y=r.big, method="bilinear")

plot(r.small)
plot(r.res)

Kasar:

Coarse

Bagus:

Fine

4
Forrest R. Stevens 29 Mei 2015, 22:57
Hai Forrest—ini pasti berhasil, dan memecahkan banyak masalah lain yang saya alami, karena saya tidak menyadari raster dapat membaca file NetCDF. Terima kasih banyak atas solusinya!
 – 
stewart6
1 Juni 2015, 02:11
Terima kasih, tetapi saya harus mengucapkan terima kasih kepada Robert Hijmans dan kontributor lainnya untuk paket raster karena kerja keras mereka membuat hal semacam ini menjadi sangat mudah di R.
 – 
Forrest R. Stevens
1 Juni 2015, 02:16