我对使用 R 的强大功能来创建图形输出非常陌生。
我使用 metafor-package 中的 forest() 函数来创建我的元分析的森林图。我使用循环生成几个图,然后通过 png() 保存它们。
for (i in 1:ncol(df)-2)){
dat <- escalc(measure="COR", ri=ri, ni=ni, data=df) # Calcultes Effect Size
res_re <- rma.uni(yi, vi, data=dat, method="DL", slab=paste(author)) # Output of meta-analysis
png(filename=path, width=8.27, height=11.69, units ="in", res = 210)
forest(res_re, showweight = T, addfit= T, cex = .9)
text(-1.6, 18, "Author(s) (Year)", pos=4)
text( 1.6, 18, "Correlation [95% CI]", pos=2)
dev.off()
}
如果绘图的大小相等,这很有效。但是,循环的每次迭代都会在森林图中集成不同数量的研究。因此,文本元素不在正确的位置,具有许多研究的森林图看起来有点奇怪。我有两个问题:
每个森林图应如下所示:
最佳答案
要使其正常工作,您必须执行以下操作:
xlim
跨图,以便有一个固定的位置来放置“作者(年份)”和“相关性 [95%CI]”标题。生成森林图后,查看 par()$usr[1:2]
.使用这些值作为调整的起点 xlim
以便它适合您的所有情节。然后将这两个值用于对 text()
的两次调用。 . k
每个图中的行。标题应该在上面两行。所以,使用 text(<first xlim value>, res_re$k+2, "Author(s) (Year)", pos=4)
和 text(<second xlim value>, res_re$k+2, "Correlation [95% CI]", pos=2)
cex
在 text()
到您在调用 forest()
时指定的相同值. cex
,因此文本元素的大小在各个图中应该相同。但如果有更多的研究,那么 k
行被塞进更少的空间,所以它们变得不那么分开。如果我理解正确,您希望通过调整绘图的实际高度来保持绘图之间的行间距相等。本质上,这需要制作 height
在调用 png()
k
的函数.对于每个额外的研究,需要将额外的金额添加到 height
以便行间距保持不变,所以沿着 height=<some factor> + res_re$k * <some factor>
.但是高度的增加是k
的函数也可能是非线性的。做到这一点需要大量的尝试和错误。可能有一种以编程方式确定这一点的聪明方法(深入研究 ?par
和 ?strheight
)。 所以让别人更容易插话,你问题的最后一部分归结为:我如何调整
height
绘图设备的值,以便 plot(1:10)
中的行之间的绝对间距和 plot(1:20)
保持平等?这本身就是一个有趣的问题,所以我将把它作为一个单独的问题发布。
关于r - 将文本与 R 中可变大小的图对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25565817/