如何在heatmap.2(gplots)中个性化行的顺序?

时间:2016-01-14 16:53:40

标签: r plot data-visualization heatmap

我有兴趣使用heatmap.2可视化我的结果变量的分布,如gplots包中提供的那样。

这就是我的数据集的样子:

> head(data.w)
year Armenia Azerbaijan Bulgaria Croatia Cyprus Czech Republic Estonia Georgia 
1998       0          0     1.14       0   1.21           1.32    1.43       0    
1999       0          0     1.32       0   1.44           1.50    1.68       0  
2000       0          0     1.32       0   1.63           1.59    1.75       0  
2001       0.75       0     1.46       0   1.85           1.93    1.81       0  
2002       0.82       0     1.74       0   2.04           2.00    2.00       0.34  
2003       0.87       0     1.85       0   2.22           2.22    2.19       0.42

要绘制热图,我使用以下代码

library(gplots) 
library(grDevices)

min(data.w[,2:9]) 
max(data.w[,2:9]) 
data.wx <-as.matrix(data.w)

pdf("heatmap.pdf", width=10,height=5)
heatmap.2(as.matrix(t(data.w[,2:9])), trace="none", 
          Rowv=NULL, Colv=NULL, dendrogram="none",
          labCol=data.w$year,labRow=data.w$cname,
          lhei=c(0.1,1), lwid=c(0.1,1), margins=c(5,10),
          colsep=1:16, rowsep=1:9, sepcolor="white",
          col=gray.colors(8, start=1, end=0) ) 
dev.off()

总的来说,我对情节看起来很满意:

enter image description here

然而,显示的国家实际上属于两个不同的群体,亚美尼亚,阿塞拜疆和格鲁吉亚属于该群体&#34;邻居&#34;其余国家是该组织的成员&#34;扩大&#34;。

简而言之,我想按群组成员分割热图。在每个群组中,国家/地区不应按字母顺序或按值列出,但我需要根据具体情况对订单进行个性化标准。

重要的是,我不想

  • 绘制两个单独的图,因为这会改变分布 颜色;
  • 使用RowSideColors对行变量进行分组 附加参数,例如为了建议here 对输入变量进行分类。

相反,最终的热图应按如下方式组织: enter image description here

为了获得这样的热图,我需要添加到图中的哪个热图,其中行的顺序是个性化的? 请注意,不需要在分隔组的行之间留出额外空间。

万分感谢!

2 个答案:

答案 0 :(得分:0)

虽然不理想,但在上述情况下,我认为您可以通过移除Rowv=NULL,但保留Colv=NULL, dendrogram="none",来对其进行排序,但禁止绘制树形图。

只有头脑中的数据我得到了heatmap 使用此代码:

data.w = t(matrix(c(1998,       0,          0,     1.14,       0,   1.21,           1.32,    1.43,       0,    1999,       0,          0,     1.32,       0,   1.44,           1.50,    1.68,       0,  2000,       0,          0,     1.32,       0,   1.63,           1.59,    1.75,       0,  2001,       0,          0,     1.46,       0,   1.85,           1.93,    1.81,       0,  2002,       0,          0,     1.74,       0,   2.04,           2.00,    2.00,       0, 2003,       0,          0,     1.85,       0,   2.22,           2.22,    2.19,       0),9,6))
colnames(data.w) = c("year", "Armenia", "Azerbaijan", "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Estonia", "Georgia")
group = c(0,0,1,1,1,1,1,1,0)
library(gplots) 

heatmap.2(as.matrix(t(data.w[,2:9])), trace="none", 
      # Rowv=NULL, Colv=NULL, 
      dendrogram="none",
      # reorderfun = group,
      labCol=data.w[,1],#labRow=data.w$cname,
      lhei=c(0.1,1), lwid=c(0.1,1), margins=c(5,10),
      colsep=1:16, rowsep=1:9, sepcolor="white",
      col=gray.colors(8, start=1, end=0) ) 

当你在其余的几年中加入时,克罗地亚将与其他三年分开。

否则应该可以使用reorderfun选项进行,但我不知道它是如何工作的。

答案 1 :(得分:0)

Sebastian Raschka [http://sebastianraschka.com]非常友善,帮助我解决了我的问题,我很乐意分享。

如果您想避免行(此处为国家/地区的名称)按字母顺序排序,则应编写一个函数,根据需要对DataFrame中的国家/地区进行排序。为了简单起见并坚持使用示例,您还可以在少数几个国家/地区快速手动执行此操作:

data.w <- data.w[c("Cyprus","Czech Republic","Estonia","Bulgaria","Croatia","Armenia","Azerbaijan","Georgia")]

然后我们使用占位符函数覆盖heatmap.2函数reorderfun,然而,这不会赢得&#34;做&#34;做&#34;任何事情,以便我们保持DataFrame的顺序。

总的来说,这就是代码应该如何生成如上图所示的热图(第2张图片)。

heatmap.2(as.matrix(t(data.w)), trace="none",
          Rowv=NULL, Colv=NULL, dendrogram="none",
          reorderfun=function(d,w) { d },
          labCol=data.w$year,labRow=data.w$cname,
          lhei=c(0.1,3), lwid=c(0.1,3), margins=c(5,8),
          colsep=1:16, rowsep=1:22, sepcolor="white",
          col=gray.colors(8, start=1, end=0)
          )

非常感谢塞巴斯蒂安!