r - 如何在 R 中使用 ggplot 绘制绘图区域的 'outside'?

标签 r ggplot2

我最近问 this题。但是,我现在提出一个单独的问题,因为我的新问题的范围超出了最后一个问题的范围。
我试图在 ggplot 中创建一个热图……但是,在轴之外我试图绘制 geom_tile .问题是我找不到一致的方法来让它工作。例如,我用来绘制的代码是:

library(colorspace)
library(ggplot2)
library(ggnewscale)
library(tidyverse)

asd <- expand_grid(paste0("a", 1:9), paste0("b", 1:9))

df <- data.frame(
  a = asd$`paste0("a", 1:9)`,
  b = asd$`paste0("b", 1:9)`,
  c = sample(20, 81, replace = T)
)


# From discrete to continuous
df$a <- match(df$a, sort(unique(df$a)))
df$b <- match(df$b, sort(unique(df$b)))
z <- sample(10, 18, T)


# set color palettes
pal <- rev(diverging_hcl(palette = "Blue-Red", n = 11))
palEdge <- rev(sequential_hcl(palette = "Plasma", n = 11))

# plot
ggplot(df, aes(a, b)) +
  geom_tile(aes(fill = c)) +
  scale_fill_gradientn(
    colors = pal,
    guide = guide_colorbar(
      frame.colour = "black",
      ticks.colour = "black"
    ),
    name = "C"
  ) +
  theme_classic() +
  labs(x = "A axis", y = "B axis") +
  new_scale_fill() +
  geom_tile(data = tibble(a = 1:9, 
                          z = z[1:9]),
            aes(x = a, y = 0, fill = z, height = 0.3)) +
  geom_tile(data = tibble(b = 1:9, 
                          z = z[10:18]),
            aes(x = 0, y = b, fill = z, width = 0.3))  +
  scale_fill_gradientn(
    colors = palEdge,
    guide = guide_colorbar(
      frame.colour = "black",
      ticks.colour = "black"
    ),
    name = "Z"
  )+
  coord_cartesian(clip = "off", xlim = c(0.5, NA), ylim = c(0.5, NA)) +
  theme(aspect.ratio = 1,
        plot.margin = margin(10, 15.5, 25, 25, "pt")
  )
这会产生如下内容:
heatmap
但是,我试图找到一种一致的方式来绘制更像这样的东西(我很快在 photoshop 中制作了它):
heatmap with tiles outside
我遇到的主要问题是能够操纵绘图区域“外部”新比例尺的坐标。有没有办法移动外面的瓷砖,以便我可以将它们放置在有意义的区域?

最佳答案

在绘图区域外绘图时总是有两个经典选项:

  • 使用 coord_...(clip = "off") 注释/绘图
  • 制作不同的图并将它们组合起来。

  • 在我看来,后一种选择通常会提供更大的灵活性和更少的麻烦。
    library(colorspace)
    library(tidyverse)
    library(patchwork)
    
    asd <- expand_grid(paste0("a", 1:9), paste0("b", 1:9))
    
    df <- data.frame(
      a = asd$`paste0("a", 1:9)`,
      b = asd$`paste0("b", 1:9)`,
      c = sample(20, 81, replace = T)
    )
    
    
    # From discrete to continuous
    df$a <- match(df$a, sort(unique(df$a)))
    df$b <- match(df$b, sort(unique(df$b)))
    z <- sample(10, 18, T)
    
    
    # set color palettes
    pal <- rev(diverging_hcl(palette = "Blue-Red", n = 11))
    palEdge <- rev(sequential_hcl(palette = "Plasma", n = 11))
    
    # plot
    p_main <- ggplot(df, aes(a, b)) +
      geom_tile(aes(fill = c)) +
      scale_fill_gradientn("C",colors = pal,
        guide = guide_colorbar(frame.colour = "black",
          ticks.colour = "black")) +
      theme_classic() +
      labs(x = "A axis", y = "B axis") 
    p_bottom <- ggplot() +
      geom_tile(data = tibble(a = 1:9, z = z[1:9]),
                aes(x = a, y = 0, fill = z, height = 0.3)) +
      theme_void() +
      scale_fill_gradientn("Z",limits = c(0,10),
                           colors = palEdge,
                           guide = guide_colorbar( 
                             frame.colour = "black", ticks.colour = "black"))
    p_left <- ggplot() +
      theme_void()+
      geom_tile(data = tibble(b = 1:9, z = z[10:18]),
                aes(x = 0, y = b, fill = z, width = 0.3))  +
      scale_fill_gradientn("Z",limits = c(0,10),
        colors = palEdge,
        guide = guide_colorbar( frame.colour = "black", ticks.colour = "black"))
    
    p_left + p_main +plot_spacer()+ p_bottom +
      plot_layout(guides = "collect",
                  heights = c(1, .1),
                  widths = c(.1, 1)) 
    

    创建于 2021-02-21 由 reprex package (v1.0.0)

    关于r - 如何在 R 中使用 ggplot 绘制绘图区域的 'outside'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66307022/

    相关文章:

    r - 如何在晚上暂停taskscheduleR

    r - 在R中应用,如何使用?

    r - 如何获得 "nls"对象的漂亮 latex 输出

    R ggplot : How to align points with dodged bars?

    r - 使用 ggplot 绘制聚合数据

    r - 对相似因素进行分组 - 填充 ggplot2

    r - 如何完全删除面条之间的空格(以连接 geom_rect 'background' )?

    r - 制作ggplot线图,其中线遵循行顺序

    r - 使用 `glue` 将一列中的变量替换为另一列中的变量

    r - 计算跨数据集子集的汇总统计量 [R 中 Stata 的 "bysort"的等价物是什么?]