首页 > 解决方案 > 如何在 R 中沿 ggplot 的轴添加自定义着色器?

问题描述

我想在 R 中沿 ggplot 热图的轴创建一个附加条。例如,如果我有一个如下所示的数据框:

df <- data.frame(
  a = c(1,1,1,2,2,2,3,3,3),
  b = c(1,2,3,1,2,3,1,2,3),
  y = c(-10, 3, 5, -2, 9, 1, -5, -2, 0)
)
df[c('a', 'b')] <- Map(paste0, c('a', 'b'), df[c('a', 'b')])
df

 a  b   y 
 a1 b1 -10
 a1 b2   3
 a1 b3   5
 a2 b1  -2
 a2 b2   9
 a2 b3   1
 a3 b1  -5
 a3 b2  -2
 a3 b3   0

我创建了一个像这样的热图:

gp <- ggplot(dfTest, aes(a, b)) + 
  geom_tile(aes(fill = y)) 
gp

这产生了情节: 热图

但我想在代表其他值的轴周围添加一个彩色条,例如z

z <- c(2, 4, 1, 7, 9, 3)

其中,in 中的每个条目z将代表df... 中的每个条目,即:

a1 = 2, a2 = 4, a3 = 1 ... b1 = 7, b2 = 9, b3 = 3

例如,生成的图看起来像这个模型: 带条形图的热图

我正在考虑在此处annotate找到的示例中使用 like ...但我似乎无法让它为我工作...有什么建议吗?

标签: rggplot2

解决方案


这个解决方案并不完全存在,但可能会让你接近。

  1. 我认为您会希望ggnewscale在一个图中使用两种不同的填充比例。
  2. 获得边缘填充可能有更好的功能——我手动将它们放在那里,但 y 轴没有完全对齐。
  3. 我不确定确保两个边缘图使用相同比例的最佳方法。

一、数据:

df <- data.frame(
  a = paste0("a", c(1,1,1,2,2,2,3,3,3)),
  b = paste0("b", c(1,2,3,1,2,3,1,2,3)),
  c = c(-10, 3, 5, -2, 9, 1, -5, -2, 0)
)

z <- c(2, 4, 1, 7, 9, 3)

然后在这里我们像你一样绘制瓷砖,然后使用ggnewscale::new_scale_fill为边缘地块启动一个新的比例。

library(tidyverse)
library(ggnewscale)

ggplot(df) + 
  geom_tile(aes(a, b, fill = c)) +
  scale_fill_continuous(guide = guide_legend(order = 1)) +
  
  # everything after this will have new scale for fill
  new_scale_fill() +
  geom_tile(data = tibble(a = paste0("a", 1:3),
                          d = z[1:3]),
            aes(x = a, y = 0.5, fill = d, height = 0.1)) +
  geom_tile(data = tibble(b = paste0("b", 1:3),
                          d = z[4:6]),
            aes(x = 0.45, y = b, fill = d, width = 0.1)) +
  
  scale_fill_viridis_c(option = "D", 
                       guide = guide_legend(order = 2))

在此处输入图像描述


推荐阅读