每当需要做热图的时候,首先想到就是pheatmap
。记不清啥时候第一次使用该包了,但从那以后这就是画热图的第一选择了,因为无论是功能,还是颜值,亦或是操作简易程度都可以算是无可挑剔。如果硬要鸡蛋里挑骨头,那数据很多时注释可能会超出边界可以算作一条。虽然现在有很多其他的选择,但已经习惯了pheatmap
,不想花时间去折腾其他的包了。
这两天画热图就遇到了图例超出边界的情况,所以花时间搞了一下。比如,上图右边的图例显示不全,这得想办法解决一下。其实,明白了pheatmap
会返回一个绘图对象,里面包含绘图的所有数据,而且还是图像对象是一个基于grid
的gtable
对象。也许很多人不熟悉grid
,但肯定听说过ggplot2
,而ggplot2
底层基于grid
。既然,ggplot2
可以那么灵活的变换,grid
当然也可以,只不过由于太底层,变换起来有些繁琐而已。
比如,修正图例显示不全的问题,可以直接修改图例右边的边距,也或者可以通过调整图例位置的方式来解决。下面给出调整图例位置的示例代码:
library(pheatmap)
library(grid)
heat <- pheatmap(mat, annotation_col=annotation_col, show_colnames=F, show_rownames=F)
heat$gtable$grobs[[which(heat$gtable$layout$name == "legend")]]$vp <- viewport(x = 0.7, y = 0.48)
heat$gtable$grobs[[which(heat$gtable$layout$name == "annotation_legend")]]$vp <- viewport(x = 0.1, y = 0.1)
grid.draw(heat)
这样不仅改变了图例布局,顺带也解决了显示不全的问题,一举两得。可以根据需要改变x
、y
值来定义图例的位置,放在哪你说了算。既然,能够改位置,其他的理所当然也可以变动,还是挺灵活的。
网友评论