r - 如何在 pheatmap 中创建离散图例

标签 r heatmap pheatmap

我想在 pheatmap 中创建离散图例(不连续)。所以对于这段代码,

m=as.matrix(c(1:100))
breaks=c(1,5,10,50,80,100)
color=c("red","blue","green","yellow","orange")
pheatmap(m,cluster_rows=FALSE, cluster_cols=FALSE,breaks=breaks,color=color)

图例如下所示:

default pheatmap legend

但我希望它看起来像这样,其中每个矩形的大小相同:

discrete pheatmap legend

你能给我指出 pheatmap 中可以实现这一点的选项吗?我想不明白。非常感谢,

最佳答案

好吧,函数本身确实不想容纳这样的传说。据我所知,无法传递任何参数组合以使其离散,并且它依赖的所有绘图函数似乎都被锁定,因此您无法真正调整它们的行为。

但是,好消息是该函数使用网格图形来进行输出。我们可以破解网格树上留下的网格对象,以删除它们绘制的图例并绘制我们自己的图例。我创建了一个函数来执行此操作。

changeLegend<-function(breaks, color) {
    tree <- grid.ls(viewport=T, print=F)
    #find legend
    legendvp <- tail( grep("GRID.VP", tree$name), 1)
    #get rid of grobs in this viewport
    drop <- tree$name[grepl(tree$vpPath[legendvp],tree$vpPath) & 
        grepl("grob",tree$type)]
    sapply(drop, grid.remove)

    #calculate size/position of labels
    legend_pos = seq(0,to=1,length.out=length(breaks))
    brat = seq(0,to=1,length.out=length(breaks))
    h = 1/(length(breaks)-1)

    #render legend
    seekViewport(tree$name[legendvp])    
    grid.rect(x = 0, y = brat[-length(brat)], 
        width = unit(10, "bigpts"), height = h, hjust = 0, 
        vjust = 0, gp = gpar(fill = color, col = "#FFFFFF00"))
    grid.text(breaks, x = unit(12, "bigpts"), 
        y = legend_pos, hjust = 0,)
}

由于他们没有真正命名任何视口(viewport),我不得不猜测哪个视口(viewport)包含哪些对象。我假设图例将始终是最后一个视口(viewport),并且它将包含两个球体,一个用于颜色框,一个用于图例中的文本。我删除了这些项目,然后使用传入的中断和颜色重新绘制新的图例。以下是您如何在示例中使用该函数

library(pheatmap)
library(grid)

mm <- as.matrix(c(1:100))
breaks <- c(1,5,10,50,80,100)
colors <- c("red","blue","green","yellow","orange")

pp<-pheatmap(mm,cluster_rows=FALSE, cluster_cols=FALSE,
   breaks=breaks, color=colors, legend=T)
changeLegend(breaks, colors)

这就产生了

discrete legend

因为我们正在攻击未记录的网格对象,这可能不是最可靠的方法,但它展示了网格图形的灵活性

关于r - 如何在 pheatmap 中创建离散图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23938889/

相关文章:

r - 按名称选择数据框变量并按元素与向量相乘

javascript - 来自离散字符串域的连续色标?

r - 在R中应用,如何使用?

r - 热图中每个变量的多个填充图例

R 热图着色取决于高于或低于零的值

r - Pheatmap:重新排序树状图中的叶子

r - 在arrangeGrob 中使用pheatmap

r - 使用 Scala 使用 Spark 在 Dataframe 上使用 Quantile 函数查找区间数

r - 根据 CI 输出制作表格