解锁数据奥秘:用pheatmap打造精美热图






解锁数据奥秘:用pheatmap打造精美热图

小果  生信果  2024-04-29 19:01:09

大家好,我是小果!热图(Heatmap),作为一种直观展示数据矩阵中数值大小和模式的有效工具,越来越受到广大用户的青睐。然而,如何绘制出既美观又富有信息量的热图,却是一个需要技巧和经验的过程。幸运的是,我们有了pheatmap这个强大的R语言包。它不仅提供了丰富的参数和选项,让我们可以灵活地调整热图的外观和布局,更重要的是,它还内置了高效的聚类算法,能够帮助我们自动发现数据中的隐藏模式和结构。通过pheatmap,我们可以轻松地将科研论文中的复杂的数值矩阵转化为色彩丰富的热图,让数据中的规律和趋势一目了然。
今天这一期小果将以分析疾病进展情况举例详细介绍如何使用pheatmap包来绘制精美的热图,包括数据的准备、参数的调整以及图形的保存等方面。同时呢,练了十年生信的小果要凭本事吃饭啦,要是小伙伴们有有自己做不了的生信分析,可以联系我哦~希望通过本文的学习,小伙伴们能够了解并掌握对生物数据中的风险分布、变化趋势和潜在关联进行可视化的方法以及pheatmap R 包最基本的用法,并将其应用到自己的数据可视化工作中,从而更好地解锁不同样品数据间的相似性,发掘隐藏在数据背后的故事。

一、数据的准备
 

这里的数据集小果已经为大家准备好啦,大家可以直接绘图或者参考~    
但是要注意数据集要有以下条件哦~
1.完整——数据集应包含所有必要的信息,以支持图形的绘制。
2.准确——频率估计应基于可靠的数据和合理的假设。不准确的数据可能导致图形的误判。
3.相关性——数据集中的样本顺序应该按照风险分数从低到高排序,以确保风险曲线能够正确反映样本的风险水平变化。

二、Pheatmap R包装载
 

install.packages("pheatmap")install.packages("limma ")library(pheatmap)library("limma")
小伙伴们要是觉得自己下载R包操作太麻烦,可以使用相关服务器哦~欢迎联系小果租赁性价比居高的服务器!小果随时恭候!



公众号后台回复“111”

领取本篇代码、基因集或示例数据等文件

文件编号:240423

需要租赁服务器的小伙伴可以扫码添加小果,此外小果还提供生信分析,思路设计,文献复现等,有需要的小伙伴欢迎来撩~

   

三、样品文件的差异分析处理
 

依然先将工作路径进行修改设置
setwd("F:\ 96glycolysis\09.glyGeneExp\m6a\8")          inputFile="sampleExp.txt"                                       #输入文件pvalFilter=0.05                                                  #p值临界值logFCfilter=0                                                    #logFC临界值conNum=41                                                         #normal组样品数目treatNum=476                                                      #tumor组样品数目           #读取输入文件outTab=data.frame()grade=c(rep(1,conNum),rep(2,treatNum))rt=read.table(inputFile,sep="t",header=T,check.names=F)rt=as.matrix(rt)rownames(rt)=rt[,1]exp=rt[,2:ncol(rt)]dimnames=list(rownames(exp),colnames(exp))data=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)    data=avereps(data)data=data[rowMeans(data)>0,]           #差异分析for(i in row.names(data)){        geneName=unlist(strsplit(i,"\|",))[1]        geneName=gsub("\/", "_", geneName)        rt=rbind(expression=data[i,],grade=grade)        rt=as.matrix(t(rt))        wilcoxTest<-wilcox.test(expression ~ grade, data=rt)        conGeneMeans=mean(data[i,1:conNum])        treatGeneMeans=mean(data[i,(conNum+1):ncol(data)])        logFC=log2(treatGeneMeans)-log2(conGeneMeans)        pvalue=wilcoxTest$p.value        conMed=median(data[i,1:conNum])        treatMed=median(data[i,(conNum+1):ncol(data)])        diffMed=treatMed-conMed        if( ((logFC>0) & (diffMed>0)) | ((logFC<0) & (diffMed<0)) ){               outTab=rbind(outTab,cbind(gene=i,conMean=conGeneMeans,treatMean=treatGeneMeans,logFC=logFC,pValue=pvalue))        }}           #输出所有基因的差异情况write.table(outTab,file="all.txt",sep="t",row.names=F,quote=F)           #输出差异表格outDiff=outTab[(abs(as.numeric(as.vector(outTab$logFC)))>logFCfilter & as.numeric(as.vector(outTab$pValue))     <pvalFilter),]< span></pvalFilter),]<>write.table(outDiff,file="diff.xls",sep="t",row.names=F,quote=F)write.table(outDiff,file="diff.txt",sep="t",row.names=F,quote=F)           #输出差异基因的表达文件heatmap=rbind(ID=colnames(data[as.vector(outDiff[,1]),]),data[as.vector(outDiff[,1]),])write.table(heatmap,file="diffGeneExp.txt",sep="t",col.names=F,quote=F)           四、文件的导入  依然先将工作路径进行修改设置setwd("F:\ 96glycolysis\09.glyGeneExp\m6a\8")          rt=read.table("risk.txt",sep="t",header=T,row.names=1,check.names=F)  #读取输入文件rt=rt[order(rt$riskScore),]                                            #按照riskScore对样品排序#使用read.table()函数读取名为"risk.txt"的数据文件,并存储在变量rt中。

五、参数的调整与图形的保存
 

小果这一期绘制了三类图:风险曲线、生存状态图、风险热图。

1.风险曲线
 

风险曲线通常用于描述某个基因变异、环境因素或临床指标与疾病风险之间的关系。    

2.生存状态图
 

生存状态图(也称为生存曲线或Kaplan-Meier曲线)常用于描述患者群体的生存时间分布。Kaplan-Meier曲线展示了患者从接受治疗到事件发生(如死亡或疾病复发)的时间长短。

3.风险热图
 

风险热图常用于展示基因组数据中的风险模式或差异。这些热图可以显示不同基因、基因区域或样本之间的风险水平,通过颜色深浅或色调变化来反映风险的高低。
小果这一期将用pheatmap R包进行绘制风险热图~风险热图能够让我们识别与疾病相关的基因、基因变异或生物标记物,然后进一步揭示疾病的分子机制和潜在治疗靶点。
#风险曲线riskClass=rt[,"risk"]#从数据框rt中提取名为"risk"的列,将其赋值给riskClass变量。这个列应该包含风险等级的信息。lowLength=length(riskClass[riskClass=="low"])#计算风险等级为"low"的数量,将结果赋值给lowLength变量。highLength=length(riskClass[riskClass=="high"])#计算风险等级为"high"的数量,将结果赋值给highLength变量。line=rt[,"riskScore"]    #从数据框rt中提取名为"riskScore"的列,将其赋值给line变量。这个列应该包含风险评分的信息。line[line>10]=10     #将line中大于10的值设为10,限制风险评分的范围。(小果设定的值是10,小伙伴们可根据自己的数据集进行修改~)pdf(file="riskScore.pdf",width = 10,height = 5)#设置宽度、高度。(小伙伴们可根据自己需求修改参数)plot(line,     type="p",     pch=20,     xlab="Patients (increasing risk socre)",     ylab="Risk score",     col=c(rep("green",lowLength),     rep("red",highLength)))#绘制散点图,横坐标为患者,风险评分递增,纵坐标为风险评分,根据风险等级为"low"和"high"的数量来设定颜色(小伙伴们可根据自己的喜好修改~)#plot()是R语言中非常常用且功能强大的绘图内置函数,用于绘制各种类型的图形,如散点图、折线图、直方图等abline(v=lowLength,lty=5)#在图中添加一条垂直虚线legend("topleft",c("Highrisk","lowRisk"),bty="n",pch=19,col=c("red","green"),cex=1.2)#在左上角添加图例,分别表示"Highrisk"和"lowRisk",颜色为红色和绿色。dev.off()#关闭PDF文件绘图设备,保存图表
   
#生存状态图color=as.vector(rt$fustat)color[color==1]="red"color[color==0]="blue"#创建一个向量color,其中的值与rt$fustat中的值相同。接着根据rt$fustat的值,将color向量中为1的元素设为"red",为0的元素设为"blue"pch=as.vector(rt$fustat)pch[pch==1]=15pch[pch==0]=19#创建一个向量pch,其中的值与rt$fustat中的值相同。接着根据rt$fustat的值,将pch向量中为1的元素设为15,为0的元素设为19。这里,小果说一下,pch是用于指定数据点的形状哦~pdf(file="survStat.pdf",width = 10,height = 5)#同样的,设置宽和高。(可根据自己需求修改参数哦~)plot(rt$futime,     pch=pch,     xlab="Patients (increasing risk socre)",     ylab="Survival time (years)",         col=color)#依然用到plot()函数绘制散点图,横坐标为rt$futime,纵坐标为rt$fustat,数据点的形状由pch向量指定,颜色由color向量指定。横坐标和纵坐标的标签分别为"Patients (increasing risk score)""Survival time (years)"legend("topleft", c("Dead", "Alive"),bty="n",pch=c(15,19),col=c("red","blue"),cex=1.2)#在图中添加图例,位置在左上角,标签为"Dead""Alive",对应的数据点形状为15和19,颜色分别为红色和蓝色。abline(v=lowLength,lty=2)#同样在图中添加一条垂直虚线,位置为lowLengthdev.off()#关闭并保存
#风险热图rt1=rt[c(3:(ncol(rt)-2))]#从数据框rt中选取第3列到倒数第3列的数据,并将其存储在新的数据框rt1中。(小伙伴们如果选用的数据集和小果不同的话记得要修改哦~)rt1=t(rt1)          #对数据框rt1进行转置,将行列交换,以便后续生成热图时行表示样本,列表示特征。rt1=log2(rt1+1)#对数据框rt1中的所有元素加1后取对数(以2为底),对数据进行对数变换,以便更好地展示数据的差异。annotation=data.frame(type=rt[,ncol(rt)])#创建一个名为annotation的数据框,其中包含一个名为type的列,列中的值来自rt数据框的最后一列。rownames(annotation)=rownames(rt)#将annotation数据框的行名设置为rt数据框的行名,以便后续在热图中添加注释信息。pdf(file="heatmap.pdf",width = 10,height = 5)#和上面的一样,设置宽和高。pheatmap(rt1,         annotation=annotation,          cluster_cols = FALSE,         cluster_rows = FALSE,         fontsize_row=11,         show_colnames = F,         fontsize=7,         fontsize_col=3,         color = colorRampPalette(c("green", "black", "red"))(50) )#用pheatmap()函数生成热图,其中:rt1——要展示的数据;annotation——包含了样本类别信息;cluster_cols和cluster_rows——是否对列和行进行聚类,这里小果选择了FALSE,即生成热图时,行和列的顺序将保持原始数据中的顺序,不会经过聚类算法重新排列;fontsize_row和fontsize_col——行和列标签的字体大小;show_colnames——是否显示列名,color——指定热图的颜色渐变,这里小果使用了从绿色到红色的渐变,共50个颜色。dev.off()#关闭并保存
          
风险曲线、生存状态图与风险热图,无疑是生信领域的璀璨明珠,它们直观而深刻地揭示了生物数据中的风险奥秘。通过它们,我们能够洞察疾病的进展脉络,把握风险分布与变化趋势,为疾病的预防、诊断和治疗铺设坚实的基石。
本期,小果不仅为小伙伴们带来了pheatmap包如何绘制出精美绝伦的热图同时,还以疾病进展为实例,展示了其实际应用。希望对小伙伴们有所裨益~下期再见哦,期待与小伙伴们继续相约,一起探寻生信之美!如果各位觉得自己运行代码太麻烦,欢迎用我们的云生信小工具,只要输入合适的数据就可以直接出想要的图呢,附云生信链接
(http://www.biocloudservice.com/home.html)
 

小果还提供思路设计、定制生信分析、文献思路复现;有需要的小伙伴欢迎直接扫码咨询小果,竭诚为您的科研助力!


定制生信分析

服务器租赁

扫码咨询小果



往期回顾

01

1024G存储的生信服务器,两人成团,1人免单!

02

单个数据库用腻了?多数据库“组合拳”带你打开免疫浸润新思路!

03

孟德尔随机化的准备工作,GWAS数据的网站下载方法

04

跟着小果学复现-手把手带你拿下IF=46.9Nature 级别的主成分分析(PCA)图!!