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

我们在分析了差异表达数据之后,经常要生成一种直观图--热图(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为分组的样品设定颜色

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

  1. Reply WeijianRao 10月 28,2014 11:55 下午

    你好。
    请问应该如何才能对聚类的基因进行分割呢。比如按染色体顺序,在整个热图上把画一条线来分开。

    如这篇文章的fig.1c

  2. Reply fan 10月 30,2014 3:23 上午

    博主你好,请问在使用heatmap.2时如何能保证对样品和基因都进行聚类的同时,在右侧不再显示各个基因名称,由于基因名太多,在一定的版面设计下,不能容纳那么多的基因名,所以为了整体图的展示,想要去掉右侧对应每行的基因名。

  3. Reply fan 10月 30,2014 9:37 下午

    请问博主,如何改变热图的值的大小与颜色深度的对应关系,并改变keybar所显示的坐标。

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

      可以使用heatmap.2中的col参数。这个参数你可以手动地给一些颜色,heatmap.2只是将其机械地平均分配给取值范围。
      关于key.bar的位置,可以通过lhei, 以及lwid来调整。你会发现heatmap.2将图分割成了六部分,左上为color key,中上为column cluster,左下为row cluster, 中下为heatmap, 右下为rownames。所以你可以试着
      lhei <- c(.5, 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", lhei=lhei)

  4. Reply fan 11月 18,2014 8:14 下午

    博主你好,我现在有一组100行1列的数据,无论是用pheatmap还是heatmap.2绘制聚类图,都会提示我要满足n>=2,但是我只是想对这组数据行进行聚类,我应该选用什么函数或者改变什么参数?

  5. Reply fanfan 11月 20,2014 9:10 下午

    博主您好,我想通过heatmap.2绘制热图和聚类图,列向为样品聚类,横向为蛋白质聚类,但是在数据排序中,希望聚类时考虑到第一个样品的蛋白质含量来进行排序,希望达到的效果是尽量满足每一个组内是按照第一个样本的蛋白质的含量从上向下排,组与组之间从上到下,上面组的蛋白质含量要比下面组的蛋白质含量高,不知道是否有方法实现此目的,谢谢您。

    • Reply admin 11月 21,2014 8:55 上午

      我很难理解你的问题。从你的描述来看,我觉得你可以关闭组之间的cluster,自己先把样品顺序排好了,再画heatmap.

  6. Reply aure 12月 9,2014 8:23 上午

    请问博主,如何为pairwise矩阵(如下所示)做heatmap呢?如果只用右上或左下三角做heatmap代码改如何写?全部数据都用呢?谢谢

    a b c
    a 0 1.65E-24 3.52E-53
    b 1.65E-24 0 3.51E-13
    c 3.52E-53 3.51E-13 0

    • Reply admin 12月 9,2014 9:26 上午

      我想到的快速办法就是使用NA来覆盖上或下三角。

      • Reply aure 12月 15,2014 9:47 上午

        麻烦博主能给个code学习下吗?(pairwise矩阵做heat map)。R的初学者,不是报错就是出图很难看,谢谢

        • Reply admin 12月 17,2014 3:09 下午
          > data < - data.frame(matrix(1:16, nrow=4), row.names=letters[1:4])
          > colnames(data) < - rownames(data)
          > for(i in 1:4) for(j in i:4) data[i,j] < - data[j,i]
          > for(i in 1:4) data[i,i] < - 0
          > data
            a b  c  d
          a 0 2  3  4
          b 2 0  7  8
          c 3 7  0 12
          d 4 8 12  0
          > library(pheatmap)
          > pheatmap(data, cluster_rows=F, cluster_cols=F)
          > for(i in 1:3) for(j in (i+1):4) data[i,j] < - NA
          > data
            a  b  c  d
          a 0 NA NA NA
          b 2  0 NA NA
          c 3  7  0 NA
          d 4  8 12  0
          > pheatmap(data, cluster_rows=F, cluster_cols=F)
          > pheatmap(data, cluster_rows=F, cluster_cols=F, border_color=NA)
          > data < - t(data)
          > data
             a  b  c  d
          a  0  2  3  4
          b NA  0  7  8
          c NA NA  0 12
          d NA NA NA  0
          > pheatmap(data, cluster_rows=F, cluster_cols=F, border_color=NA)
          
          
  7. Reply Ding 12月 11,2014 8:00 上午

    我用gplots 的heatmap2 做3万多个基因的热图,总是出现这个问题:cannot allocate vector of length 797302278 怎么解决呢

  8. Reply long 12月 17,2014 1:38 上午

    博主,你好!我想请问一下,用pheatmap做热图时,我想聚类,但不要那个聚类树,该怎么做?

  9. Reply Aure 12月 18,2014 11:38 上午

    多谢博主。还有个问题,我的pairwise矩阵的值很小,e-20, 貌似导致legend bar无法正常显示,做的图也没明显的颜色差别。但是我又不想转换成log值,pheatmap参数应该怎么设置呢?另外我想自己设定legend bar的阈值范围,譬如>e-2, <e-2,<e-3,<e-4,<e-5等,该如何设置呢?谢谢

    • Reply admin 12月 19,2014 2:43 下午

      完全可以,你可以通过设置colorRampPalette来达到目的,比如使用多个colorRampPalette,然后再使用c()把它们合并起来。或者你对你的值进行对数转换,然后再绘图。

  10. Reply funnybomb 12月 19,2014 10:56 上午

    请问,pheatmap 中 我想修改 legend的位置如何办?
    还有如何修改annotation中的文字顺序,比如你的例子中原来是class1,class2
    我想显示为class2,class1,或者按照factor的levels显示,可行吗?
    或者在annotation的上方直接标注文字该如何?
    感谢!

    • Reply admin 12月 19,2014 4:12 下午

      显示annotation的顺序,你可以试着调整factor中level的顺序就应该可以。但是legend的位置,我可是无能为力了。
      还有一个办法是输出为pdf文件后再使用acrobat illustrator来改。

  11. Reply mocomoco 1月 30,2015 7:39 上午

    博主好,新手一个,想问下博主,我是pairwise矩阵数据,用了博主ggplot的编码,然后出现了Error: Discrete value supplied to continuous scale,请求帮助!!!

  12. Reply Xiaofei Yang 2月 9,2015 9:52 下午

    作者您好,我想画一个上下三角的热图,看了您的回复,说可以将两个上下三角的热图合并。但是我没有找到怎么绘制一个上三角或下三角的热图的命令?期待您的回复。

  13. Reply qmoon 3月 3,2015 1:39 上午

    请问博主,使用pheatmap做热图如何更改x轴标签的角度?

  14. Reply ybliu 6月 4,2015 1:02 上午

    博主,ggplot2 用geom_tile 作 heatmap 时,怎么才能让方格呈现是小正方形?横纵坐标数不同,烦恼好久了,而且因为ggplot2 的版本不同,也不好直接尝试你的代码了

  15. Reply cacique 11月 24,2015 5:53 上午

    博主你好 我在用pheatmap做图时想改变区间的颜色设置应该怎么弄? 例如我想要1-100是红色 然后0-0.5是蓝色这样子。 谢谢!

    • Reply admin 11月 24,2015 9:55 上午

      pheatmap有一个参数叫breaks可以满足你的要求。比如代码:
      library(pheatmap)
      test = matrix(rnorm(200), 20, 10)
      test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3
      test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2
      test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4
      colnames(test) = paste("Test", 1:10, sep = "")
      rownames(test) = paste("Gene", 1:20, sep = "")
      pheatmap(test, color=c("blue", "red"), breaks=c(min(test), 0.5, max(test)))

  16. Reply 12月 10,2015 7:53 上午

    楼主,我是r新手,做heatmap的时候遇到了问题想请教一下。
    我不是基因表达的数据,是其他数据,数据只有0,1,2,3,4,共计五个水平。想用heatmap的不同颜色表示这五个水平。和你的数据不同的是我这里不是连续数值,所以渐变色,是固定的五个颜色,比如白色,浅灰,深灰,黑色等等。。。这种用r做的话应该怎么做呢。。。要带color key的。。
    麻烦了!!

    • Reply admin 12月 10,2015 4:51 下午

      您可以试试使用pheatmap, 会非常简单。比如如下代码:

      library(pheatmap)
      test = matrix(rnorm(200), 20, 10)
      test = matrix(sample.int(5, 200, replace=TRUE), 20, 10)
      test < - test - 1
      colnames(test) = paste("Test", 1:10, sep = "")
      rownames(test) = paste("Gene", 1:20, sep = "")
      pheatmap(test, color=c("red", "green", "blue", "cyan", "brown"), breaks=c(0:5)-.5)
      
  17. Reply pydsn88 3月 1,2016 4:20 上午

    您好,楼主,我是一个彻彻底底的初学者,最近需要做很多heatmap, 我在套用您的pheatmap的代码时,写到“annotation<-data.frame(Var1=factor(patientcolors,labels=c("class1","class2")),Var2=groups)”的时候 下面显示“Error in data.frame(Var1 = factor(patientcolors, labels = c("class1", :
    参数值意味着不同的行数: 47, 4“。。该怎么调整呢。。。。。。我的数据是一个4行4列的结构

  18. Reply JasonKim 4月 19,2016 9:16 上午

    你好,如果我想固定横坐标的位置,并且纵轴基因还要聚在一起,应该如何实现呢?

    • Reply admin 4月 19,2016 9:27 上午

      如果你的问题是如何只对纵轴进行cluster的话,那你可以试试类似pheatmap的cluster_rows=FALSE;heatmap,heatmap.2以及heatmap.plus的Colv=NA;

  19. Reply Candice.yimu 5月 4,2016 1:37 上午

    博主您好,我在使用ggplot2绘制heat map时,
    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”))
    该代码始终显示无opts函数。待调整为Opts后,又提示无theme_text函数。选用了element_text函数后又显示为opts.default。但是并未达到我填充横坐标的目的。请问,应该选用什么样的代码进行改进?

    • Reply admin 5月 17,2016 6:14 上午

      这是因为opts已经被放弃了,请使用theme来代替。theme_xx的函数请使用element_xx来代替,比如theme_text请使用element_text。

  20. Reply Candice.yimu 5月 4,2016 4:17 上午

    博主,你好,我在学习你提供的ggplot2绘制heatmap的过程中,不是很理解
    data.m <- apply(data.m,1,rescale)的作用,我发现在进行这个转换后row name都消失了,这样我在最后无法label基因名称。不是很理解。可以帮我解答一下吗?

    • Reply admin 5月 4,2016 9:24 上午

      你也可以不做这一步。这一步的意义在于,如果数值范围差别太大的话,最后产生的热图颜色值会向一种颜色集中。

  21. Reply JasonKim 6月 22,2016 3:09 上午

    你好,我之前用pheatmap画了一张比较合适的热图,我现在想将纵轴聚到一起的基因分成若干group,并且要知道每个group里的基因ID,请问有什么软件比较好实现?

  22. Reply 小花 7月 10,2016 11:07 下午

    博主,你好,我的数据有几个值偏高,4.24左右,但大部分数据都是<=2的值,生成出来的热图偏白,我用的是pheatmap作的图,应该怎么解决呢?谢谢!

    • Reply admin 7月 11,2016 10:00 上午

      请体会以下代码:
      library(pheatmap)
      test = matrix(sample.int(5, 200, replace=TRUE), 20, 10)
      test[sample(200, 5)] < - 100 colnames(test) = paste("Test", 1:10, sep = "") rownames(test) = paste("Gene", 1:20, sep = "") pheatmap(test, color=colorRampPalette(c("green", "black", "red"))(6), breaks=c((0:5)-.5, 101))

  23. Reply Jane 8月 15,2016 5:45 上午

    博主你好!用来heatmap.2对数据分别进行样品聚类和有孔虫种类聚类,但没办法同时进行,Q型聚出来时,R型就不行;R型能聚时,Q型就不行。请问该怎么解决?

  24. Reply ae 10月 13,2016 8:36 上午

    请教楼主一个问题,我想实现对照组和处理组的组内的样品聚类组间不聚类,基因实现上调的基因和下先调的基因分别单独聚类然后再聚到一块儿,请问怎么实现?谢谢

    • Reply admin 10月 13,2016 2:57 下午

      没能明白您的问题。你的意思是现在有的算法出来的结果没有一个是你想要的,所以你要先分组聚类一下,然后聚类好的结果拼在一起?

  25. Reply 浅浅 10月 17,2016 8:30 下午

    您好博主,我是初学者,还是想问下这个算法问题,我想改变它的标准化算法(不知道默认的是什么算法?)也就是从芯片结果来的数据我想用Median Center 或者其他标准化算法(我尝试过clustering_method = “Median”但是好像没有任何改变,而却和我用其他软件相同算法得到的结果完全不一样)。然后后面的聚类方法我知道可以调整欧氏距离,correlation等。这个问题很困扰我。感谢帮助。

  26. Reply kainbykain 10月 19,2016 10:57 上午

    博主你好,我是萌新,我有一个数据如下
    Symbol p53s_svsWT 9B1vsWT G3_3vsWT G1_3vsWT G5_2vsWT G3_2vsWT G1_2vsWT
    Aldh1a7 -4.2159 -4.3323 -4.4237 -6.6921 -1.8665 -2.3748 -2.4946
    Cobl -2.9233 -1.7885 -3.8384 -4.2456 -2.2089 -3.0172 -2.7454
    Ngf -1.9121 -2.1857 -2.7835 -4.0677 -2.4026 -2.3534 -2.8909

    在我使用pheatmap时候,我的代码如下
    data<-read.csv("4of6.csv", header=TRUE, row.name=1)
    pheatmap(data, legend_breaks= -6:1,legend=TRUE, legend_labels = c("-6","-5","-4","-3","-2","-1","0","1"), cellwidth = 20, cellheight = 20, fontsize = 15,filename = "46.pdf")

    但是,legend并没有如我代码中设计的一样显示出来,只显示了从-6到-2,并不显示0和1.
    请问这个问题出在哪里?

    谢谢博主解答!

    • Reply admin 10月 26,2016 9:03 上午

      试试: library(RColorBrewer); pheatmap(data, color = colorRampPalette(rev(brewer.pal(n = 7, name =”RdYlBu”)))(80), breaks=seq(-6, 1, .1),legend=TRUE, cellwidth = 20, cellheight = 20, fontsize = 15, filename = “46.pdf”)

  27. Reply pxhhappy 10月 25,2016 8:14 上午

    博主,您好!
    请问您是如何将两个pheatmap图合并到一起的?谢谢!

  28. Pingback: Using R to draw Heatmap | Gene

  29. Reply wahaha 3月 15,2017 10:58 下午

    博主,请问,我的行名在图里显示不全怎么办?修改了字体大小没什么变化

  30. Reply Chenxi Xiang 11月 10,2017 3:26 上午

    大神,我想问下我的样品有超过两个分组用什么函数赋值呢,你例子中的if else函数貌似只能赋值给两种样品啊。

    • Reply admin 11月 10,2017 1:26 下午

      可以有很多种方式啊,比如说hash表啊,map啊。下面是示例代码:

      color.map < - function(mol.biol) { c("group1"="#FF0000", "group2"="#0000FF")[mol.biol] }

      color.map < - switch(mol.biol, group1="#FF0000", group2="#0000FF")

Leave a Reply

  

  

  

%d 博主赞过: