最近有人在群里提问,下面的热图该怎么画。
这张热图,在每一个格子里面用对角线一分为二,呈现了两类信息。图片来自于这篇文章的图1D。
通常,遇到这种需求,我都会直接检索,看看有没有现成的R包可用。可以提取检索词检索一下,这里主要信息应该是"对角线 热图 R语言",
查阅字典后,关键词就变成了英文,“diagonal heatmap r”。在浏览器中检索后得到以下结果。
然后有人给出了使用base plot画图的方案
复制到R语言后运行得到如下结果
这意味着,只要用基本功扎实,复现原图是没有问题的。
但是,我不会base plot,我只会用ggplot2, 检索了一圈也没有现成的解决方案,所以我就准备自己画。
自己画我就开始拆分这张图,一个热图的格子由上下两个三角形构成,我可以先画上三角形,再画下三角形,然后给他们分别配色就可以。
三角形可以通过来画。
上三角也是一样的
通过叠加图层,我们可以把两个三角形放在一起,这就是热图的一个小格子
解决了基本的元素,我就可以批量产生数据。
下面写了一个函数,批量算出指定行列的三角形数据。
因为我们的测试数据是33行,20列,所以用这个函数来产生对应个数的三角形
updata的数据是这样的,每一个框线里面都是一个三角形的数据
可以作图来测试一下上三角形
下三角也是一样的
现在我比较安心了,只要调整原始数据的格式,然后把他跟三角形的数据匹配起来就行。匹配就依靠group那一列
读入第一个数据, 行是基因,列是癌症类型
接下来宽数据变长
现在的数据是这个样子的
如果想要改变未来热图基因的顺序,可以使用因子的水平来控制
接下来就是给这个数据增加能够和三角形group匹配的列,
这一步的操作有trick,比如,因子转为数值,是需要先变成字符串再变成字符的,但是我们这里直接可以获取他的levels数值
最终获取了完整的作图数据
有了数据,作图就很简单了
第二个数据也是同样的处理
现在只要把两个图叠加在一起就行了,但是这里面有个问题。这两个图是分别用两个不同的变量来控制颜色的。
但是如果画在一起,ggplot2是不允许的,但是我记得Y叔发过的大部分帖子,我记得他曾经解决过这种情况,就去翻了一下。
答案在这个帖子里面
连续型和离散型数据一起画热图,外加分开配色和图例
这是我们常见的使用gheatmap做图的代码,为了实现不同数据类型的热图放在一起,让我们祭出包,只需要用,就可以把后面的fill映射和前面的分离开,然后我们就可以愉快地,再加一条gheatmap再画一个热图。
这样我的问题就完美解决了。
安装和加载 R包
分别抽离出基因名称和亚型名称,用来加在图上
指定三个颜色,来自小丫画图的144号作品
画图开始
现在来画侧边的标识,也是自己设计四边形的数据就行了
现在我们用把他们拼接起来
洲更说他对于图层顿悟了,就跟我问Y叔,他给出的答案是一样的,顿悟。但是我还没有,我还在找寻属于我自己的答案。学习图层,对我个人而言并不是为了画图,我就那么点数据,以后的知识以及足够去呈现了,我只是想从高手的视角去看待作图这件事,就跟Y叔给我启发最大的话那样:
图就是数据,数据就是图。
领取专属 10元无门槛券
私享最新 技术干货