我有一个森林图(使用metafor),其行数将根据输入条件而变化。我的代码使用以下命令在每次运行后保存绘图:
dev.copy(png,'myplot.png')
dev.off()
根据图中的行数,可以压缩数据。大约30行以及数据变得不可读,请参见下面的示例。第一个图表是可读的,但第二个图表是无用的,只是因为我想要包含更多数据而变得更糟。
有没有办法保存图表,以便高度会自动更新以正确放入行?没有特别需要图表是正方形的,事实上我设想它将是矩形的以适应数据。图表代码包含在问题的基础中以供参考。
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,")"))
答案 0 :(得分:2)
不要使用dev.copy()
,而是执行此操作:
k
(研究数量=行数)。png()
的绘图设备,其中height
属性是k
的适当函数(k
越大,height
的值越大})。dev.off()
关闭绘图设备。第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可能更优雅,但你必须检查自己如何使这项工作。