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

How can I individualize the order of rows in heatmap.2 (gplots)?

我有兴趣使用 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()

总的来说,我对剧情比较满意:

然而,显示的国家实际上属于 两个不同的组 ,其中亚美尼亚、阿塞拜疆和格鲁吉亚属于 "neighbourhood" 组,其余国家属于小组 "enlargement"。

简而言之,我想按组成员资格拆分热图。在每个组中,国家不应按字母顺序或根据值列出,但我需要个性化根据某些特定标准排序。

重要的是,我不想

相反,最终的热图应该组织如下:

我需要在绘图中添加什么才能获得这样的 heatmap.2,其中行的顺序是个性化的? 请注意,不需要在分隔组的行之间额外 space。

万分感谢!

虽然不理想,但在上述情况下,我认为您可以通过删除 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 选项来完成,但我不知道它是如何工作的。

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

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

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

然后我们用占位符函数覆盖 heatmap.2 函数 reorderfun,但是,它不会 "do" 任何东西,以便我们保持 DataFrame 的顺序。

总的来说,为了生成如上所示的热图(第二张图),代码应该是这样的。

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)
          )

非常感谢塞巴斯蒂安!