1

我非常接近我想要的热图,但我一直在努力解决标题问题。我想要在每列的顶部有角度的标题(例如 45 或 50 度)。我已经抑制了树状图(对于列和行),并使用矩阵的第一列(深度)作为行的标签。

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

非常感谢您的任何想法。请原谅我在下面的代码中提供示例数据的笨拙方式;我是 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)
4

1 回答 1

2

Here's a hack that doesn't involve pulling apart the convoluted code of 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") )

I don't know if you actually need the xpd in there, since it appears that after heatmap.2 is finished it returns the window to its native coordinates: [0,1]x[0,1]

enter image description here

于 2013-06-14T22:25:35.043 回答