这很冗长,但这里是如何制作边框网格。您可以重复使用此代码,而不会在不同的地图之间进行重大更改,仅更新您为纬度和经度的最小值,最大值和间隔定义的值。
require(ggplot2) require(maps) world <- map_data("world2") #get map data
首先,定义纬度和经度的最小值,最大值和网格间隔。这些数字将用于为边框网格矩形创建数据框,并在绘图中创建轴断点和限制。
min.lat <- -40 max.lat <- 40 interval.lat <- 20 min.long <- 0 max.long <- 90 interval.long <- 30
接下来,创建一个包含矩形坐标的数据框,这些矩形将形成黑/白边框网格。此代码全部编写为使用上面定义的值而不是实际数字,因此您无需更改下面的代码来创建不同区域的地图,您只需要更新上面定义的值。
#define a constant (scaled to map size) width for grid rectangles #may need to adjust number to get width you prefer grid.width <- (max.lat - min.lat)/90 is.even <- function(x) x %% 2 == 0 #function to test if number is even #dataframe of longitude rectangles rects.long <- data.frame(x_start = rep(seq(min.long, max.long - interval.long, by = interval.long), 2)) rects.long$x_end <- rects.long$x_start + interval.long rects.long$y_start <- c(rep(min.lat, nrow(rects.long)/2), rep(max.lat - grid.width, nrow(rects.long)/2)) rects.long$y_end <- c(rep(min.lat + grid.width, nrow(rects.long)/2), rep(max.lat, nrow(rects.long)/2)) rects.long$color <- if(is.even(nrow(rects.long)/2)) { #even/odd test rep(c("black", "white"), nrow(rects.long)/2) #pattern for even } else { rep(c(rep(c("black", "white"), (nrow(rects.long) - 2)/4),"black"), 2)} #odd #dataframe of latitude rectangles rects.lat <- data.frame(y_start = rep(seq(min.lat, max.lat - interval.lat, by = interval.lat), 2)) rects.lat$y_end <- rects.lat$y_start + interval.lat rects.lat$x_start <- c(rep(min.long, nrow(rects.lat)/2), rep(max.long - grid.width, nrow(rects.lat)/2)) rects.lat$x_end <- c(rep(min.long + grid.width, nrow(rects.lat)/2), rep(max.long, nrow(rects.lat)/2)) rects.lat$color <- if(is.even(nrow(rects.lat)/2)) { #even/odd test rep(c("black", "white"), nrow(rects.lat)/2) #pattern for even } else { rep(c(rep(c("black", "white"), (nrow(rects.lat) - 2)/4),"black"), 2)} #odd #combine latitude and longitude grid rects.grid <- rbind(rects.lat, rects.long)
最后,制作你的情节!
#define axis breaks to match grid axis.breaks.x <- seq(min.long, max.long, interval.long) axis.breaks.y <- seq(min.lat, max.lat, interval.lat) ggplot(data = world) + geom_polygon(aes(x = long, y = lat, group = group), color = "black", fill = "gray50") + #set limits to your previously defined limits coord_fixed(1, xlim = c(min.long, max.long), ylim = c(min.lat, max.lat), expand = FALSE) + #define breaks same as grid, duplicate axes for lat/long labels on all sides scale_y_continuous(breaks = axis.breaks.y, sec.axis = dup_axis()) + scale_x_continuous(breaks = axis.breaks.x, sec.axis = dup_axis()) + #use geom_rect() to add border grid geom_rect(data = rects.grid, inherit.aes = FALSE, aes(xmin = x_start, xmax = x_end, ymin = y_start, ymax = y_end, fill = color), color = "black") + scale_fill_manual(values = c("black", "white")) + theme_minimal() + #theme edits to make plot look like a map theme(axis.title = element_blank(), legend.position = "none")
这是一个测试,以检查此代码是否适用于不同的限制和间隔:
min.lat <- -10 max.lat <- 50 interval.lat <- 10 min.long <- 60 max.long <- 150 interval.long <- 15 #run same code as above to create grid dataframes and plot