Как я могу покрасить океанский синий на карте США?

Я хотел бы нарисовать карту США над изображением, но затем заполнить океаны.

вот моя отправная точка:

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

Но я хотел бы, чтобы Атлантический океан и Мексиканский залив были заполнены сплошным цветом.

Ответ 1

Хороший вопрос! Как это? 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")

Я столкнулся с решением этой проблемы после прочтения Пола Мэррелла (человека за grid) недавней статьи R-Journal о сетчатых дорожках (pdf здесь ).

Помните:

"Его не то, что вы рисуете, его то, что вы не рисуете" - Паул Меррелл (R Journal Vol. 4/2)

Ответ 2

Здесь вариант на решении, выполняющий работу путем пересечения/разностных многоугольников. Набор данных wrld_simpl может быть заменен любым другим объектом 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

(Преобразование данных карт в это может быть жестким, я не мог сделать это легко с помощью maptools::map2SpatialPolygons, для этого потребуется некоторое обходное решение)

Ответ 3

Я могу ответить на название вашего вопроса ( "Как я могу покрасить океанский синий на карте США?" ), хотя и не такая конкретная ситуация, как это описано в теле вашего вопроса ( "Я бы хотел нарисовать карту США над изображением, но затем заполнить океаны" ).

Однако я включаю этот ответ в случае, если он полезен другим, которые сталкиваются с вашим вопросом.

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

Параметр bg дает цвет синего цвета на фоне карты, который включает в себя океаны.