R中Plots / Heatmaps的颜色

时间:2016-03-29 23:47:21

标签: r plot colors heatmap

我在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不同

2 个答案:

答案 0 :(得分:4)

如果您打开不使用基本图形,可以使用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)

enter image description here

另一种选择是使用分面在单个图形中绘制两个热图,这可以自动确保两个图形在相同的颜色范围内:

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

enter image description here

我在这里使用了默认颜色,但无论哪种方法,您都可以将颜色比例设置为您想要的任何颜色。例如:

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

enter image description here

答案 1 :(得分:3)

您可以直接使用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)
}

enter image description here

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

  

颜色的一组有限数字断点:必须有一个   比颜色更多的断点和增加的顺序。未分类   矢量将被排序,并带有警告。