R绘图基础(四)热图 heatmap 173

我们在分析了差异表达数据之后,经常要生成一种直观图--热图(heatmap)。这一节就以基因芯片数据为例,示例生成高品质的热图。

比如

钢蓝渐白配色的热图

首先还是从最简单的heatmap开始。

> library(ggplot2)
> library(ALL) #可以使用biocLite("ALL")安装该数据包
> data("ALL")
> library(limma)
> eset<-ALL[,ALL$mol.biol %in% c("BCR/ABL","ALL1/AF4")]
> f<-factor(as.character(eset$mol.biol))
> design<-model.matrix(~f)
> fit<-eBayes(lmFit(eset,design)) #对基因芯片数据进行分析,得到差异表达的数据
> selected  <- p.adjust(fit$p.value[, 2]) <0.001 
> esetSel <- eset[selected,] #选择其中一部分绘制热图
> dim(esetSel) #从这尺度上看,数目并不多,但也不少。如果基因数过多,可以分两次做图。
Features  Samples 
      84       47 
> library(hgu95av2.db)
> data<-exprs(esetSel)
> probes<-rownames(data)
> symbol<-mget(probes,hgu95av2SYMBOL,ifnotfound=NA)
> symbol<-do.call(rbind,symbol)
> symbol[is.na(symbol[,1]),1]<-rownames(symbol)[is.na(symbol[,1])]
> rownames(data)<-symbol[probes,1] #给每行以基因名替换探针名命名,在绘制热图时直接显示基因名。
> heatmap(data,cexRow=0.5)

使用heatmap函数默认颜色生成的热图


这个图有三个部分,样品分枝树图和基因分枝树图,以及热图本身。之所以对样品进行聚类分析排序,是因为这次的样品本身并没有分组。如果有分组的话,那么可以关闭对样品的聚类分析。对基因进行聚类分析排序,主要是为了色块好看,其实可以选择不排序,或者使用GO聚类分析排序。上面的这种热图,方便简单,效果非常不错。

接下来我们假设样品是分好组的,那么我们想用不同的颜色来把样品组标记出来,那么我们可以使用ColSideColors参数来实现。同时,我们希望变更热图的渐变填充色,可以使用col参数来实现。

> color.map <- function(mol.biol) { if (mol.biol=="ALL1/AF4") "#FF0000" else "#0000FF" }
> patientcolors <- unlist(lapply(esetSel$mol.bio, color.map))
> heatmap(data, col=topo.colors(100), ColSideColors=patientcolors, cexRow=0.5)

使用heatmap函数top.colors填充生成的热图

在heatmap函数中,样品分组只能有一种,如果样品分组有多次分组怎么办?heatmap.plus就是来解决这个问题的。它们的参数都一致,除了ColSideColors和RowSideColors。heatmap使用是一维数组,而heatmap.plus使用的是字符矩阵来设置这两个参数。

> library(heatmap.plus)
> hc<-hclust(dist(t(data)))
> dd.col<-as.dendrogram(hc)
> groups <- cutree(hc,k=5)
> color.map <- function(mol.biol) { if (mol.biol=="ALL1/AF4") 1 else 2 }
> patientcolors <- unlist(lapply(esetSel$mol.bio, color.map))
> col.patientcol<-rbind(groups,patientcolors)
> mode(col.patientcol)<-"character"
> heatmap.plus(data,ColSideColors=t(col.patientcol),cexRow=0.5)

使用heatmap.plus绘制热图

这样绘图的不足是没有热图色key值。gplots中的heatmap.2为我们解决了这个问题。而且它带来了更多的预设填充色。下面就是几个例子。

> library("gplots")
> heatmap.2(data, col=redgreen(75), scale="row", ColSideColors=patientcolors,
+            key=TRUE, symkey=FALSE, density.info="none", trace="none", cexRow=0.5)

使用heatmap.2函数,readgreen渐变色填充生成的热图

> heatmap.2(data, col=heat.colors(100), scale="row", ColSideColors=patientcolors,
+            key=TRUE, symkey=FALSE, density.info="none", trace="none", cexRow=0.5)
> heatmap.2(data, col=terrain.colors(100), scale="row", ColSideColors=patientcolors,
+            key=TRUE, symkey=FALSE, density.info="none", trace="none", cexRow=0.5)
> heatmap.2(data, col=cm.colors(100), scale="row", ColSideColors=patientcolors,
+            key=TRUE, symkey=FALSE, density.info="none", trace="none", cexRow=0.5)
> heatmap.2(data, col=redblue(100), scale="row", ColSideColors=patientcolors,
+            key=TRUE, symkey=FALSE, density.info="none", trace="none", cexRow=0.5)
> heatmap.2(data, col=colorpanel(100,low="white",high="steelblue"), scale="row", ColSideColors=patientcolors,
+            key=TRUE, keysize=1, symkey=FALSE, density.info="none", trace="none", cexRow=0.5)

使用heatmap.2函数,heat.colors渐变色填充生成的热图

使用heatmap.2函数,terrain.colors渐变色填充生成的热图

使用heatmap.2函数,cm.colors渐变色填充生成的热图

使用heatmap.2函数,redblue渐变色填充生成的热图

使用heatmap.2函数,colorpanel渐变色填充生成的热图

然而,以上的heatmap以及heatmap.2虽然方便简单,效果也很不错,可以使用colorpanel方便的设置渐变填充色,但是它的布局没有办法改变,生成的效果图显得有点呆板,不简洁。为此这里介绍如何使用ggplot2当中的geom_tile来为基因芯片绘制理想的热图。

> library(ggplot2)
> hc<-hclust(dist(data))
> rowInd<-hc$order
> hc<-hclust(dist(t(data)))
> colInd<-hc$order
> data.m<-data[rowInd,colInd] #聚类分析的作用是为了色块集中,显示效果好。如果本身就对样品有分组,基因有排序,就可以跳过这一步。
> data.m<-apply(data.m,1,rescale) #以行为基准对数据进行变换,使每一行都变成[0,1]之间的数字。变换的方法可以是scale,rescale等等,按照自己的需要来变换。
> data.m<-t(data.m) #变换以后转置了。
> coln<-colnames(data.m) 
> rown<-rownames(data.m) #保存样品及基因名称。因为geom_tile会对它们按坐标重排,所以需要使用数字把它们的序列固定下来。
> colnames(data.m)<-1:ncol(data.m)
> rownames(data.m)<-1:nrow(data.m)
> data.m<-melt(data.m) #转换数据成适合geom_tile使用的形式
> head(data.m)
  X1 X2     value
1  1  1 0.1898007
2  2  1 0.6627467
3  3  1 0.5417057
4  4  1 0.4877054
5  5  1 0.5096474
6  6  1 0.2626248
> base_size<-12 #设置默认字体大小,依照样品或者基因的多少而微变。
> (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value), #设定横坐标为以前的列,纵坐标为以前的行,填充色为转换后的数据
+      colour = "white") + scale_fill_gradient(low = "white", #设定渐变色的低值为白色,变值为钢蓝色。
+      high = "steelblue"))
> p + theme_grey(base_size = base_size) + labs(x = "", #设置xlabel及ylabel为空
+      y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) + #设置x坐标扩展部分为0,刻度为之前的样品名
+      scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) + opts( #设置y坐标扩展部分为0,刻度为之前的基因名
+      axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size *  #设置坐标字体为基准的0.8倍,贴近坐标对节,x坐标旋转90度,色彩为中灰
+      0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text(
+      size = base_size * 0.8, hjust=1, colour="grey50"))

使用ggplot2中geom_tile函数,钢蓝渐白配色的热图

也可以很轻松的实现传统渐变填充色,红黄渐变。

> (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value),
+      colour = "white") + scale_fill_gradient(low = "yellow",
+      high = "red"))
> p + theme_grey(base_size = base_size) + labs(x = "",
+      y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) +
+      scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) + opts(
+      axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size *
+      0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text(
+      size = base_size * 0.8, hjust=1, colour="grey50"))

使用ggplot2中geom_tile函数,红黄渐变填充的热图

使用红绿渐变填充。

> (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value),
+      colour = "white") + scale_fill_gradient(low = "green",
+      high = "red"))
> p + theme_grey(base_size = base_size) + labs(x = "",
+      y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) +
+      scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) + opts(
+      axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size *
+      0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text(
+      size = base_size * 0.8, hjust=1, colour="grey50"))

使用ggplot2中geom_tile函数,红绿渐变填充的热图

使用绿白渐变填充。

> (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value),
+      colour = "white") + scale_fill_gradient(low = "seagreen",
+      high = "white"))
> p + theme_grey(base_size = base_size) + labs(x = "",
+      y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) +
+      scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) + opts(
+      axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size *
+      0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text(
+      size = base_size * 0.8, hjust=1, colour="grey50"))

使用ggplot2中geom_tile函数,绿白渐变填充的热图

使用棕白渐变填充。

> (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value),
+      colour = "white") + scale_fill_gradient(low = "white",
+      high = "sienna4"))
> p + theme_grey(base_size = base_size) + labs(x = "",
+      y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) +
+      scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) + opts(
+      axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size *
+      0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text(
+      size = base_size * 0.8, hjust=1, colour="grey50"))

使用ggplot2中geom_tile函数,棕白渐变填充的热图

使用灰阶填充。

> (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value),
+      colour = "white") + scale_fill_gradient(low = "black",
+      high = "gray85"))
> p + theme_grey(base_size = base_size) + labs(x = "",
+      y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) +
+      scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) + opts(
+      axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size *
+      0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text(
+      size = base_size * 0.8, hjust=1, colour="grey50"))

使用ggplot2中geom_tile函数,灰色渐变填充的热图

除了ggplot2,还有lattice也是不错的选择。我只使用一种填充色,生成两个图,以作示例。

> hc<-hclust(dist(data))
> dd.row<-as.dendrogram(hc)
> row.ord<-order.dendrogram(dd.row) #介绍另一种获得排序的办法
> hc<-hclust(dist(t(data)))
> dd.col<-as.dendrogram(hc)
> col.ord<-order.dendrogram(dd.col)
> data.m<-data[row.ord,col.ord]
> library(ggplot2)
> data.m<-apply(data.m,1,rescale) #rescale是ggplot2当中的一个函数
> library(lattice)
> levelplot(data.m,
+           aspect = "fill",xlab="",ylab="",
+           scales = list(x = list(rot = 90, cex=0.8),y=list(cex=0.5)),
+           colorkey = list(space = "left"),col.regions = heat.colors)
> library(latticeExtra)
> levelplot(data.m,
+           aspect = "fill",xlab="",ylab="",
+           scales = list(x = list(rot = 90, cex=0.5),y=list(cex=0.4)),
+           colorkey = list(space = "left"),col.regions = heat.colors,
+           legend =
+           list(right =
+                list(fun = dendrogramGrob, #dendrogramGrob是latticeExtra中绘制树型图的一个函数
+                     args =
+                     list(x = dd.row, ord = row.ord,
+                          side = "right",
+                          size = 5)),
+                top =
+                list(fun = dendrogramGrob,
+                     args =
+                     list(x = dd.col, 
+                          side = "top",
+                          type = "triangle")))) #使用三角型构图

使用lattice中的levelplot函数,heat.colors填充绘制热图


使用lattice中的levelplot函数,heat.colors填充,dendrogramGrob绘树型,绘制热图

可是可是,绘制一个漂亮的热图这么难么?参数如此之多,设置如此复杂,色彩还需要自己指定。有没有简单到发指的函数呢?有!那就是pheatmap,全称pretty heatmaps.

> library(pheatmap)
> pheatmap(data,fontsize=9, fontsize_row=6) #最简单地直接出图
> pheatmap(data, scale = "row", clustering_distance_row = "correlation", fontsize=9, fontsize_row=6) #改变排序算法
> pheatmap(data, color = colorRampPalette(c("navy", "white", "firebrick3"))(50), fontsize=9, fontsize_row=6) #自定义颜色
> pheatmap(data, cluster_row=FALSE, fontsize=9, fontsize_row=6) #关闭按行排序
> pheatmap(data, legend = FALSE, fontsize=9, fontsize_row=6) #关闭图例
> pheatmap(data, cellwidth = 6, cellheight = 5, fontsize=9, fontsize_row=6) #设定格子的尺寸
> color.map <- function(mol.biol) { if (mol.biol=="ALL1/AF4") 1 else 2 }
> patientcolors <- unlist(lapply(esetSel$mol.bio, color.map))
> hc<-hclust(dist(t(data)))
> dd.col<-as.dendrogram(hc)
> groups <- cutree(hc,k=7)
> annotation<-data.frame(Var1=factor(patientcolors,labels=c("class1","class2")),Var2=groups)
> pheatmap(data, annotation=annotation, fontsize=9, fontsize_row=6) #为样品分组
> Var1 = c("navy", "skyblue")
> Var2 = c("snow", "steelblue")
> names(Var1) = c("class1", "class2")
> ann_colors = list(Var1 = Var1, Var2 = Var2)
> pheatmap(data, annotation=annotation, annotation_colors = ann_colors, fontsize=9, fontsize_row=6) #为分组的样品设定颜色

pheatmap最简单地直接出图


pheatmap改变排序算法


pheatmap自定义颜色


pheatmap关闭按行排序


pheatmap关闭图例


pheatmap设定格子的尺寸


pheatmap为样品分组


pheatmap为分组的样品设定颜色

173 thoughts on “R绘图基础(四)热图 heatmap

  1. Reply 小李不再探花 10月 30,2011 5:15 下午

    我最近也在学R,超级实用,收藏了。

  2. Reply Junyu 9月 2,2012 10:58 下午

    请教一个问题:

    ggplot2所作的图真是很漂亮,但缺点是,不知道x轴的样品名,是属于那个组的。请教:能不能把属于 BCR/ABL和 ALL1/AF4的样品名字,分别用不同颜色区分开来?或是像在heapmap2所绘的图,用颜色条区分不同的样本分组?

    谢谢

    • Reply admin 9月 4,2012 9:50 上午

      你可以使用facet_grid
      具体代码如下:
      gp.map <- function(mol.biol) { if (mol.biol=="ALL1/AF4") "ALL1/AF4" else "others" } gp <- unlist(lapply(esetSel$mol.bio, gp.map)) gp <- gp[colInd] data.m$gp <- gp[data.m$X2] #增加一组值用于分组 data.m$X1<-rep(rown,length(coln)) #提前对坐标值进行转换,以防使用离散坐标后不好控制 data.m$X2<-rep(coln,each=length(rown)) # (p <- ggplot(data.m, aes(X2, X1)) + geom_tile(aes(fill = value), colour = "white")+ #设定横坐标为以前的列,纵坐标为以前的行,填充色为转换后的数据 scale_fill_gradient(low = "white", high = "steelblue")+ #设定渐变色的低值为白色,变值为钢蓝色。 facet_grid(.~gp, scales="free",space="free", margins=F)+labs(x="",y="")+ #设置对x轴分组 opts(axis.ticks = theme_blank(), axis.text.x = theme_text(size = base_size * #设置坐标字体为基准的0.8倍,贴近坐标对节,x坐标旋转90度,色彩为中灰 0.8, angle = 90, hjust = 0, colour = "grey50"), axis.text.y = theme_text( size = base_size * 0.8, hjust=1, colour="grey50")) )

  3. Reply Junyu 9月 2,2012 11:00 下午

    若是有答案,请用我的email发给我。 谢谢。

  4. Reply dabai 9月 23,2012 2:40 上午

    真好,受益匪浅!!!

  5. Reply sizhong 5月 14,2013 7:33 上午

    请问:ggplot2中绘制热图,如何才能显示按行和列的聚类线或者或者只显示其中按列的聚类线?就像最后的图中的左侧和上部的聚类线?

  6. Reply chunxuan 5月 26,2013 10:10 上午

    我有个问题 , 如何实现在ggplot2 的heatmap 实现“ ColSideColors” 的效果 ?
    多谢。

  7. Reply luobohua0 6月 6,2013 10:32 下午

    很感谢你的文章,那个“简单到令人发指”的pheatmap太好用了!

  8. Reply Joe 6月 22,2013 1:47 上午

    您好!在heatmap中,尤其是pheatmap,我觉得有时呈现的结果会造成误解,比如scale设置成row,或者col只能针对这一行或者一列吧,显色上显现的变化较大,其实算到全局里,可能变化幅度就很小了?请问如何解决?即如何进行全局的标准化。
    还有一个问题,通常在做heatmap时,是用差异基因的FC呢 还是用intensity呢?谢谢

    • Reply admin 6月 22,2013 6:27 上午

      这取决于你想要表达的内容。如果你不想按照row来re-scale,你可以把这cluster_rows设置也FALSE即可。同样的,你也可以把cluster_col设置成FALSE。通常做heatmap时,我使用intensity。

  9. Reply Joe 6月 24,2013 2:03 上午

    是用每个样本的intensity呢 还是一个分组中所有样本的intensity均值

    • Reply admin 6月 24,2013 3:26 下午

      这应该由你自己决定。通常而言,会把所有样本的intensity都拿出来。但如果你的样本太多了,只取平均值也是可以的。

  10. Reply asaki 8月 12,2013 4:44 下午

    请问如何在heatmap的每格里显示value

    比如矩阵为
    1000,1001,1002,1003
    2000,2013,1098,1999

    我希望热图上带这些值的label,不知道您是否知道怎么处理?

    • Reply admin 8月 14,2013 11:15 上午

      你试一下gplot里的heatmap.2

      library("gplots")
      data(mtcars)
      x < - as.matrix(mtcars) heatmap.2(x) heatmap.2( x, Rowv=FALSE, Colv=FALSE, dendrogram='none', cellnote=x, notecol="black", trace='none', key=FALSE,lwid = c(.01,.99),lhei = c(.01,.99),margins = c(5,15 ))

  11. Reply SpreeFU 8月 18,2013 1:41 下午

    请问在用cufflinks得到RNA-seq的DE之后,有什么好办法可以依据log2FC作成整个chromosome的heatmap,并且得到基因在各个chromosome上表达的统计数据吗?

    • Reply admin 8月 19,2013 8:16 上午

      做整个基因组的heatmap,请使用circos。那个效果比较可以接受,否则,表格太大了。现在R出现OmicCircos,是circos部分功能在R中的重现,也是可以接受的。

      • Reply SpreeFU 8月 19,2013 8:36 上午

        谢谢你的回复.我看了下OmicCircos,似乎从cufflinks得到的差异表达数据不能直接用,得重新按它要求的格式编辑,另外我做的是拟南芥,reference的内容和OmicCircos要求的segment data格式也不一样。看样子我得摸索试试把数据按OmicCircos的要求重新做过,再看能在OmicCircos跑起来不。

  12. Reply boaosaisi 9月 23,2013 7:37 上午

    请问如果用heatmap.2, 如何去除右边的基因名称?

  13. Reply cong 11月 23,2013 9:08 上午

    如果想看聚类分析图上每一个分叉点变量的名称和取值,应该调节哪一个参数呢?

    • Reply admin 11月 25,2013 9:10 上午

      这个问题,我无法理解。如果你想知道每个交叉点的取值,如果你使用的是hclust的话,你只需要再次计算一下distance就可以了。比如:dist(USArrests), 你就可以得到一个dist对象,有两两的距离。

  14. Reply Miao 12月 4,2013 8:43 上午

    属于R菜鸟级别的,但是很想知道第一张灰常好看的ggplot2绘制的heatmap怎么画的(因为周末要考试==),对里面的参数不是很清楚,可以解释得更详细点么?如果不是“ALL”里面的数据而是自己的实验数据,应该怎么把数据套用到里面的程序里面呢,灰常感谢咯~

    • Reply admin 12月 4,2013 9:07 上午

      请您仔细阅读博文。博文中有如何生成第一张图的代码。谢谢。

      • Reply May 5月 6,2014 11:17 下午

        你好,按照您博文中ggplot2的代码画了一张图,很漂亮,可素却没有出现预期的样品和基因名(按照你所说的方法保存了样品和基因名),纵坐标和横坐标都是数字了。由于刚学R,还请大侠告知可能的原因以及如何更改。在此拜谢。

        • Reply admin 5月 7,2014 7:50 上午

          你试过 labs(x = “”, y = “”) + scale_x_continuous(expand = c(0, 0),labels=colname,breaks=1:length(colname)) + scale_y_continuous(expand = c(0, 0),labels=rowname,breaks=1:length(rowname)) 没?

          • Reply May 5月 9,2014 3:19 上午

            Many thanks!我试过那个code,但是总是出现Breaks and labels have unequal lengths. so….

          • Reply admin 5月 9,2014 9:38 上午

            你的colname和rowname分别是什么格式?试一下下面的代码:
            library(ggplot2)
            library(reshape2)
            data.m <- data.matrix(mtcars) coln<-colnames(data.m) rown<-rownames(data.m) colnames(data.m)<-1:ncol(data.m) rownames(data.m)<-1:nrow(data.m) data.m<-melt(data.m) p <- ggplot(data.m, aes(Var2, Var1)) p + geom_tile(aes(fill=value)) + labs(x = "", y = "") + scale_x_continuous(expand = c(0, 0),labels=coln,breaks=1:length(coln)) + scale_y_continuous(expand = c(0, 0),labels=rown,breaks=1:length(rown)) 也许你能明白怎么查找你的错误。

          • Reply May 5月 11,2014 9:28 下午

            Thanks.我找到错误了。

  15. Reply nkunku 12月 24,2013 9:49 下午

    怎样将两个heatmap图合并,即,使上下两个半三角合并为一个?
    这是用R画的两个heatmap图,分别代表不同的两个指标

    • Reply admin 12月 26,2013 9:50 上午

      我的办法就是将数据进行合并(使上下两个半三角合并为一个矩阵),而后自己将主副轴上的标记自己添加上去。这时候可能ggplot2比较好用。

  16. Reply QING 1月 3,2014 11:50 上午

    Hi, 支持楼主

  17. Reply Edwin 2月 24,2014 7:13 上午

    调用melt函数,需要事先载入reshape库么?
    原文代码中没有提及此库。

  18. Reply Edwin 2月 28,2014 8:19 上午

    请在示范代码补充

  19. Reply langong 3月 26,2014 7:42 上午

    你好,我用C做完了数据处理,得到了相关性矩阵数据,现在要显示热度图,我发现热度图的颜色很不好调,请问能把问题给你发邮件吗?谢谢!

  20. Reply langong 3月 26,2014 8:58 下午

    我这里有些包会无法安装,比如“package ‘limma’ is not available (for R version 3.1.0 alpha)”,所以就无法走通你的例程。另外,我跟着你的这个帖子学,比如第一个图,发现其实你显示热度图的程序很简单,但是你对显示的数据有要求,也就是前面的程序都是对数据按照你心里的理想数据在做处理,而这个过程只看程序,没有对应的处理目的说明是很难体会到要做什么的,特别是对于读者来说,应该有很多人跟着你这个教程做例程,不一定能走通,走通了也不一定能明白具体细节是怎么回事,更不用说自己拿来做事情,所以我希望能有更详细的说明,谢谢!

    • Reply admin 3月 27,2014 11:42 上午

      limma是bioconductor的包,不是R包。你可以使用source(“http://bioconductor.org/biocLite.R”); biocLite(“limma”)来安装limma包。对于教程中数据源的问题,我会改进。

  21. Reply langong 3月 26,2014 9:27 下午

    还有,你这个例程,每一个图的程序都是要用到前面的变量,这样,前面的例程只要有一个问题,有一个地方没走通,后面的就全部没法学了

  22. Reply langong 3月 26,2014 10:13 下午

    我现在要做一个heatmap,100*100的矩阵(矩阵大小会变动),矩阵元素大小从0到30000左右(为了有更好的heatmap区分效果,可以采用取对数等方法),请问有什么好的显示heatmap方法,我现在的效果很不好,谢谢!

  23. Reply langong 3月 27,2014 7:52 下午

    使用对数值也纯在问题,以log2(X)为例log2(50)=5.…,log2(1000)=10,这样的区分度有点失真,特别是热度显示。

    • Reply admin 3月 31,2014 9:51 上午

      其实,这主要取决于你想如何区分数据。如果你不想有任何损失的话,想想两个颜色变换就会有256*256种,足以区分65536种颜色,但显示器的色彩分辨力,印刷的色彩分辨力以及人肉眼的色彩分辨力和这个数字完全是不同的概念。查看colorRampPalette函数,它可以返回一个函数,这个函数接受一个整数值,决定返回颜色值的个数。如果你想区分30000种数值,完全可以使用colorRampPalette(colors, …)(30000)来获得一个长度为30000的颜色矢量。但是,你是否肉眼可以分辨,就是另一回事儿了。

  24. Reply langong 4月 2,2014 12:15 上午

    谢谢你, 我想问一下,在http://www.biostatistic.net/thread-12084-1-1.html中有heatmap_2函数,这个函数是在Heatplus包中,为什么我这里无法安装这个包。

  25. Reply langong 4月 3,2014 8:10 下午

    你好,我现在在调试colorpanel,我想查询,colorpanel能识别的基本颜色都有什么,这样,我可以用这些基本颜色调出更加有区分度的heatmap,我现在知道可以设置为blue,white,red,yellow,green,black,steelblue,还有其他的什么,最好是有一个函数colorpanel能识别的颜色查询库,谢谢!

  26. Reply rainboy3529 4月 19,2014 11:10 下午

    在heatmap.2中可以调整color key,使其按照对数数值简便吗?比如0-0.01-0.1-1-10

  27. Reply topmit 6月 2,2014 8:43 下午

    亲爱的博主,您好!

    我有个对我来说是big的问题想请教您。是关于heatmap的

    我总共有8个条件,每个条件都监测了8天的数据,监测的是每个条件下38种化合物的含量。这样来看,我有8*8*38个数据。热点图中主要是想展示化合物含量的变化情况,如果是一个条件下的,可以做每个物质8天的含量变化。但是现在是有8个条件。我就不知道怎么处理了。

    请问,这些所有的数据,能在一张heatmap图上展示吗?

    期待您的回复。谢谢!

    • Reply admin 6月 3,2014 8:10 上午

      可以。你自己设计一下就好了。原则是最需要比较的放得最近。最简单的你可以使用38个8*8的heatmap拼成一张图。至于38怎么分,可以5*8。自己想想办法。你还可以插入一些空值来提供空格。

  28. Reply weihuang 6月 10,2014 4:31 下午

    > source(“http://Bioconductor.org/biocLite.R”)
    > BiocLite(“pheatmap”)
    > library(pheatmap)
    错误于library(pheatmap) : 不存在叫‘pheatmap’这个名字的程辑包
    请问为什么

  29. Reply ginsea 6月 25,2014 7:53 下午

    您好,我现在有一个特定的基因,我想知道他在拟南芥不同组织中的一个表达热图,请问这个我该如何操作呢?另外我看到网上好多关于ALL数据的分析,但是这个如何和我们实际的数据相结合呢?我是R初学者,一些问题不专业还请见谅

    • Reply admin 6月 26,2014 6:15 上午

      如果只是一个基因的话,使用热图是否正确还需要讨论。如果你一定要使用热图的话,你只需要将不同组织中该基因的表达值收集完全,然后按教程操作即可。

  30. Reply liu 7月 4,2014 8:13 上午

    楼主你好,我在运行时出现 Discrete value supplied to continuous scale 错误,不知道这是什么原因造成的希望楼主帮忙解决。谢谢!

    • Reply admin 7月 7,2014 8:26 上午

      提示应该是比较清楚的,很可能是坐标设置错误。但是我无法重复你的错误。我的代码:
      > library(ggplot2)
      > a2 < - data.frame(x1=c(1,2,3), x2=c(1,1,1), value=c(0,3,5)) > a2
      x1 x2 value
      1 1 1 0
      2 2 1 3
      3 3 1 5
      > p < - ggplot(a2, aes(a2[,2],a2[,1])) + geom_tile(aes(fill = value), colour ="white")+scale_fill_gradient(low = "white", high = "red")+labs(x = "",y = "") > p

  31. Reply liu 7月 4,2014 8:20 上午

    p <- ggplot(a2, aes(a2[,2],a2[,1])) + geom_tile(aes(fill = value), colour =

    "white")+scale_fill_gradient(low = "white", high = "red")+labs(x = "",y = "")
    #a2为 x1 x2 value
    1 1 0
    2 1 3
    3 1 5
    这样的结构

  32. Reply arker 7月 11,2014 4:39 上午

    版主你好,看了你的介绍以后获益匪浅,现在开始改用pheatmap了!我想加一个color bar在heatmap上,显示我的不同condition的基因,而且cluster以后每个condition的颜色还是对应原来的gene,我原来在heatmap.2里实现过,pheatmap里还没太搞清楚;我的数据例子如下:
    十分感谢!!
    data format: https://www.dropbox.com/s/qc8zjpgcimo71mu/sample.jpg

    • Reply admin 7月 11,2014 1:04 下午

      首先,pheatmap的color bar只能加在列的上方,不能加在行的左边。annotation必须是data.frame,data.frame中每一列必须是factor,每一行对应着一个样品列。ann_colors是与annotation对应的list,list中的元素是颜色,颜色以对应的annotation的factor的levels为名称。比如:
      library(pheatmap)
      a2 <- data.frame(y1=c(1,2,3), y2=c(3,2,1), y3=c(2,1,3), y4=c(3,1,2)) rownames(a2) <- letters[1:3] annotation <- data.frame(gp1=c("f1", "f1", "f2", "f3"), gp2=c("g2", "g1", "g3", "g2")) rownames(annotation) <- colnames(a2) gp1_col <- c("blue", "red", "green") names(gp1_col) <- levels(as.factor(annotation$gp1)) gp2_col <- c("yellow", "brown", "pink") names(gp2_col) <- levels(as.factor(annotation$gp2)) ann_colors <- list(gp1=gp1_col, gp2=gp2_col) pheatmap(a2, annotation=annotation, annotation_colors=ann_colors)

  33. Reply arker 7月 16,2014 1:29 下午

    多谢版主,最近比较忙没过来看,好的,我试试看,有问题再请教 ;-)

  34. Reply ssybbc 7月 16,2014 5:32 下午

    版主,你好!
    请问pheatmap在颜色选择上,比如蓝-白-红色系,能否人为设定白色代表的log2(foldchange)为0?我的数据中foldchange并不对称(-4到+2),能否人为设定颜色为对称表示?求解答。

    • Reply admin 7月 16,2014 9:19 下午

      完全可以。你只需要自己设置颜色的时候给定一个不平衡的值就好了。比如:
      library(pheatmap)
      a2 <- data.frame(y1=c(1,2,-1), y2=c(-3,2,1), y3=c(2,-1,-3), y4=c(-4,1,-2)) color <- c(colorRampPalette(c("green", "white"))(40), colorRampPalette(c("white", "red"))(20)) pheatmap(a2, color=color)

  35. Reply biogg 7月 29,2014 5:41 上午

    博主,您好,看了你的文章,很想用ggplot2的geom_tile来画图,但是我看您给的例子里面,这种方法给的图,左侧和上册没有聚类的分支,请问这个要怎么加上去呢?多谢!

  36. Reply biogg 7月 30,2014 12:43 上午

    谢谢啊,昨天晚上研究了下,还是不知道要怎么加,等你的消息^ ^

  37. Reply zhang 7月 31,2014 6:07 上午

    博主你好 最近我也在尝试做heatmap 博主的代码对我帮助很大

    现在有些疑问不知博主可否解答

    上图中class1,class2是通过聚类形成的还是本身样本就已经分类了
    我现在有一系列样本,按照医学指标分好类了,但是一旦画成热图就把本身分好的类别打散了,只有关闭col排序才可以形成图上class1,class2的情况

    怎么才能做到不关闭排序,并且聚类结果是按照分组进行的热图呢

  38. Reply zhang 7月 31,2014 6:28 上午

    谢谢博主 我还有几个疑问 初学者问题比较多见谅哈

    1.就上述问题而言,关闭列的排序达到的结果图,在每个分类里边可不可以进行一次排序,如何做到

    2当样本数比较多的时候,博主说多次heatmap之后拼起来,不知道具体是怎么拼,是在R里边,还是photo shop拼起来,R的话有相应代码或者r包可以学习么

    3我大概有四百多例样本,十几个指标,分5次做heatmap的话,怎么划分样本最好,以我的理解是将所有的样本cluster后,cutree(k=5)时记下样本编号,按照编号抽离出样本依次作图之后拼接起来。不知道我的理解是否正确?

    • Reply admin 8月 1,2014 7:54 上午

      首先,400样品并不算多,这种情况对于heatmap最合适。对于拼图的问题,你可以使用illustrator拼,也可以使用R拼,自己习惯使用什么就用什么。如果你的样品本身有大的分类不能改变,但是每个大分类内部需要进行排序,我觉得可以先使用cluster对每个大类进行排序后再cbind起来,做heatmap图只对row做cluster。之后再对列绘制cluster的图。有些时候你也可以玩一玩cluster。很多参数都可以改变最后的结果。但是因为heatmap大多整合了cluster方法,所以最简单的办法还是拼图。

  39. Reply zhang 8月 1,2014 2:39 上午

    博主 求指点

  40. Reply biogg 8月 13,2014 9:12 下午

    看了这篇博文,很受用。但我一直有个很简单的问题不能理解,以至于我看了这些例子之后还不能真正掌握这些作图方法。
    以heatmap.2为例,我看到的是输入文件的形式是:每行为一个基因,列为该基因在不同样品中的表达量。我所理解heatmap.2的原理,根据表达量聚类后作热图。
    但我不明白的是colorkey的值是怎么得到的呢?是对表达量取了对数吗?如果是这样,那么基因在不同样品间的表达差异是怎么体现的呢?问题感觉太浅显,希望博主能提点下^^.

  41. Reply biogg 8月 13,2014 10:36 下午

    刚刚想通了这个问题,文章中的例子输入的是基因表达量,使用表达量做聚类。
    colorkey给出的是每个基因的表达量按行做了Z-score标准化。热图中没有反应出差异表达基因在不同样品间的差异倍数。如果想知道这个信息,需要用差异倍数来做热图。

  42. Reply hh 9月 24,2014 6:00 上午

    > head(data.m)
    Var1 Var2 value
    1 1 1 0.1898007
    2 2 1 0.6627467
    3 3 1 0.5417057
    4 4 1 0.4877054
    5 5 1 0.5096474
    6 6 1 0.2626248
    > base_size (p (p <- ggplot(data.m, aes(Var2, Var1)) + geom_tile(aes(fill = value),
    + colour = "white") + scale_fill_gradient(low = "white",
    + high = "steelblue"))
    错误于as.environment(x) : as.environment的对象不对

    想问下怎么改

    • Reply admin 9月 24,2014 9:20 下午

      您贴下来的代码可能有错误,请更正后再贴一遍,如果还是不行,可能是因为其中有<符号,请使用& lt;来代替小于号(去除中间的空隔)。

  43. Reply skyblood 10月 18,2014 11:17 下午

    博主,你好!
    根据你所贴出的代码,我第一次学会了在R中绘制热图中的多种方法,但我现在不仅想实现在列向上显示样品聚类分组的color bar,而且在横向上显示各个基因或者蛋白质分组的color bar,你提到heatmap不能实现行分组的color bar,那有其他函数可以实现此目的吗?谢谢你。

  44. Reply fan 10月 18,2014 11:22 下午

    博主你好!
    非常感谢你对R绘制热图各种方法的分享,我现在希望能够实现不仅在列向上显示不同样品聚类分组的colorbar而且要显示横向上的各个基因或者蛋白质聚类分组的colorbar。按照问答环节你所说的,heatmap不能实现此目的,那请问哪个函数可以实现此目的,具体的代码大致是什么呢?谢谢你。

    • Reply admin 10月 24,2014 8:23 上午

      对不起,我必须纠正我的一个错误,那就是heatmap.2完全可以做到对行和列分别标定colorbar。
      示例代码:
      library(gplots)
      data(mtcars)
      x < - as.matrix(mtcars) rc <- rainbow(nrow(x), start=0, end=.3) cc <- rainbow(ncol(x), start=0, end=.3) whiteBin <- unlist(hv$colorTable[hv$colorTable[,"color"]=="#FFFFFF",1:2]) 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(, …, scale=\”column\”)”,
      tracecol=”green”, density=”density”)

  45. Reply fan 10月 19,2014 9:21 下午

    版主,您好。请问,利用R如何能够实现树状图分组的颜色标记,此颜色标记的是树状图的树枝上。

  46. Reply fan 10月 20,2014 7:29 下午

    谢谢版主的回答,我用heatmap.2的参数ColSideColors和RowSideColors可以调节控制聚类分组颜色。目前在聚类图的参数设置上有另外两个问题还没有解决,1,如何调节keybar的高度?在输出的pdf文件中,图中左上角keybar高度非常高;2,如何调节热图中的各个单元格的大小?

    • Reply admin 10月 24,2014 8:31 上午

      不好意思,我才看到你的回复。的确你说的是正确的。我很久没有更新我的知识了。
      关于问题1:你可以使用keysize来调整,但是这个需要多次尝试,并不是每一次将它调小了都能成功。我试了几次,比如:
      hv < - heatmap.2(x, col=cm.colors(255), scale="column", RowSideColors=rc, ColSideColors=cc, margin=c(5, 5), xlab="specification variables", ylab= "Car Models", main="heatmap(, …, scale=\”column\”)”,
      tracecol=”green”, density=”density”, keysize=1)
      就可以成功。这个就是需要多试。注意同时调整margin, par中的margin, 以及text有大小。
      关于问题2,其实有很多办法,比如设定图纸的大小,设定边框的大小,总之就是调整绘图区的大小。

  47. Reply Ying 10月 22,2014 1:36 上午

    博主,pheatmap如果是其他文件,怎样给样品分组呢,比如说9个control,34个tumor,要另外创建一个分组文件吗

    • Reply admin 10月 24,2014 8:45 上午

      不需要。heatmap的输入大多都是matrix或者dataframe。对于分组,传一个list就好了。你多跑跑例子,了解每一个参数需要时间。

  48. Reply fan 10月 26,2014 7:49 下午

    谢谢您的及时回复,我在尝试调整聚类中的类之间的连接方式时,如何能保证聚类分组颜色设定和所使用的聚类树的方式是一致的。具体来说,我通过hclust函数先预先设定颜色分组rowgroups和colgroups,这个是通过平均距离获得的组连接方式下的分类,然后其分别赋值给heatmap.2中RowSideColors和ColSideColors,但此时heatmap.2绘制聚类树的采取的聚类法是hclust,默认是complete连接方式,这样就会造成分组颜色和分类树显示的分类是不一致的,因此第一个问题,请问此处我应如何修改hclustfun参数,改变类之间的连接方式?第二个问题,我要是想改变聚类图中的距离计算方式,我应如何修改heatmap.2中distfun参数?
    主要代码:
    y=read.table(“Summary.txt”,header=TRUE)
    mat=data.matrix(log2(y))
    hc=hclust(dist((mat)),method=”ave”)###此处采用的平均距离
    rowgroups=cutree(hc,k=4) ###生成聚类组
    hc1=hclust(dist(t(mat)),method=”ave”)
    colgroups=cutree(hc1,k=2)
    mode(rowgroups)<-"character"
    mode(colgroups)<-"character"
    heatmap.2(mat,distfun=dist,hclustfun=hclust,col=redgreen(75),RowSideColors=rowgroups,sepwidth=c(10,0.2), ColSideColors=colgroups)

    • Reply admin 10月 27,2014 8:08 上午

      暂时没有很好的办法。有两种解决方案,一种你对heatmap.2的原代码做出修改,将hclust的参数传进去,这种方式比较简单直接。一种就是你重新包装一下hclust函数,比如说写一个名为hclust_patch的函数,依照自己的数据,判断一下是对行进行cluster还是对列进行cluster,选择自己需要的参数。最后将这个函数以hclustfun传入heatmap.2。

  49. Reply sam 10月 26,2014 10:29 下午

    data.m<-apply(data.m,1,rescale)
    Error in match.fun(FUN) : object 'rescale' not found
    请问楼主,这是什么意思

Leave a Reply

  

  

  

%d 博主赞过: