【问题标题】:how to create discrete legend in pheatmap如何在 pheatmap 中创建离散图例
【发布时间】:2014-05-29 17:04:55
【问题描述】:

我想在 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)

图例如下所示:

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

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

【问题讨论】:

    标签: r heatmap pheatmap


    【解决方案1】:

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

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

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

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

    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)
    

    这就产生了

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

    【讨论】:

    • 感谢您的帮助...我很高兴这不是很明显。我整个上午都在研究如何做到这一点。
    • 很好的解决方案。我无法将其打印到文件中(仅限查看者)。有什么想法吗?
    • @user1701545 您要打印到什么类型的文件?你怎么样?究竟是什么错误?
    • 我试图首先定义要保存绘图的文件 pdf("my.pdf"),然后运行绘图命令,然后运行 ​​dev.off()。但我发现运行绘图命令,然后是 dev.copy(pdf, "my.pdf") 和 dev.off() 就可以了。顺便说一句,我能问你如何在图例上方添加标题吗?
    • @user1701545 因为它是一个网格图,你应该可以用grid.text()添加额外的文本
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多