【发布时间】:2012-10-16 09:18:09
【问题描述】:
@backlin 介绍
可以使用layout 或par(mfrow=...) 将多个简单的图组合成一个图形中的面板。但是,更复杂的绘图往往会在内部设置自己的面板布局,从而使它们无法用作面板。有没有办法创建嵌套布局并将复杂的绘图封装到单个面板中?
我感觉grid 包可以做到这一点,例如通过在单独的视口中绘制面板,但无法弄清楚如何。这是一个演示问题的玩具示例:
my.plot <- function(){
a <- matrix(rnorm(100), 10, 10)
plot.new()
par(mfrow=c(2,2))
plot(1:10, runif(10))
plot(hclust(dist(a)))
barplot(apply(a, 2, mean))
image(a)
}
layout(matrix(1:4, 2, 2))
for(i in 1:4) my.plot()
# How to avoid reseting the outer layout when calling `my.plot`?
@alittleboy 的原始问题
我使用gplots 包中的heatmap.2 函数来生成热图。以下是单个热图的示例代码:
library(gplots)
row.scaled.expr <- matrix(sample(1:10000),nrow=1000,ncol=10)
heatmap.2(row.scaled.expr, dendrogram ='row',
Colv=FALSE, col=greenred(800),
key=FALSE, keysize=1.0, symkey=FALSE, density.info='none',
trace='none', colsep=1:10,
sepcolor='white', sepwidth=0.05,
scale="none",cexRow=0.2,cexCol=2,
labCol = colnames(row.scaled.expr),
hclustfun=function(c){hclust(c, method='mcquitty')},
lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(0.25, 4, 0.25 ),
)
但是,由于我想在单个图中比较多个热图,我使用 par(mfrow=c(2,2)) 然后调用 heatmap.2 四次,即
row.scaled.expr <- matrix(sample(1:10000),nrow=1000,ncol=10)
arr <- array(data=row.scaled.expr, dim=c(dim(row.scaled.expr),4))
par(mfrow=c(2,2))
for (i in 1:4)
heatmap.2(arr[ , ,i], dendrogram ='row',
Colv=FALSE, col=greenred(800),
key=FALSE, keysize=1.0, symkey=FALSE, density.info='none',
trace='none', colsep=1:10,
sepcolor='white', sepwidth=0.05,
scale="none",cexRow=0.2,cexCol=2,
labCol = colnames(arr[ , ,i]),
hclustfun=function(c){hclust(c, method='mcquitty')},
lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(0.25, 4, 0.25 ),
)
但是,结果不是单个图中的四个热图,而是四个单独的热图。换句话说,如果我使用pdf() 输出结果,文件是四页而不是一页。我需要在某处更改任何参数吗?非常感谢!
【问题讨论】:
-
如果你看
heatmap.2的代码,例如使用page(heatmap.2),您会注意到它调用了plot.new(),它覆盖了您对par(mfrow=c(2,2))的调用。我尝试使用grid引擎将每个heatmap.2绘图限制在绘图区域的一个子部分中,但不知道该怎么做。 -
这个问题我之前在其他功能上也遇到过,我也遇到过这个问题。您介意我改写您的问题并添加更一般(但简短)的介绍吗?
-
我用常规的 heatmap() 函数完成了这个,方法是注释掉函数的一部分,然后使用 layout(),但这有点难看。
-
@Backlin:非常感谢 cmets!当然,如果您能改写我的问题并添加对该主题的介绍,我将不胜感激:)
-
我周末不在,但我们希望现在有人接听。