r - 如何在 ggplot 中制作此线型?

标签 r ggplot2

enter image description here
我目前正在使用 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/

    相关文章:

    r - ggplot2中的上标和下标轴标签

    r - 在 ggplot 中绘制的数据到 highcharter

    r - 使用 `duplicated` 函数通过 key 识别 `data.table` 中的重复行

    R:加载 ggraph 时 ggplot2 出错

    r - 按 (x,y) 对数据进行分类并汇总

    r - 如何从 R 中的函数填充数据框?

    r - 在来自不同组的两个点之间画一条线,同时跟踪这些点

    R 包 ggpmisc : Putting hat on y in Regression Equation

    r - 绘制带孔的 "donut"多边形

    引用带有 bookdown 的数字