如何在同一绘图窗口中重放多个recordPlot录制的绘图?
解决录制绘图在同一窗口并排显示的问题
我懂你想把三个已经录制好的绘图在同一个窗口里并排展示的需求,之前的方法没成功是因为recordPlot()会把绘图当时的**所有图形参数(包括默认的单图布局)**都完整记录下来,回放的时候会直接覆盖你后来设置的mfcol布局,导致每次只能显示一个图。下面给你两个实用的解决办法:
方法一:用gridGraphics包转换并布局绘图
这个方法是把base绘图转换成grid对象,再用grid系统来控制布局,兼容性很好:
- 先安装并加载
gridGraphics包:
install.packages("gridGraphics") library(gridGraphics)
- 将录制好的绘图转换成grob对象:
# 把每个recordedplot转成可被grid控制的grob grob_plot1 <- grid.grabExpr(replayPlot(PLOT1)) grob_plot2 <- grid.grabExpr(replayPlot(PLOT2)) grob_plot3 <- grid.grabExpr(replayPlot(PLOT3))
- 创建1行3列的布局并绘制所有图形:
grid.newpage() # 新建绘图页面 # 设置布局:1行3列 pushViewport(viewport(layout = grid.layout(1, 3))) # 在第一个布局区域绘制plot1 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 1)) grid.draw(grob_plot1) popViewport() # 在第二个布局区域绘制plot2 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2)) grid.draw(grob_plot2) popViewport() # 在第三个布局区域绘制plot3 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 3)) grid.draw(grob_plot3) popViewport()
方法二:修改录制绘图的图形参数
如果你不想用额外的包,可以直接修改录制好的plot对象里的布局参数,让它遵循你设置的mfcol:
# 先保存当前的par设置,最后要恢复 opar <- par(mfcol = c(1, 3)) # 修改每个录制plot的par参数,让它使用当前的mfcol布局 PLOT1[[1]]$mfcol <- par("mfcol") PLOT1[[1]]$mfrow <- par("mfrow") PLOT2[[1]]$mfcol <- par("mfcol") PLOT2[[1]]$mfrow <- par("mfrow") PLOT3[[1]]$mfcol <- par("mfcol") PLOT3[[1]]$mfrow <- par("mfrow") # 现在回放就能在同一窗口并排显示了 replayPlot(PLOT1) replayPlot(PLOT2) replayPlot(PLOT3) # 恢复原来的par设置 par(opar)
为什么原来的方法失效?
当你用recordPlot()录制绘图时,它会保存绘图瞬间的全部图形状态,包括当时默认的par(mfrow=c(1,1), mfcol=c(1,1))设置。所以即使你提前设置了mfcol=c(1,3),第一次replayPlot()就会把par重置回录制时的单图布局,后面的绘图自然会覆盖整个窗口,而不是填充到布局的下一个位置。
内容的提问来源于stack exchange,提问作者Lucas Vitantonio
相关产品推荐
相关产品推荐

