我目前正在使用 ggplot 绘制各种 map 图。
我检查了可以使用 Oceanmap 包在 x 轴和 y 轴上绘制以下轴线型,但是我找不到用 ggplot 实现这一点的方法。
有没有办法将以下线型应用于 ggplot 中的 x 轴和 y 轴?
最佳答案
正如评论中已经提到的,在 ggplot2 中绘制这种轴可以通过矩形或段来实现。我去了 geom_rect
s 因为它们允许 fill
和一个 color
.虽然做这样的图例是“微不足道的”,因为在我看来它只是意味着绘制一些矩形,但这并不是因为它需要一些(或很多?)数据来设置绘制矩形的数据,.. .
基本上我做
geom_rect
绘制轴的线段,geom_rect
画角,ggnewscale
为矩形添加了单独的填充比例我尽力使我的方法尽可能通用,但仍有很大的改进空间,例如在我的方法中,您必须手动设置轴的比例,即经度和纬度。
library(ggplot2)
library(ggnewscale)
library(dplyr)
nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
axis_black_white <- function(xl, xr, yb, yt, width = .05, size = .1,
x.breaks = ggplot2::waiver(), y.breaks = ggplot2::waiver()) {
if (xl > xr) { h <- xr; xr <- xl; xl <- h }
if (yb > yt) { h <- yb; yb <- yt; yt <- h }
# Top and bottom
xmin <- seq(xl, xr - 1, 1)
xmax <- seq(xl + 1, xr, 1)
df1 <- data.frame(where = "b", xmin = xmin, xmax = xmax, ymin = yb, ymax = yb - width)
df2 <- data.frame(where = "t", xmin = xmin, xmax = xmax, ymin = yt, ymax = yt + width)
dfx <- dplyr::bind_rows(df1, df2) %>%
dplyr::mutate(fill = xmin %% 2 == 0)
# Left and right
ymin <- seq(yb, yt - 1, 1)
ymax <- seq(yb + 1, yt, 1)
df1 <- data.frame(where = "l", xmin = xl, xmax = xl - width, ymin = ymin, ymax = ymax)
df2 <- data.frame(where = "r", xmin = xr, xmax = xr + width, ymin = ymin, ymax = ymax)
dfy <- dplyr::bind_rows(df1, df2) %>%
dplyr::mutate(fill = ymin %% 2 == 0)
dfxy <- bind_rows(dfx, dfy)
# Corners
dfc <- data.frame(
where = c("tl", "tr", "bl", "br"),
xmin = c(xl - width, xr, xl - width, xr),
xmax = c(xl, xr + width, xl, xr + width),
ymin = c(yb - width, yb - width, yt + width, yt + width),
ymax = c(yb, yb, yt, yt),
fill = c(TRUE, TRUE, FALSE, FALSE)
)
list(
scale_x_continuous(breaks = x.breaks, expand = c(0, 0)),
scale_y_continuous(breaks = y.breaks, expand = c(0, 0)),
ggnewscale::new_scale_fill(),
geom_rect(
data = dfxy, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = fill),
color = "black", size = size
),
geom_rect(
data = dfc, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = fill),
color = "black", size = size
),
scale_fill_manual(values = c("white", "black"), guide = "none"),
theme(axis.ticks = element_line(size = size))
)
}
ggplot(nc) +
geom_sf(aes(fill = AREA)) +
scale_fill_viridis_c(option = "plasma") +
axis_black_white(-86, -74, 33, 37, width = .1, y.breaks = seq(33, 37, 1))
关于r - 如何在 ggplot 中制作此线型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68125857/