【问题标题】:How can I individualize the order of rows in heatmap.2 (gplots)?如何个性化 heatmap.2 (gplots) 中的行顺序?
【发布时间】:2016-01-14 16:53:39
【问题描述】:

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

总的来说,我对剧情的样子很满意:

然而,显示的国家实际上属于两个不同的组,亚美尼亚、阿塞拜疆和格鲁吉亚属于“邻国”组,其余国家是“扩大”组的成员。

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

重要的是,我不想

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

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

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

谢谢一百万!

【问题讨论】:

    标签: r plot data-visualization heatmap


    【解决方案1】:

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

    【讨论】:

    • 谢谢文森特!是的,确实,对于给定的示例,将 Rowv 设置为 TRUE 可能就足够了。然而,实际数据集包括更多具有不同值的国家。因此该解决方案不会产生预期的效果。我希望有一个更通用的解决方案,也适用于不同的数据——我已经相应地编辑了我的问题。
    【解决方案2】:

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

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

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

    然后我们用占位符函数覆盖 heatmap.2 函数 reorderfun,但是,它不会“做”任何事情,以便我们保持 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)
              )
    

    非常感谢塞巴斯蒂安!

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多