调整/手动输入geom_tile的colorbar指南上的中断并替换y轴标签

时间:2013-12-10 21:46:03

标签: r ggplot2 heatmap

我正在重新审视大约一年前遇到的这个问题。我想要我的colourbar'有效地显示在对数刻度上的指南,以便在观察它时的外观是越来越深的蓝色值反映出更大的意义。

使用以下代码,我生成以下图像:

pz <- ggplot(dat.m, aes(x=variable,y=Category)) +
  geom_tile(aes(fill=value)) +
  xlab(NULL) + ylab(NULL) +
  scale_fill_gradientn(colours=c("#000066","#0000FF","#DDDDDD","white"), 
                   values=c(0,0.05,0.050000000000001,1.0),
                   breaks=c(0, 0.000001, 0.01, 0.05, 1),
                   guide = "colourbar") +
  theme_bw()+
  theme(panel.background = element_blank(),
        panel.border = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) +
  theme(legend.position="top",
        legend.text = element_text(angle=45),
        axis.text.x = element_text(angle=45)
  )

colourbar

或者,我可以将其显示为&#34;传奇&#34;而不是&#34; colourbar&#34;:

enter image description here

但我真正想要的是这样的事情:

enter image description here

我尝试添加&#39; trans =&#34; log&#34;&#39; (scale_fill_gradientn(trans =&#34; log&#34;)),但我的数据中有很多零导致问题。如果您有任何想法,将不胜感激!


以前的措辞:

我正在尝试为不同的分类制作不同样本的p值热图。我想在这个图上修改两件事:

  1. 我想调整我的geom_tile图的图例,以强调图例比例的下端,同时仍然保持渐变的全部光谱 - 类似于它是如何看起来的样子对数表。因此,基本上从1.0-0.05的白色到蓝色的过渡以及从0.05到0.00的蓝色到深蓝色的过渡将在大小上大致相等。有没有办法可以手动调整色条指南?

  2. 我想替换y轴名称,以便我可以删除我的&#34;空&#34;行标签。注意,类别在这里只是表示为字母,但在我的真实数据集中它们是长名称。我插入了#34; dummy&#34;用于将分类拆分为chucks的数据行,并将每个块中的tile排序为从最重要到最重要 - 我确信有更好的解决方案,但这是我在尝试其他想法失败后想出的我发现堆栈溢出!我尝试用scale_y_discrete标记它们,但这与前面提到的订单混杂在一起。

  3. 非常感谢您对这两个问题的帮助!

    sample_heatmap

    以下是一个示例数据集:

    dput(dat.m)
    structure(list(Category = structure(c(12L, 11L, 10L, 9L, 8L, 
    7L, 6L, 5L, 4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 
    4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 
    1L), class = "factor", .Label = c("j", "i", "empty2", "h", "empty1", 
    "g", "f", "e", "d", "c", "b", "a")), variable = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L), .Label = c("b2", "c1", "c2"), class = "factor"), 
        value = c(7.40214650772221e-06, 0.0075828339, 0.1825924627, 
        0.0384381317, 0.0440256659, 0.3659284985, 0.9777569144, 1, 
        0.0075828339, 1, 0.2193606406, 0.3659284985, 0.0004289756, 
        0.0011541045, 0.0004289756, 0.4400885491, 0.6121402215, 0.6724032426, 
        0.2735924085, 1, 0.018824582, 1, 0.4386503891, 0.4249526456, 
        1.05094571578633e-05, 0.0027216795, 0.715979827, 0.0050376405, 
        0.7473334763, 0.9053300832, 1, 1, 0.0015392848, 1, 0.039679469, 
        0.0950327519)), .Names = c("Category", "variable", "value"
    ), row.names = c(NA, -36L), class = "data.frame")
    

    这是我的代码:

    col_blue <- c("#FFFFFF","#000099","#000066","#000033")
    ggplot(dat.m, aes(x=variable,y=Category)) +
      geom_tile(aes(fill=value)) +
      xlab(NULL) + ylab(NULL) +
      scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0),guide="colorbar") +
      theme_mary(base_size=12)
    

    更新:

    所以现在我已经使用以下结果修改了代码。我越来越接近我希望实现的目标,但我想用颜色栏的比例来显示0.05-0.0的渐变更清晰。

    col_blue <- c("#FFFFFF","#000099","#000066","#000033")
    ggplot(dat.m, aes(x=variable,y=Category)) +
      geom_tile(aes(fill=value)) +
      xlab(NULL) + ylab(NULL) +
      scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) +
      scale_colour_gradientn(guide = "colourbar", limits = c(0,1),breaks=c(1,0.05,0.01,0),values=c(1,0.05,0.01,0),colours=c("#FFFFFF","#000099","#000066","#000033"))
    

    image2

2 个答案:

答案 0 :(得分:2)

我们可以告诉scale_fill_gradientn不要显示guide=FALSE的指南,然后手动添加我们自己的限制设置为c(0,0.1)(或您想要的任何范围)。

ggplot(dat.m, aes(x=variable,y=Category)) +
  geom_tile(aes(fill=value)) +
  xlab(NULL) + 
  ylab(NULL) + 
  scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) +
  scale_colour_gradientn(guide = "colorbar", limits = c(0,0.1), colours=col_blue) 

enter image description here

至于你的第二点,为什么不在绘图之前从源数据中删除“空”行?

答案 1 :(得分:0)

对于(1),只需修改用于在绘制前(或按原样)绘制空行的数据。例如:ggplot(dat.m[!grepl("^empty", dat.m$Category), ], aes(<etc>...))

对于(2),您可以专门为图例覆盖美学。这是一个例子,根据您的口味调整:+ guides(fill=guide_legend(override.aes=list(alpha=1)))

enter image description here