好吧,函数本身确实不想容纳这样的传说。据我所知,无法传入任何参数组合以使其离散,并且它所依赖的所有绘图功能似乎都已锁定,因此您无法真正调整它们的行为。
但是,好消息是该函数使用网格图形进行输出。我们可以破解留在网格树上的网格对象,以删除它们绘制的图例并绘制我们自己的图例。我已经创建了一个函数来做到这一点。
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)
这会产生
因为我们正在破解未记录的网格对象,这可能不是最强大的方法,但它展示了网格图形的灵活性