R-ggplot2 geom_tile创建不同的图形到热图的方式

时间:2019-04-28 18:28:06

标签: r ggplot2 plot heatmap

我想为一些数据集绘制热图。 最初,我使用热图函数来获得令人满意的结果。但是,由于我所有其他图形都使用ggplot2完成,因此我也尝试使用ggplot2完成此操作。但是,我得到了奇怪的图表,我不确定是什么原因。

我得到的数据集如下:

 > dput(B)
 structure(list(`2001` = c(510, 15, 14, 9, 8, 11, 7, 5, -1, -3),
 `2002` = c(397, -13, 5, 6, 12, -1, 0, 2, 5, 3), 
 `2003` = c(323, -6, -2, 1, 0, 6, -5, -2, 1, 4), 
 `2004` = c(133, -2, 2, -4, 0, 5, 8, -2, 0, 1), 
 `2005` = c(-100, -8, -6, -2, 1, 2, 2, 3, -6, -5), 
 `2006` = c(-114, -7, 2, -4, -2, 0, 1, 2, 4, -3), 
 `2007` = c(-130,-13, 0, 4, -3, -2, -1, 1, 2, 4), 
 `2008` = c(-38, -10, 4, 0, 3, 4, 2, 0, 0, 1), 
 `2009` = c(-194, -13, -5, -4, -3, -1, 0, 1, 1, 1), 
 `2010` = c(-202, -6, 0, -1, -5, -2, -3, -1, 2, -2)), 
 row.names = 0:9, class = "data.frame")

现在使用,

> heatmap(as.matrix(B), Colv = NA, Rowv = NA, col = cm.colors(10))

我获得了下面的热图,看起来很合理。

enter image description here

另一方面,使用

C <- B
C$size <- row.names(C)
C <- melt(C, variable.name="year",id=c("size"))
ggplot(data = C) +                  
   geom_tile(aes(x = year, y = size, fill = value)) +
   scale_fill_gradientn(colors=cm.colors(10))

我得到以下内容

enter image description here

这是为什么?怎样纠正这个问题,使我得到与第一个相似的图?

2 个答案:

答案 0 :(得分:2)

缩放比例在热图中应用。因此,您需要扩展数据(在这种情况下,根据size来重现类似的内容,例如:

C2 <- C %>% group_by(size) %>% mutate(rescale = scale(value))

ggplot(data = C2) +                  
  geom_tile(aes(x = year, y = size, fill = rescale)) +
  scale_fill_gradientn(colors=cm.colors(10))

Heatmap using ggplot2 with scaling

还有其他选项,具体取决于您要显示的内容。例如,查看limits中的valuesscale_fill_gradientn

答案 1 :(得分:0)

问题是size = 0的数字比其他条目大得多。因此第二个热图是正确的,因为相对于给定比例,其余值非常接近零。我要说第二个实际上是正确的,因为您可以看到size = 0之外的数字大致相同,尤其是对于第一行中的大数字而言。我不确定热图的工作原理,也无法提供比例,但是我认为第二张图在第一行之外具有较低的可变性是合理的。