Skip to content

function in order to plot the same graph to postscript and pdf

8 messages · Ronny Klein, Achim Zeileis, Gabor Grothendieck

#
Hi,

I've written a function in order to plot the same graph in a postcript and in 
a pdf file. Unfortunately, the second graph is always empty, i.e.:

plot.both <- function{myplot, filename}{
  pdf(file=paste(filename, ".pdf", sep=""))
   myplot
  dev.off()
  postscript(file=paste(filename, ".eps", sep=""))
   myplot
  dev.off()
}

yields in a correct pdf but an empty eps file. However something like this:

plot.both <- function{myplot1, myplot2, filename}{
  pdf(file=paste(filename, ".pdf", sep=""))
   myplot1
  dev.off()
  postscript(file=paste(filename, ".eps", sep=""))
   myplot2
  dev.off()
}

yields the expected results even if myplot1 and myplot2 are identical.

Does somebody know, how I can implement the desired (first) function?

Ronny

PS: My system is: Linux Debian Unstable and R-Version:  2.0.1.
#
On Wed, 9 Mar 2005 14:57:27 +0100 Ronny Klein wrote:

            
What are the myplot objects? Expressions or graphical objects that are
printed?

In any case, a good recommendation for this kind of stuff is to look at
Sweave() in the utils package. I guess you're writing your thesis in
LaTeX...and Sweave is a great possibility to mix LaTeX code and R code
which for example generates both pdf and eps graphics.
Z
#
The myplot is something like this:

plot(x)
text(foo)

etc.
Thanks, I will have a look on it.

Ronny
#
On Wed, 9 Mar 2005 15:24:48 +0100 Ronny Klein wrote:

            
Aha, I was surprised that this worked for one of the two plots.
You could pass myplot as an expression, e.g. myplot =
expression(plot(x)), and then eval() that in the body of plot.both(). 

But personally, I wouldn't do that :-) and use Sweave instead.
Z
#
Ronny Klein <ronny.klein <at> wiwi.uni-halle.de> writes:

: 
: Hi,
: 
: I've written a function in order to plot the same graph in a postcript and 
in 
: a pdf file. Unfortunately, the second graph is always empty, i.e.:
: 
: plot.both <- function{myplot, filename}{
:   pdf(file=paste(filename, ".pdf", sep=""))
:    myplot
:   dev.off()
:   postscript(file=paste(filename, ".eps", sep=""))
:    myplot
:   dev.off()
: }
: 
: yields in a correct pdf but an empty eps file. However something like this:
: 
: plot.both <- function{myplot1, myplot2, filename}{
:   pdf(file=paste(filename, ".pdf", sep=""))
:    myplot1
:   dev.off()
:   postscript(file=paste(filename, ".eps", sep=""))
:    myplot2
:   dev.off()
: }
: 
: yields the expected results even if myplot1 and myplot2 are identical.
: 
: Does somebody know, how I can implement the desired (first) function?
: 
: Ronny
: 
: PS: My system is: Linux Debian Unstable and R-Version:  2.0.1.
: 

The following works on Windows R 2.1.0.  Don't know about Linux:

dev.control(displaylist="enable") # enable display list
plot(1:10)
myplot <- recordPlot() # load displaylist into variable
savePlot("myplot", type = "pdf")
savePlot("myplot", type = "ps")
#
I've followed your advice and changed my function to something like this:

plot.both <- function{myplot, filename}{
     MYPLOT <- expression(myplot)
     pdf(file=paste(filename, ".pdf", sep=""))
     eval(myplot)
     dev.off()
     postscript(file=paste(filename, ".eps", sep=""))
     eval(myplot)
    dev.off()
 }

However the result is the same: the first one is actually printed but the 
second plot is empty. 

Ronny
#
On Wed, 9 Mar 2005 18:21:41 +0100 Ronny Klein wrote:

            
Not quite...
I guess you would want eval(MYPLOT) there?

But the function above works if you say
  plot.both(myplot = expression(plot(x)), filename = "foo")
and that is what I said above: set myplot = expression(plot(x)).
Z
#
My syntax in the example was a little bit messed, sorry for that.

However Gabor Grothendieck's reply has brought me to the solution. The 
following function does the job right:

print.both <- function(myplot, filename){
     pdf(file=paste(filename, ".pdf", sep=""))
     postscript(file=paste(filename, ".eps", sep=""))
    dev.control(displaylist="enable")
    myplot
    dev.copy(which=dev.next())
    graphics.off()
}

The dev.control(displaylist="enable") is necessary here because only then R 
does record the plot and dev.copy can be used.

So, thank you all for your help.

Ronny