Как я могу покрасить океанский синий на карте США?
Я хотел бы нарисовать карту США над изображением, но затем заполнить океаны.
вот моя отправная точка:
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
дает цвет синего цвета на фоне карты, который включает в себя океаны.