我在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不同
答案 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)
另一种选择是使用分面在单个图形中绘制两个热图,这可以自动确保两个图形在相同的颜色范围内:
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")
答案 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)
}
使用breaks
image
参数是另一种选择。在设置颜色的断点时,它允许比zlim
更灵活。从帮助页面引用,breaks
是
颜色的一组有限数字断点:必须有一个 比颜色更多的断点和增加的顺序。未分类 矢量将被排序,并带有警告。