2013-02-26 68 views
5

是否可以将图形一次绘制成多个输出设备?我试过了:在R中嵌套输出设备?

getwd() 

pdf("level1.pdf") 
    pdf("level2.pdf") 
    png("level3.png") 

    x=1:10 
    y=1:10 
    plot(x, y) 

    dev.off() # close level3 
    dev.off() # close level2 

    a=10:20 
    b=-10:0 
    plot(a,b) 

dev.off() # close level1 

XY图只进入level3.png。 (我应该进入所有3个文件)

奇怪的是,AB的情节进入level2.pdf,因为我预计它写入level1.pdf,因为level2.pdf应该已经关闭?

回答

3

随着ggplot2您可以指定对象的情节变量和print他们几次:

library(ggplot2) 
p <- ggplot(data.frame(x=1:10, y=1:10), aes(x=x, y=y)) + geom_point() 

pdf('a.pdf') 
print(p) 
dev.off() 

png('b.png') 
print(p) 
dev.off() 

或者,用ggsave(感谢罗兰;然而,这会打开我的系统上的虚拟窗口 - Ubuntu的):

ggsave('a.pdf', p) 
ggsave('b.png', p) 

不知道关于“正规”的情节,我使用ggplot2每当我可以。

+1

功能'ggsave'就更方便了。 – Roland 2013-02-26 08:58:29

4

它可能有一个以上的设备在同一时间开放,*但只有 一个设备目前“活动”和所有的图形输出发送到该设备。所以不,你不能一次将图形绘制成多个输出设备(并行/同一时间我的意思是)。这里我详细介绍一些您可以使用的设备类的方便功能。

可以使用的功能:

  • dev.List():吨得到开放设备
  • dev.cur()的列表来获得当前的有源器件
  • dev.set()改变有源器件
  • dev.next()dev.prev():制作设备列表上的下一个/上一个设备

例如:

pdf("level1.pdf") 
pdf("level2.pdf") 
png("level3.png") 
## list the devices 
dev.list() 
     pdf   pdf png:level3.png 
     2    3    4 


## current device 
dev.cur() 
png:level3.png   ## that's why The XY plot goes only into this device 
       4 
### this will go in the current device 
x=1:10 
y=1:10 
plot(x, y) 
## change the active device 
dev.set(dev.next()) 
pdf 
    2 
### close all devices 
graphics.off() 
## list the devices 
dev.list() 
NULL 

所以你的例子应用此:

pdf("level1.pdf") 
pdf("level2.pdf") 
png("level3.png") 
dev.off() # close level3 
dev.off() # close level2 
dev.cur() 
pdf   ## plot A,B goes on this device 
    3