2013-06-20 39 views
7

Với sự trợ giúp của bạn trong một chuỗi khác, tôi đã quản lý để vẽ một số bản đồ toàn cầu. Đầu tiên tôi chuyển đổi dữ liệu GRIB2 khí tượng thành Netcdf và sau đó vẽ bản đồ toàn cầu.R dữ liệu cắt xén và đặt giới hạn trục

Bây giờ tôi muốn vẽ sơ đồ chỉ là một tiểu vùng của bản đồ. Tôi đã thử lệnh cây trồng và thành công trích xuất các tiểu vùng của tập tin nc toàn cầu. Nhưng khi vẽ đồ tôi không thể tìm cách kiểm soát giới hạn trục. Nó vẽ một bản đồ lớn hơn vùng dữ liệu để các khoảng trắng lớn xuất hiện ở cả hai phía.

Đây là kịch bản tôi đang sử dụng để vẽ bản đồ

library("ncdf") 
library("raster") 
library("maptools") 

DIA=format(Sys.time(), "%Y%m%d00") # Data d'avui 
url=sprintf("ftp://ftp.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.%s/gfs.t00z.pgrb2f00", DIA) # Ruta del ftp 
loc=file.path(sprintf("%s",url)) 
download.file(loc,"gfs.grb",mode="wb") 

system("/usr/bin/grib2/wgrib2/wgrib2 -s gfs.grb | grep :TMP: | /usr/bin/grib2/wgrib2/wgrib2 -i gfs.grb -netcdf temp.nc",intern=T) 

t2m <- raster("temp.nc", varname = "TMP_2maboveground") 
rt2m <- rotate(t2m) 
t2mc=rt2m-273.15 

DAY=format(Sys.time(), "%Y%m%d") # Data d'avui 

e=extent(-40,40,20,90) 
tt=crop(t2mc,e) 

png(filename="gfs.png",width=700,height=600,bg="white")  
    rgb.palette <- colorRampPalette(c("snow1","snow2","snow3","seagreen","orange","firebrick"), space = "rgb")#colors 
    plot(tt,col=rgb.palette(200),main=as.expression(paste("Temperatura a 2m ",DAY," + 00 UTC",sep="")),axes=T) 
dev.off() 

mà cung cấp cho sản lượng này.

cropped plot

Nó có phải là một trong những đơn giản nhưng tôi là một người dùng R đơn giản. Cảm ơn trước.

EDIT: Đầu ra mới khi thêm xlim = c (-40,40), ylim = c (20,90) như được đề xuất. Có vẻ như nó không khắc phục được sự cố. Nhưng chơi với x, y kích thước của tập tin png đầu ra trông đầy hứa hẹn như tôi có thể điều chỉnh kích thước để phù hợp với bản đồ. Chắc chắn nó phải là một giải pháp, một trong những quyền tôi không thể tìm thấy.

enter image description here

+0

Chỉ cần thêm một 'xlim' và một' ylim' cho 'lệnh plot' của bạn, ví dụ 'cốt truyện (...., xlim = c (-10,30), ylim = c (30, 80))' Và âm mưu tốt đẹp bằng cách này, +1 –

+0

Có thể hãy xem gói googleVis. Không chắc chắn nó sẽ giúp đỡ, nhưng nó là khá gọn gàng. Nó chứa các hàm IntensityMap, GeoMap và Map có lẽ có thể giúp ích. –

+0

Hi @ SimonO101 Đó là nỗ lực đầu tiên của tôi trước khi nhìn vào vụ mùa, không chắc chắn nếu đã thử cả hai. Không phải tại nơi làm việc bây giờ, sẽ cung cấp cho một thử. Cảm ơn nhiều. – pacomet

Trả lời

9

Sau khi tải về các tập tin dữ liệu, tôi có thể đọc trực tiếp với raster. Tôi chọn băng tần 221 đó (nếu tôi không sai) nó là những gì bạn cần theo this table:

library("raster") 
t2mc <- raster('gfs.grb', band=221) 

> t2mc 
class  : RasterLayer 
band  : 221 (of 315 bands) 
dimensions : 361, 720, 259920 (nrow, ncol, ncell) 
resolution : 0.5, 0.5 (x, y) 
extent  : -0.25, 359.75, -90.25, 90.25 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +a=6371229 +b=6371229 +no_defs 
data source : /home/oscar/gfs.grb 
names  : gfs 

Bạn không cần toàn bộ mức độ để bạn sử dụng crop để có được mức độ mong muốn:

e <- extent(-40,40,20,90) 
tt <- crop(t2mc,e) 

tôi đã cố gắng để hiển thị raster tt với plot mà không thành công. Tuy nhiên, nó hoạt động một cách chính xác với spplot nếu bạn sử dụng ở mức độ khác nhau (89,5 thay vì 90):

e <- extent(-40,40,20,89.5) 
tt <- crop(t2mc,e) 

spplot(tt) 

Bây giờ chúng ta phải thêm địa giới hành chính:

library(maps) 
library(mapdata) 
library(maptools) 

ext <- as.vector(e) 
boundaries <- map('worldHires', 
        xlim=ext[1:2], ylim=ext[3:4], 
        plot=FALSE) 
boundaries <- map2SpatialLines(boundaries, 
           proj4string=CRS(projection(tt))) 

và thay đổi bảng màu:

rgb.palette <- colorRampPalette(c("snow1","snow2","snow3","seagreen","orange","firebrick"), 
           space = "rgb") 

spplot(tt, col.regions=rgb.palette, 
     colorkey=list(height=0.3), 
     sp.layout=list('sp.lines', boundaries, lwd=0.5)) 

spplot result

Nếu bạn thích cách tiếp cận latticeExtra::layer, bạn có thể đạt một kết quả tương tự với mã này:

library(rasterVis) 
levelplot(tt, col.regions=rgb.palette, 
      colorkey=list(height=.3)) + 
    layer(sp.lines(boundaries, lwd=0.5)) 
+0

Gracias @ oscar-perpinan Đề xuất của bạn hoạt động tốt. Tôi sẽ tìm kiếm các tùy chọn spplot bổ sung cho trục, tiêu đề và vân vân ... Cảm ơn – pacomet

+0

Tôi vẫn sẽ tìm giải pháp có cốt truyện. – pacomet

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