2013-06-20 6 views
7

Mit Ihrer Hilfe in einem anderen Thread habe ich es geschafft, einige globale Karten zu plotten. Zuerst wandle ich meteorologische GRIB2-Daten in Netcdf um und zeichne dann die globalen Karten.R Daten rastern und Achsenlimits setzen

Jetzt möchte ich nur eine Teilregion der Karte plotten. Ich habe den Befehl crop ausprobiert und die Subregion der globalen NC-Datei erfolgreich extrahiert. Aber beim Plotten kann ich nicht finden, wie man Achsengrenzen kontrolliert. Es zeichnet eine Karte auf, die größer als die Datenregion ist, sodass auf beiden Seiten große weiße Flächen erscheinen.

Dies ist das Skript I Karten

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

die diesen Ausgang plotten bin mit geben.

cropped plot

Es hat eine einfache, aber ich bin ein einfacher R Benutzer. Danke im Voraus.

EDIT: Neue Ausgabe beim Hinzufügen von xlim = c (-40,40), Ylim = c (20,90) wie vorgeschlagen. Es scheint, dass es das Problem nicht behebt. Aber das Spielen mit x, y Größe der ausgegebenen PNG-Datei sieht vielversprechend aus, da ich die Größe an die Karte anpassen kann. Sicherlich muss es eine andere Lösung sein, die richtige, die ich nicht finden kann.

enter image description here

+0

Fügen Sie einfach ein 'xlim' und ein' ylim' zu 'plot' Befehle, zum Beispiel:Wenn Sie den latticeExtra::layer Ansatz bevorzugen, können Sie ein ähnliches Ergebnis mit diesem Code erreichen 'plot (...., xlim = c (-10,30), ylim = c (30, 80))' Und nette Handlung übrigens, +1 –

+0

Vielleicht werfen Sie einen Blick auf das googleVis-Paket. Nicht sicher, es wird helfen, aber es ist ziemlich ordentlich. Es enthält IntensityMap, GeoMap und Map-Funktionen, die vielleicht helfen könnten. –

+0

Hallo @ SimonO101 Das war mein erster Versuch, bevor ich mir die Ernte anschaue, nicht sicher, ob ich beides ausprobiert habe. Jetzt nicht bei der Arbeit, wird es versuchen. Vielen Dank. – pacomet

Antwort

9

Nach der Datendatei herunterzuladen, kann ich direkt mit Raster lesen. Ich wähle Band 221, dass (wenn ich mich nicht irre), ist es, was Sie Bedarf nach 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 

Sie nicht den ganzen Umfang benötigen, so dass Sie crop verwenden, um die gewünschten Umfang zu erhalten:

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

ich habe versucht, mit plot ohne Erfolg der tt Raster angezeigt werden soll. Allerdings funktioniert es richtig mit spplot, wenn Sie ein unterschiedlichen Ausmaß (89,5 statt 90) verwenden:

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

spplot(tt) 

Jetzt müssen wir die administrativen Grenzen hinzu:

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

und die Palette ändern:

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

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

Gracias @ oscar-perpinan Ihr Vorschlag funktioniert gut. Ich werde nach zusätzlichen spplot-Optionen für die Achse, Titel usw. suchen ... Danke – pacomet

+0

Ich werde immer noch nach einer Lösung mit Plot suchen. – pacomet