【问题标题】:Colours across Plots / Heatmaps in RR中的绘图/热图的颜色
【发布时间】:2016-03-29 23:47:21
【问题描述】:

我在 R 中创建了许多热图,但在保持图表之间的色标一致时遇到了问题。

我发现颜色在图表中按比例缩放,有没有办法使图表中的颜色保持一致? IE。那么 0.4 和 0.5 之间的色差总是一样的吗?

代码示例:

set.seed(123)

d1 = matrix(rnorm(9, mean = 0.2, sd = 0.1), ncol = 3)
d2 = matrix(rnorm(9, mean = 0.8, sd = 0.1), ncol = 3)

mat = list(d1, d2)

for(m in mat)
  heatmap(m, Rowv = NA ,Colv = NA)

您会注意到,在示例中,第一个图的单元格 (2,3) 与第二个图中的单元格 (1,3) 相似,尽管相差约 0.8

【问题讨论】:

  • heatmap 命令(以及 R 中的其他 R 热图包)中,您可以使用 breakscol 参数。

标签: r plot colors heatmap


【解决方案1】:

如果您愿意不使用基本图形,这里有一种使用 ggplot2 的方法:

library(reshape2)
library(ggplot2)

# Set common limits for color scale
limits = range(unlist(mat))

这是两个独立图表的代码。每个图形的最后一行代码确保它们使用相同的 z 限制来设置颜色:

ggplot(melt(mat[[1]]), aes(Var1, Var2, fill=value)) +
  geom_tile() + 
  scale_fill_continuous(limits=limits)

ggplot(melt(mat[[2]]), aes(Var1, Var2, fill=value)) +
  geom_tile() + 
  scale_fill_continuous(limits=limits)

另一种选择是使用分面将两个热图绘制在一个图表中,这会自动确保两个图表具有相同的色标:

ggplot(melt(mat), aes(Var1, Var2, fill=value))   +
  geom_tile() + 
  facet_grid(. ~ L1)

我在这里使用了默认颜色,但是对于任何一种方法,您都可以将色阶设置为您想要的任何颜色。例如:

ggplot(melt(mat), aes(Var1, Var2, fill=value))   +
  geom_tile() + 
  facet_grid(. ~ L1) +
  scale_fill_gradient(low="red", high="green")

【讨论】:

    【解决方案2】:

    您可以直接使用image 函数(heatmap 使用image),尽管它需要一些额外的格式来匹配heatmap 的输出。您可以使用zlim 设置颜色范围。引用?image 页面:

    应绘制颜色的最小和最大 z 值, 默认为 z 的有限值的范围。给定的每一个 颜色将用于为该范围的等距间隔着色。这 区间的中点覆盖范围,因此值只是 超出范围将被绘制。

    # define zlim min and max for all the plots
    minz = Reduce(min, mat)
    maxz = Reduce(max, mat)
    
    for(m in mat) {
      image( m, zlim = c(minz, maxz), col = heat.colors(20))
    }
    

    为了更接近heatmap 生成的格式,您可以重用heatmap 函数中的一些代码:

    for(m in mat) {
      labCol = dim(m)[2]
      labRow = dim(m)[1]
      image(seq_len(labCol), seq_len(labRow), m, zlim = c(minz, maxz),
        col = heat.colors(20), axes = FALSE, xlab = "", ylab = "",
        xlim = 0.5 + c(0, labCol), ylim = 0.5 + c(0, labRow))
      axis(1, 1L:labCol, labels = seq_len(labCol), las = 2, line = -0.5, tick = 0)
      axis(4, 1L:labRow, labels = seq_len(labRow), las = 2, line = -0.5, tick = 0)
    }
    

    image 使用breaks 参数是另一种选择。在设置颜色断点方面,它比zlim 更灵活。引用帮助页面,breaks

    颜色的一组有限数字断点:必须有一个 断点比颜色多,并且按递增顺序排列。未分类 向量将被排序,并带有警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2012-10-23
      相关资源
      最近更新 更多