R语言中如何用recordPlot实现lattice包图形的复用?
解决Lattice图形的复用问题
问题原因
Lattice(包括ggplot2等)属于网格图形系统,和基础R绘图逻辑不同:
- 基础R绘图函数会直接将图形渲染到当前设备;
- Lattice的绘图函数(如
levelplot)默认仅返回一个图形对象,不会自动绘制到设备上,因此recordPlot()无法找到可记录的当前设备,触发报错Error in recordPlot() : no current device to record from。
解决方案
方案一:直接保存Lattice图形对象(推荐)
直接存储levelplot返回的图形对象,后续通过print()显式渲染到目标设备,这是Lattice图形复用的标准方式,效率更高。
library(lattice) my.plots <- vector('list', 5) for (i in 1:5) { temp <- matrix(rnorm(25), 5, 5) # 保存levelplot返回的图形对象 my.plots[[i]] <- levelplot(temp) } pdf('Test.pdf') for (i in 1:5) { # 显式打印图形对象到PDF设备 print(my.plots[[i]]) } dev.off()
方案二:结合临时设备使用recordPlot()
如果坚持要使用recordPlot(),需要先打开临时设备,显式绘制Lattice图形后再记录:
library(lattice) my.plots <- vector('list', 5) for (i in 1:5) { temp <- matrix(rnorm(25), 5, 5) # 打开临时图形设备(noRStudioGD避免RStudio设备冲突) dev.new(width=6, height=6, noRStudioGD = TRUE) # 显式将图形绘制到临时设备 print(levelplot(temp)) # 记录当前设备的图形 my.plots[[i]] <- recordPlot() # 关闭临时设备 dev.off() } pdf('Test.pdf') for (i in 1:5) { replayPlot(my.plots[[i]]) } dev.off()
注意:方案二需要额外创建临时设备,会占用更多系统资源,因此优先推荐方案一。
内容的提问来源于stack exchange,提问作者Santiago
相关产品推荐
相关产品推荐

