【问题标题】:display a matrix, including the values, as a heatmap将包含值的矩阵显示为热图
【发布时间】:2011-04-16 21:58:28
【问题描述】:

我想做的是采用这个矩阵:

> partb
                0.5  1.5   1a   1b   -2   -3
A1FCLYRBAB430F 0.26 0.00 0.74 0.00 0.00 0.00
A1SO604B523Q68 0.67 0.33 0.00 0.00 0.00 0.00
A386SQL39RBV7G 0.00 0.33 0.33 0.33 0.00 0.00
A3GTXOXRSE74WD 0.41 0.00 0.08 0.03 0.05 0.44
A3OOD9IMOHPPFQ 0.00 0.00 0.33 0.00 0.33 0.33
A8AZ39QM2A9SO  0.13 0.54 0.18 0.13 0.00 0.03

然后制作一个热图,其中包含现在彩色单元格中的每个值。

制作热图很容易:

> heatmap( partb, Rowv=NA, Colv=NA, col = heat.colors(256),  margins=c(5,10))

但在我的一生中,我无法弄清楚如何将值放入每个单元格中。

我错过了什么?这当然是很常见的事情。

【问题讨论】:

    标签: r heatmap


    【解决方案1】:

    例如:

    m <- matrix(1:30, ncol=6)
    colnames(m) <- paste("C", 1:6, sep="")
    rownames(m) <- paste("R", 1:5, sep="")
    m
    
    image(1:ncol(m), 1:nrow(m), t(m), col = terrain.colors(60), axes = FALSE)
    axis(1, 1:ncol(m), colnames(m))
    axis(2, 1:nrow(m), rownames(m))
    for (x in 1:ncol(m))
      for (y in 1:nrow(m))
        text(x, y, m[y,x])
    

    【讨论】:

    • 谢谢!这是最简单的答案,不需要任何额外的包,没有ggplot2,从我的角度来看,简洁明了:完美
    【解决方案2】:

    gplots 包中尝试heatmap.2。 cellnote 和 notecol 参数控制放置在单元格中的文本。你可能也想要dendrogram = "none"

    【讨论】:

    • 这很好用,但是间距全乱了。图像的左上角,即钥匙所在的位置,是空白的。关于如何居中的任何想法:heatmap.2(partb, Rowv=FALSE, Colv=FALSE, dendrogram='none', cellnote=partb, notecol="black", trace='none', rowsep=c(1, 2,3,4,5,6), key=FALSE)
    • 好点。 heatmap.2 函数实际上使用了 layout 函数并创建了 4 个绘图输出。你可以试试lmatlwidlhei参数,或者修改函数的源代码来做你需要的,但我还没有走那么远。
    • 这正是我所需要的。混用lwidlhei 效果很好。设置margins 让我可以确保标签没有被切断。整件事:heatmap.2( partb, Rowv=FALSE, Colv=FALSE, dendrogram='none', cellnote=partb, notecol="black", trace='none', key=FALSE,lwid = c(.01,.99),lhei = c(.01,.99),margins = c(5,15 ))
    • 我的所有 x 和 y 索引都已重新排序,levelplot 来自 lattice 将立即可用。
    【解决方案3】:

    您可以使用imagetext。我个人喜欢fields 包中的image.plot,因为它在侧面添加了一个图例,但您也可以将它与image 一起使用。

    例如

    require(fields)
    # Make a 10x10 matrix
    m = matrix(rnorm(100), nrow=10)
    image.plot(m)
    for (x in 1:10)
        for (y in 1:10)
            text((x-1)/9, (y-1)/9, sprintf("%0.2f", m[x,y]))
    

    【讨论】:

      【解决方案4】:

      lattice 包中的levelplot() 将为您提供颜色图例。不完全是您想要的,而是需要考虑的事情。

      【讨论】:

        【解决方案5】:

        还有另一种更简单的方法来制作带有值的热图。您可以使用pheatmap 来执行此操作。

        dat <- matrix(rnorm(100, 3, 1), ncol=10)
        names(dat) <- paste("X", 1:10)
        install.packages('pheatmap') # if not installed already
        library(pheatmap)
        pheatmap(dat, display_numbers = T)
        

        这会给你一个这样的情节

        【讨论】:

          【解决方案6】:

          在 lcgong 之后(不幸的是,我可以发表直接评论)纯粹的换位导致了颜色表示的问题。因此,我再次旋转了矩阵并且它起作用了。您可以找到如下功能。请确保所选的热图色阶适用于 3 到 11 之间的 n。如果需要,您可以在此处简单地选择另一个。

          heatmap <- function(data, rowN, colN, xTitle = "", yTitle = "", numColors)
          {
              # transpose and rotate matrix clockswise 90 degrees 
              dataAdjusted <- t(apply(data,2,rev))
          
              image(1:ncol(data), 1:nrow(data), xlab = xTitle, ylab = yTitle, dataAdjusted, col = rev(brewer.pal(numColors,"RdYlBu")), axes = FALSE)
              axis(1, 1:ncol(data), colN)
              axis(2, 1:nrow(data), rowN)
          
              for (x in 1:ncol(data))
                  for (y in 1:nrow(data))
                      # add text values into matrix based on transposed/rotated indices + round values to two digits
                      text(x, y, round(dataAdjusted[x,y],2))
          }
          
          # required lib
          library(RColorBrewer)
          
          # Make a 8x8 matrix
          m = matrix(rnorm(64), nrow=8)
          
          # row names
          rowN <- c("row 01", "row 02", "row 03", "row 04", "row 05", "row 06", "row 07", "row 08");
          # column names
          colN <- c("col 01", "col 02", "col 03", "col 04", "col 05", "col 06", "col 07", "col 08");
          
          # without axis titles    
          heatmap(m, rowN, colN, numColors = 10)
          
          # alternatively with titles
          heatmap(m, rowN, colN, xTitle = "xTest", yTitle = "yTest", numColors = 10)
          

          【讨论】:

            猜你喜欢
            • 2023-03-03
            • 2020-12-08
            • 2017-04-14
            • 1970-01-01
            • 1970-01-01
            • 2016-08-25
            • 1970-01-01
            • 2017-05-07
            • 2012-09-12
            相关资源
            最近更新 更多