如何使用ggplot在R中绘制图形区域之外的内容?

6

我最近提出了这个问题。然而,现在我要问一个单独的问题,因为我的新问题的范围超出了上一个问题的范围。

我正在尝试在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 我的主要问题是能否操纵新比例尺'outside'的坐标以外的绘图区域。是否有一种方法可以移动在外部的瓦片,以便我可以将它们放置在一个有意义的区域内?

1
也许可以使用现有的专用软件包?例如,ComplexHeatmaps - zx8754
我看到了这个包...我希望能在ggplot中使用它...我尝试过使用ComplexHeatmaps,但是文献很难理解,而且我也无法让它与ggplot很好地配合使用。 - Electrino
1
这是问题所在吗?假设您可以在第一个和第二个geom_tileaes()中分别设置y = 0.5-0.3 * diff(range(df $ b))x = 0.5-0.3 * diff(range(df $ a)),以使其与数据范围相匹配。 - teunbrand
那正是我正在寻找的参数。再次感谢! - Electrino
1个回答

6

当在图形区域之外绘制时,通常会有两种经典的选择:

  • 使用 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)) 

这是由reprex包(版本号为v1.0.0)于2021年2月21日创建的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接