保存森林地块(metafor)

时间:2016-04-19 06:46:24

标签: r plot

我有一个森林图(使用metafor),其行数将根据输入条件而变化。我的代码使用以下命令在每次运行后保存绘图:

dev.copy(png,'myplot.png')
dev.off()

根据图中的行数,可以压缩数据。大约30行以及数据变得不可读,请参见下面的示例。第一个图表是可读的,但第二个图表是无用的,只是因为我想要包含更多数据而变得更糟。

有没有办法保存图表,以便高度会自动更新以正确放入行?没有特别需要图表是正方形的,事实上我设想它将是矩形的以适应数据。图表代码包含在问题的基础中以供参考。

enter image description here

enter image description here

forest(x = final$AvgPts, ci.lb = final$min, ci.ub = final$max, slab = final$Players,
ilab = final$value, ilab.xpos = max(final$max)+10,ilab.pos =4, alim = c(min(final$min)-5,
max(final$max)+5), xlim = c(min(final$min)-170, 2*(max(final$max)+5)), 
xlab = "Moneyball Points Spread", efac = 1, cex = 0.75, mgp = c(1, 1, 0),
refline=mean(final$AvgPts),digits=1,col="dark blue",pch = 19,
main=paste("2016 Moneyball Summary (position =",pos,"and min average >",points,")"))

1 个答案:

答案 0 :(得分:2)

不要使用dev.copy(),而是执行此操作:

  1. 确定将包含在森林地块中的k(研究数量=行数)。
  2. 打开一个包含png()的绘图设备,其中height属性是k的适当函数(k越大,height的值越大})。
  3. 绘制森林图。
  4. 使用dev.off()关闭绘图设备。
  5. 利润!
  6. 第2步实际上有点棘手。经过一些反复试验,我发现height = 200 + 40*k^.85似乎没问题。在forest()中,您还希望使用cex=1,以便字符/符号展开因子保持不变,yaxs="i",否则k时4%填充将开始变得奇怪很大。但是,您还需要调整ylim,以便在x轴和第一行之间有更多的空间。最后,您还必须使efac适当减少k的函数。经过一些反复试验,我发现efac=30/(k+10)似乎有效。

    以下是一些代码来测试它:

    library(metafor)
    
    ks <- c(5, 10, 20, 40, 80, 160, 320)
    
    for (k in ks) {
    
       vi <- runif(k, .05, 1)
       yi <- rnorm(k, 0, sqrt(vi))
    
       png(paste0("forest_k=", formatC(k, format="f", flag="0", width=3, digits=0), ".png"), height = 200 + 40*k^.85)
       forest(yi, vi, xlim=c(-10,10), alim=c(-4,4), efac=30/(k+10), cex=1, yaxs="i", ylim=c(0,k+3))
       text(-10, k+2, "Study", pos=4)
       text( 10, k+2, "Estimate [95% CI]", pos=2)
       dev.off()
    
    }
    

    好的,最后,这是一个hackish解决方案,但似乎有效。

    还有https://stackoverflow.com/a/28239750/2615367可能更优雅,但你必须检查自己如何使这项工作。