R如何在heatmap.2中的列上方构建有角度的列标题:将(文本)绘图传递给布局?

时间:2013-06-14 21:48:45

标签: r layout heatmap

我非常接近我想要的热图,但是我已经挣扎了好几天来弄清楚标题问题。我希望每列顶部有角度标题(例如45或50度)。我已经压缩了树形图(对于列和行),并使用矩阵的第一列(深度)作为行的标签。

从我在这个问题上的许多搜索中,我看到mtext对我没有帮助,因为文本无法在mtext中旋转。然后我想我可以用文字来做,但是列标签被覆盖到热图本身上;当单词到达热图布局空间的边缘时,它们会“消失”(被遮盖)。所以我检查了热图所使用的布局(非常感谢@Ian Sudbery),我发现我真正需要的是我的列标题布局中的专用空间。我可以使用布局功能分配该空间,我在下面的代码中已经这样做了。但我认为下一步可能涉及到热图2代码。 Heatmap.2调用四个图(我已经抑制了两个图,树形图)。如何让它成为第五个情节?如果可能的话,我怎么告诉它我想用文本作为我的第五个“情节”,文本是我的列标题,旋转50度?

非常感谢任何想法。请原谅我在下面的代码中提供样本数据的笨拙方式;我是R的新手,一般不知道做大多数事情最优雅的方式。

par(oma=c(0.5,0.5,.5,0.5))  # outer margins of whole figure

lmat = rbind(c(3,5,5),c(2,1,1),c(0,4,0))
lwid = c(.08,.9, .1)
lhei = c(1,4,1.5)

Depth<-c("0m","20m","40m","60m","80m","100m")
Sept2008<-c(3,6,8,10,15,16)
March2010<-c(10,12,11,13,12,11)
Sept2010<-c(5,6,NA,8,11,13)
March2011<-c(4,6,10,NA,14,14)
Sept2011<-c(2,5,3,9,16,12)

heatmap_frame=data.frame(Depth=Depth,Sept2008=Sept2008,March2010=March2010,Sept2010=Sept2010, March2011=March2011, Sept2011=Sept2011)
row.names(heatmap_frame)<-heatmap_frame$Depth
heatmap_frame<-heatmap_frame[,-1]
heatmap_matrix <- as.matrix(heatmap_frame)

labCol=c("Sept 2008","March 2010","Sept 2010","March 2011","Sept 2011")
cexCol=1.1

heatmap <- heatmap.2(heatmap_matrix, dendrogram="none", trace="none",Rowv=NA, Colv=NA, 
                 col = brewer.pal(9,"Blues"), scale="none", margins=c(2,5),labCol="",
                 lmat=lmat, lwid=lwid,lhei=lhei, density.info="none",key=TRUE)

# want to plot a fifth area, to use for col labels
# don't know how to pass a text line to the heatmap.2/layout/matrix to print as my fifth plot

mtext("Use for main title", side=3,outer=F,line=2.75, font=2, cex=1.25)

# testing the text function; did not work as desired
#text(x=1, y=1, labels="Label_1",xpd=T)
text(x=c(0,.2,.4,.6,.8), y=0.95, pos=3, srt=50, labels=labCol,xpd=T, cex=1)

1 个答案:

答案 0 :(得分:2)

这是一个并不涉及拆分heatmap.2的错综复杂代码的黑客行为:

  pos2 <- locator() #will return plotting coordinates after doing this:
  # Shift focus to the graphics window by clicking on an edge 
  # Left-Click once where you want the first label to be centered
  # Left-click again on the point where you want the last label centered
  # Right-Click, then return focus to the console session window

 pos2 <- structure(list(x = c(0.27149971320082, 0.858971646016485), 
                        y = c(0.861365598392473, 0.857450478257082)),
                       .Names = c("x", "y"))

  text(x=seq(pos2$x[1], pos2$x[2], len=5), y=rep(pos2$y[1],5)  ,
       srt=50, xpd=TRUE, adj = 0,
       labels=c("Sept 2008","March 2010","Sept 2010",
                "March 2011","Sept 2011") )

我不知道你是否确实需要xpd,因为看起来在heatmap.2完成后它会将窗口返回到其原始坐标:[0,1] x [0,1]

enter image description here