R语言绘制热图(二):heatmap.2函数画热图

heatmap.2()函数属于R语言gplots程序包。我们根据说明书所给测试例子运行代码,一步一步认识heatmap.2,了解各参数的设置和热图显示效果。其中第一部分较为实用,因为下文命令几乎每一行都可以生成一个热图,为了文章的整体性,有些图没有附。建议学习者自己复制运行,实践不同命令的产生的图形变化。

## 生成测试数据
rm(list = ls())
data(mtcars)
x  <- as.matrix(mtcars)
rc <- rainbow(nrow(x), start=0, end=.3)
cc <- rainbow(ncol(x), start=0, end=.3)
## 软件安装
install.packages("gplots")
library("gplots")

第一部分

#1对颜色进行优化
col=bluered
heatmap.2(x,col=redgreen)
heatmap.2(x,col=cm.colors(255))

#2对所有数据进行标准化(scale=(”none“,"row","column")),主要是为了防止单个数据过大(过小),导致冷热色分布不明显的现象。
heatmap.2(x,
          col=redgreen,
          scale = "column")
#3热图左上角的图称为Key

heatmap.2(x,
          col=redgreen,
          scale="row",
          key=T,keysize=2) 
#4 需要基准线时输入"both","row" 或者"column"
heatmap.2(x,
          col=redgreen,
          scale="row",
          key=T,keysize=2,
          trace = "both")
#5 定义xlab和ylab的字符大小

heatmap.2(x,
          col=redgreen,
          scale="row",
          key=T,keysize=2,
          trace = "row",
          cexCol=0.5,cexRow=0.5,)

第二部分

## 1 默认无名称,可以增加和修改
heatmao.2(x,xlab="Relative Concentration", ylab="Probeset",main = "main")
## 2 演示行和列树图选项的效果
heatmap.2(x)                    ## 默认显示树图
heatmap.2(x, dendrogram="none") ## 没有绘制树图,只是重新排序
heatmap.2(x, dendrogram="row")  ## 在行方向显示树突和排序
heatmap.2(x, dendrogram="col")  ## 在列方向显示树突和排序
## 3 通过分支而不是累加的方法重新排列树图
heatmap.2(x, reorderfun=function(d, w) reorder(d, w, agglo.FUN = mean) )
## 4 使用与完整热图相同的颜色编码绘制子集群
full <- heatmap.2(x)
heatmap.2(x, Colv=full$colDendrogram[[2]], breaks=full$breaks)  # column subset
heatmap.2(x, Rowv=full$rowDendrogram[[1]], breaks=full$breaks)  # row subset
heatmap.2(x, Colv=full$colDendrogram[[2]],
          Rowv=full$rowDendrogram[[1]], breaks=full$breaks)  # both
## 5 显示行和列标签旋转的效果
# srtCol设置列旋转角度,adjCol设置列字体与坐标轴的距离
heatmap.2(x, srtCol=NULL)
heatmap.2(x, srtCol=0,   adjCol = c(0.5,1) )
heatmap.2(x, srtCol=45,  adjCol = c(1,1)   )  #45度常用
heatmap.2(x, srtCol=45,  adjCol = c(1.5,1) )
heatmap.2(x, srtCol=45,  adjCol = c(1,0)   )
heatmap.2(x, srtCol=45,  adjCol = c(0.5,0) )
heatmap.2(x, srtCol=45,  adjCol = c(0,0)   )
heatmap.2(x, srtCol=270, adjCol = c(0,0.5) )
# 同理设置行的相关参数
heatmap.2(x, srtRow=45, adjRow=c(0, 1) )
heatmap.2(x, srtRow=45, adjRow=c(0, 1), srtCol=45, adjCol=c(1,1) )
heatmap.2(x, srtRow=45, adjRow=c(0, 1), srtCol=270, adjCol=c(0,0.5) )

第二部分


第三部分

## 1 演示如何使用“extrafun”将“key”替换为散点图
# 测试数据
lmat <- rbind( c(5,3,4), c(2,1,4) )
lhei <- c(1.5, 4)
lwid <- c(1.5, 4, 0.75)

myplot <- function() {
  oldpar <- par("mar")
  par(mar=c(5.1, 4.1, 0.5, 0.5))
  plot(mpg ~ hp, data=x)
}
heatmap.2(x,
           lmat=lmat,
           lhei=lhei,
           lwid=lwid, 
           key=FALSE,           # 不显示key图
           extrafun=myplot)     # 显示散点图
## 2 演示如何自定义颜色
# (1)
heatmap.2(x,
          key.title=NA, # no title
          key.xlab=NA,  # no xlab
          key.par=list(mgp=c(1.5, 0.5, 0),
                       mar=c(2.5, 2.5, 1, 0)),
          key.xtickfun=function() {
            breaks <- parent.frame()$breaks
            return(list(
              at=parent.frame()$scale01(c(breaks[1],
                                          breaks[length(breaks)])),
              labels=c(as.character(breaks[1]),
                       as.character(breaks[length(breaks)]))
            ))
          })
(1)
# (2)
heatmap.2(x,
          breaks=256,
          key.title=NA,
          key.xlab=NA,
          key.par=list(mgp=c(1.5, 0.5, 0),
                       mar=c(1, 2.5, 1, 0)),
          key.xtickfun=function() {
            cex <- par("cex")*par("cex.axis")
            side <- 1
            line <- 0
            col <- par("col.axis")
            font <- par("font.axis")
            mtext("low", side=side, at=0, adj=0,
                  line=line, cex=cex, col=col, font=font)
            mtext("high", side=side, at=1, adj=1,
                  line=line, cex=cex, col=col, font=font)
            return(list(labels=FALSE, tick=FALSE))
          })

(2)


第四部分

# 1 显示在列内z分数缩放的效果,蓝红颜色缩放
hv <- heatmap.2(x, col=bluered, scale="column", tracecol="#303030")
image.png
> names(hv) # 查看返回值
 [1] "rowInd"        "colInd"        "call"          "colMeans"     
 [5] "colSDs"        "carpet"        "rowDendrogram" "colDendrogram"
 [9] "breaks"        "col"           "vline"         "colorTable"   
[13] "layout"       
## 显示值的范围与颜色对照表
> hv$colorTable
          low       high   color
1  -3.2116766 -2.7834531 #0000FF
2  -2.7834531 -2.3552295 #2424FF
3  -2.3552295 -1.9270060 #4949FF
4  -1.9270060 -1.4987824 #6D6DFF
5  -1.4987824 -1.0705589 #9292FF
6  -1.0705589 -0.6423353 #B6B6FF
7  -0.6423353 -0.2141118 #DBDBFF
8  -0.2141118  0.2141118 #FFFFFF
9   0.2141118  0.6423353 #FFDBDB
10  0.6423353  1.0705589 #FFB6B6
11  1.0705589  1.4987824 #FF9292
12  1.4987824  1.9270060 #FF6D6D
13  1.9270060  2.3552295 #FF4949
14  2.3552295  2.7834531 #FF2424
15  2.7834531  3.2116766 #FF0000
> ## 查看白色对应值的范围
> hv$colorTable[hv$colorTable[,"color"]=="#FFFFFF",]
         low      high   color
8 -0.2141118 0.2141118 #FFFFFF
> ## 确定映射到白色的原始数据值
> whiteBin <- unlist(hv$colorTable[hv$colorTable[,"color"]=="#FFFFFF",1:2])
> rbind(whiteBin[1] * hv$colSDs + hv$colMeans,
+       whiteBin[2] * hv$colSDs + hv$colMeans )
          cyl        am        vs     carb       wt     drat     gear     qsec
[1,] 5.805113 0.2994102 0.3295842 2.466667 3.007751 3.482081 3.529527 17.46614
[2,] 6.569887 0.5130898 0.5454158 3.158333 3.426749 3.711044 3.845473 18.23136
          mpg       hp     disp
[1,] 18.80018 132.0074 204.1851
[2,] 21.38107 161.3676 257.2586
## 一个更具装饰性的热图,z-score沿柱缩放
##
hv <- heatmap.2(x, col=cm.colors(255), scale="column",
                RowSideColors=rc, ColSideColors=cc, margin=c(5, 10),
                xlab="specification variables", ylab= "Car Models",
                main="heatmap(<Mtcars data>, ..., scale=\"column\")",
                tracecol="green", density="density")
一个更具装饰性的热图,z-score沿柱缩放
## 注意,断点现在是关于0对称的

## 给标签涂上颜色,使其与颜色一致
hv <- heatmap.2(x, col=cm.colors(255), scale="column",
                RowSideColors=rc, ColSideColors=cc, margin=c(5, 10),
                xlab="specification variables", ylab= "Car Models",
                main="heatmap(<Mtcars data>, ..., scale=\"column\")",
                tracecol="green", density="density", colRow=rc, colCol=cc,
                srtCol=45, adjCol=c(0.5,1))

给标签涂上颜色,使其与颜色一致


第五部分

# 测试数据
data(attitude)
round(Ca <- cor(attitude), 2)
symnum(Ca) # 简单图形
# 重新排序
heatmap.2(Ca,        symm=TRUE, margin=c(6, 6), trace="none" )
# 不排序
heatmap.2(Ca, Rowv=FALSE, symm=TRUE, margin=c(6, 6), trace="none" )
## 把彩色的key放在图像下方
heatmap.2(x, lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(1.5, 4, 2 ) )
## 把彩色的key放右上角
heatmap.2(x, lmat=rbind( c(0, 3, 4), c(2,1,0 ) ), lwid=c(1.5, 4, 2 ) )
把彩色的key放右上角
## 对于变量聚类,使用基于cor()的距离:
data(USJudgeRatings)
symnum( cU <- cor(USJudgeRatings) )

hU <- heatmap.2(cU, Rowv=FALSE, symm=TRUE, col=topo.colors(16),
                distfun=function(c) as.dist(1 - c), trace="none")
对于变量聚类,使用基于cor()的距离
## 相同重排序的相关矩阵:
hM <- format(round(cU, 2))
hM

# 现在用图上的相关矩阵

heatmap.2(cU, Rowv=FALSE, symm=TRUE, col=rev(heat.colors(16)),
          distfun=function(c) as.dist(1 - c), trace="none",
          cellnote=hM)
image.png
## genechip数据例子
# 有兴趣的可以尝试以下:
#  library(affy)
#  data(SpikeIn)
#  pms <- SpikeIn@pm
# 
#  # just the data, scaled across rows
#  heatmap.2(pms, col=rev(heat.colors(16)), main="SpikeIn@pm",
#               xlab="Relative Concentration", ylab="Probeset",
#               scale="row")
# 
#  # fold change vs "12.50" sample
#  data <- pms / pms[, "12.50"]
#  data <- ifelse(data>1, data, -1/data)
#  heatmap.2(data, breaks=16, col=redgreen, tracecol="blue",
#                main="SpikeIn@pm Fold Changes\nrelative to 12.50 sample",
#                xlab="Relative Concentration", ylab="Probeset")
#  ## End(Not run)

THE END


参考:
heatmap.2
heatmap.2绘制热图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345