2013-02-26 11 views
5

È possibile tracciare un grafico in più dispositivi di uscita contemporaneamente? Ho provato:Dispositivi di output di nidificazione in 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 

La trama XY va solo in level3.png. (Dovrei andare su tutti i 3 file)

Stranamente, la trama AB va in level2.pdf, mentre mi aspettavo che fosse scritta su level1.pdf, dal momento che level2.pdf dovrebbe essere già chiuso?

risposta

3

Con ggplot2 è possibile assegnare trama oggetti a variabili e li print più volte:

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() 

Oppure, con ggsave (grazie a Roland, ma questo apre una finestra manichino sul mio sistema - Ubuntu):

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

sicuro di trame "normali", sto usando ggplot2 ogni volta che posso.

+1

funzione 'ggsave' è ancora più conveniente. – Roland

4

E 'possibile avere più di un dispositivo aperto allo stesso tempo, * ma solo un dispositivo è attualmente “attivo” e tutti gli output grafici viene inviato a tale dispositivo. Quindi No, non è possibile tracciare un grafico in più dispositivi di output contemporaneamente (in parallelo/allo stesso tempo intendo). qui dettaglio alcune pratiche funzioni della classe del dispositivo che è possibile utilizzare.

È possibile utilizzare le funzioni:

  • dev.List(): t ottenere l'elenco dei dispositivi aperti
  • dev.cur() per ottenere il dispositivo attivo corrente
  • dev.set() per cambiare il dispositivo attivo
  • dev.next() e dev.prev(): per rendere il dispositivo successivo/precedente nell'elenco dei dispositivi

Ad esempio:

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 

Quindi, l'applicazione di questo sul tuo esempio:

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