vlambda博客
学习文章列表

将实验结果呈现出来—使用R语言绘制漂亮的热图

 大家都知道画出漂亮的图是文章命中的关键。平时同学们是不是会经常使用96孔板,384孔板做实验呢,那如何用绘制漂亮的热图直观的表达实验结果

笔者做过相关的联合抑菌实验。 而热图这种可以直观地辨识出数据差异的表达形式不是能很好的展示我们用96孔板所做的实验结果嘛?由于平时用软件画出的图并不好看。因此在这里分享并展示一下。另外, 本篇文章的来源仅仅是作者结合自己所学与遇到的问题所萌发的想法。意图是为大家的研究提供一个思路。因此只是基本的介绍。感兴趣的可以自己深入的研究,哈哈。

热图初展示:

01
R语言与Rstudio安装

R语言安装:https://cran.r-project.org/

将实验结果呈现出来—使用R语言绘制漂亮的热图


Rstudio安装:https://rstudio.com/products/rstudio/download/
下载桌面版就行
将实验结果呈现出来—使用R语言绘制漂亮的热图

安装好后界面如图所示

将实验结果呈现出来—使用R语言绘制漂亮的热图

安装及导入用来处理数据和画图的包,这里说一下,运行的时候框取你要运行的代码+CTRL+ENTER即可运行。
      
        
        
      
install.packages("pheatmap")#安装 library(pheatmap)#导入


02

热图绘制


需要提醒一下,大家复制代码的时候可能符号像“,”这种会复制成中文的,然后报错。所以到时候大家需要修改一下,改成英文的","

当我们导入我们需要的包之后,我们需要导入数据。这个代码里的路径是我存放实验结果的路径,大家可以根据自己的路径进行修改。
      
        
        
      
test<-read.csv("C:/Users/Cheng/Desktop/资料/笔记/R学习/test.csv",header=TRUE,row.names = 1,check.names = F)

实验数据的导入格式如下图所示(第一列,第一行分别对应药物浓度)。
另外这里需要注意的是, R导入excel需要额外的包,我比较懒,所以基本上会把excel保存成csv的格式, 保存为csv的方法是打开excel另存为csv格式就可以。

将实验结果呈现出来—使用R语言绘制漂亮的热图


接着运行以下代码就出现一个基本图啦
      
        
        
      
pheatmap(test)
将实验结果呈现出来—使用R语言绘制漂亮的热图


这里需要提一下,因为我实验数据的列名是以数字开头,这在R中是不被允许的,他会自动在数字前加一个x,所以文章中展示的有些图的横坐标多了一个x,我之前没注意(我也懒得改了)。对,我就是这么懒。不过我已经在代码里做了修改,大家使用的时候就不会出现这个问题了






03

热图的进一步修饰

我们虽然得到了一个基本的图,但是这个图还是很粗糙的,所以需要我的妙手修饰一下。

大家可以看到图中 横纵坐标 的顺序是不是跟我excel中的不同? 相似的聚在了一起。这是因为我使用了 聚类功能(就是将相似的数据聚集成一类)。这个聚类平时是用于我们基因上的,这里不需要,我们修改一下。


我们首先对数据进行归一化,然后去除行和列的聚类(归一化后会使图的数据更加清晰)

  
    
    
  
pheatmap(test, scale = "row",cluster_row = FALSE,cluster_col = FALSE)

输出的图现在变成了这样

将实验结果呈现出来—使用R语言绘制漂亮的热图
当然如果你想聚类或者只想行聚类或者列聚类的话,比如像那些做基因的同学,你可以将上面的代码由FALSE改成TRUE。

你也可以通过下面代码选择不同的聚类方法,默认的的是complete的方法。
  
    
    
  
pheatmap(test,scale = "row", cluster_row = FALSE,cluster_col = TRUE, clustering_method = "ward")

我们接着后面说,接着我们是不是也可以控制热图里面小框框的大小?我们可以用下面的代码运行。
  
    
    
  
pheatmap(test, scale = "row",cluster_row = FALSE,cluster_col = FALSE, cellwidth = 40, cellheight = 40, fontsize = 10)
将实验结果呈现出来—使用R语言绘制漂亮的热图
我再用自己的妙手修饰一下。修改小格子显示的颜色,目前比较常见的是这种表达形式:值大的显示为海军蓝,值小的显示为红色,值中间的显示为白色。
  
    
    
  
pheatmap(test,scale = "row",cluster_row = FALSE,cluster_col = FALSE, cellwidth = 40, cellheight = 40,fontsize = 10,legend_breaks = c(1:2), legend_labels = c("1","2"), color = colorRampPalette(colors = c("navy", "white", "firebrick3"))(100))
将实验结果呈现出来—使用R语言绘制漂亮的热图
当然,我们也可以使用其他颜色,我也不知道我这画的是什么东西。 算了放弃了
pheatmap(test,scale = "row",cluster_row = FALSE,cluster_col = TRUE,display_numbers = TRUE, cellwidth = 40, cellheight = 40,fontsize = 10, color = colorRampPalette(colors = c("firebrick3","white"))(50), angle_col = "0", gaps_row = c(3, 6), gaps_col = c(5,10))
将实验结果呈现出来—使用R语言绘制漂亮的热图
现在看,好像是那么回事,但是横坐标可不可以变正呢。可以!有一种方法是插入注释,但是我觉得这个有点麻烦了,我也不想展开讲。 我给大家介绍另一种方法,这个我还自己摸索了一会。
  
    
    
  
pheatmap(test,scale = "row",cluster_row = FALSE,cluster_col = FALSE,          cellwidth = 40, cellheight = 40,fontsize = 10,legend_breaks = c(1:2), legend_labels = c("1","2"), color = colorRampPalette(colors = c("navy""white""firebrick3"))(100),          angle_col = "0")

将实验结果呈现出来—使用R语言绘制漂亮的热图
附上完整代码,是不是很简单,这里忘换行了,注意一下
test<-read.csv("C:/Users/Cheng/Desktop/资料/笔记/R学习/test.csv",header=TRUE,row.names = 1,check.names = F)library(pheatmap)pheatmap(test,scale = "row",cluster_row = FALSE,cluster_col = FALSE,         cellwidth = 40, cellheight = 40, fontsize = 10,color = colorRampPalette(colors = c("navy", "white", "firebrick3"))(100),angle_col = "0")


04

热图的一些细节内容的补充



接着我们可以设定一下legend,就是右上角的颜色渐变条,其实我觉得我这个图的legend挺好的,但是还是讲一下吧(这里不要改了,我就说一下)
  
    
    
  
#legend_breaks设定legend范围,legend_labels设定legend数值 pheatmap(test, legend_breaks = c(1:2), legend_labels = c("1.0","2.0"))
#不要legend pheatmap(test,legend = FALSE)

然后我们可以修改图中小格子的边界线,比如颜色,或者去掉。显示数字
  
    
    
  
pheatmap(test, border=FALSE)#去掉边界线 pheatmap(test, border_color = "blue")#边界线改成蓝色 pheatmap(test, display_numbers = TRUE,number_color = "blue")#显示数字,数字颜色设定为蓝色
将实验结果呈现出来—使用R语言绘制漂亮的热图
最后,我们还可以把热图切成好几份,神不神奇?智慧的我~
pheatmap(test,scale = "row",cluster_row = FALSE,cluster_col = FALSE,         cellwidth = 40, cellheight = 40,fontsize = 10,legend_breaks = c(1:2), legend_labels = c("1","2"), color = colorRampPalette(colors = c("navy""white""firebrick3"))(100),angle_col = "0"         gaps_row = c(36), gaps_col = c(5,10))


幸苦码字加截图,不说打赏,给个关注转发不过分吧?