2013-05-02 5 views
11

Chciałbym narysować mapę USA nad obrazem, a następnie wypełnić oceany.Jak mogę pokolorować błękit oceanu na mapie USA?

tutaj jest mój punkt wyjścia:

library(maps) 
library(graphics) 
image(x=-90:-75, y = 25:40, z = outer(1:15, 1:15, "+"), 
     xlab = "lon", ylab = "lat") 
map("state", add = TRUE) 

enter image description here

Ale chciałbym Atlantyku i Zatoki Meksykańskiej być wypełnione kolorem.

+1

Najprawdopodobniej łatwiej byłoby rozpocząć od niebieskiego tła, a następnie maskować granice stanu nad obrazem/mapą cieplną. –

+1

Albo oddzielny wielokąt dla oceanu (myślę, że 'rgeos' ma funkcję różnicowania, jeśli nie masz jeszcze takiego wielokąta). –

Odpowiedz

19

Dobre pytanie! Jak to się dzieje? screen grab

library(maps) 
image(x=-90:-75, y = 25:40, z = outer(1:15, 1:15, "+"), 
     xlab = "lon", ylab = "lat") 
map("state", add = TRUE) 

library(grid) 
outline <- map("usa", plot=FALSE) # returns a list of x/y coords 
xrange <- range(outline$x, na.rm=TRUE) # get bounding box 
yrange <- range(outline$y, na.rm=TRUE) 
xbox <- xrange + c(-2, 2) 
ybox <- yrange + c(-2, 2) 
# create the grid path in the current device 
polypath(c(outline$x, NA, c(xbox, rev(xbox))), 
     c(outline$y, NA, rep(ybox, each=2)), 
     col="light blue", rule="evenodd") 

natrafiłem na rozwiązanie tego problemu po przeczytaniu Paul Murrell'S (człowiek za grid) Najnowsze R-Journal artykuł na temat ścieżek sieciowych (pdf here).

Pamiętaj:

"To nie to, co Draw, To czego nie Remis" -Paul Murrell

+0

+ 1 fajne rozwiązanie. –

+0

+1 za udzielenie pełnego uznania Twoim źródłom. –

4

Oto wariant (R Journal Vol 4/2). rozwiązanie, które wykonuje pracę poprzez przecinanie/różnicowanie wielokątów. Zestaw danych wrld_simpl może zostać zastąpiony przez dowolny inny obiekt SpatialPolygons *.

library(maptools) 
library(raster) 
library(rgeos) 

data(wrld_simpl) 

x <- list(x=-90:-75, y = 25:40, z = outer(1:15, 1:15, "+")) 

## use raster to quickly generate the polymask 
## (but also use image2Grid to handle corner coordinates) 
r <- raster(image2Grid(x)) 
p <- as(extent(r), "SpatialPolygons") 

wmap <- gIntersection(wrld_simpl, p) 
oceanmap <- gDifference(p, wmap) 

image(r) 
plot(oceanmap, add = TRUE, col = "light blue") 

oceanmap by poly intersection/differencing

(Konwersja danych mapy do tego może być trudne, nie mogłem zrobić to z łatwością maptools::map2SpatialPolygons, zajęłoby trochę obejście)

3

mogę odebrać tytuł pytaniem ("Jak mogę pokolorować błękit oceanu na mapie USA?"), Ale nie w konkretnej sytuacji opisanej w treści pytania ("Chciałbym narysować mapę USA na obrazku , ale potem wypełnij oceany ").

Zamieszczam jednak tę odpowiedź na wypadek, gdyby była przydatna dla innych osób, które zadają ci pytanie.

map(database='state', bg='light blue') 

Opcja bg daje koloru jasnoniebieskiego do mapy w tle, która obejmuje oceany.