说实话,刚接触生信时我就卡在了画热图这步。
看着别人发文章里那些花花绿绿、层次分明的热图
自己折腾半天R studio,报错信息比论文还长。
其实,geo数据库怎么做热图并没有想象中那么玄乎
核心就两个词:预处理、聚类。
今天把我踩过的坑和最终跑通的流程分享出来。
不用那些花里胡哨的第三方包,只用原生函数。
首先得把数据弄干净。
GEO下回来的原始文件通常是TXT或者CSV。
记得要把那些非表达值的列删掉
比如Gene Symbol保留着做注释,Probe ID可以扔掉。
还要检查有没有缺失值
直接na.rm = TRUE处理一下就行
不然后面聚类直接崩给你看。
第二步是标准化
基因表达数据量级差异大,不标准化没法比。
我一般习惯用行均值居中,也就是scale(x, center=TRUE, scale=FALSE)。
这样每个基因都减去自己的平均值
突出相对表达差异,看着更直观。
如果你想做Z-score标准化
用行内均值和标准差归一化也可以
但要注意某些基因标准差为0的情况
代码里最好加个判断,避免除以零的警告。
很多人在这一步偷懒,直接丢进hclust。
结果画出来的热图全是噪音,看不出规律。
一定要先做层次聚类树状图看看效果。
如果叶子节点太碎,可能是聚类方法选错了。
试试方法="ward.D2"通常能聚得更紧凑。
距离度量用"euclidean"是最稳妥的。
别贪心用什么复杂的距离矩阵,容易出bug。
接下来是画图的环节。
很多人喜欢用pheatmap,确实方便
但我更推荐用ggridges加ggplot2组合
或者直接用base R的heatmap函数
虽然丑点,但绝对稳定,不会突然闪退。
我现在的习惯是写一个基础函数封装一下。
输入矩阵,输出PNG高清大图。
注意设置col = heat.colors()或者红蓝色系。
红蓝对比最强烈,审稿人一眼就能看明白
哪组高表达,哪组低表达。
关于GEO数据,还要特别提醒一下批次效应。
如果数据来自不同芯片平台
一定要先做批次校正,再用limma包里的removeBatchEffect。
否则画出来的热图只是反映了芯片型号差异
而不是真实的生物学差异。
这点很多初学者容易忽略
导致后续验证实验对不上,那才叫真头疼。
配色方案别乱用
千万别用彩虹色,那是小学生配色
红蓝双色调是最经典的
中间灰色过渡,高端又专业。
还有行名和列名的顺序
默认是从上到下、从左到右
有时候你想让特定样本在第一列
可以自己先对列名排序再传入绘图函数。
比如把对照组永远放在左边,处理组在右边。
这种细节决定了你图的叙事逻辑。
另外,图例大小和刻度方向也要调。
默认y轴反向,有时候看着别扭
用par(ask=FALSE)关闭询问窗口
再手动调整ylim和xlim范围
让图形比例更协调。
导出图片时,dpi设置成300以上
宽度至少8英寸,这样放Word里才清晰。
如果你用Rmd或者Quarto写报告
记得在code chunk里设置fig.width参数。
不然默认大小根本看不清基因名。
字体大小也很关键
小于10磅的字体在打印版里根本看不见
适当加大axis.text的cex参数。
最后检查一下基因注释是否完整。
如果基因太多,名字重叠看不清
可以选top 50个差异基因单独画一张
或者用自定义的基因ID替换。
不要舍不得删,精简才有力量。
画完热图,记得保存中间矩阵。
万一配色改坏了,不用重跑全流程
直接换个配色参数重绘即可。
这才是高效的工作流。
总之,geo数据库怎么做热图的本质是数据清洗和可视化技巧的结合。
工具不重要,逻辑清晰最重要。
别被复杂的函数名吓住
多读读Help文档里的Examples
真的比看某些烂大街的教程有用多了。
希望能帮到你少走弯路
做出让导师点头的专业图表。