Hello all and thanks in advance for any help,

    There are really two issues that I am having, both related to saving
graphs:
1) It seems that the "dev...()" functions are unstable when using higher
level graphs (specifically I was using levelplot)

2) I have a large grid of levelplot graphs that I can print out into a
subset quite easily when I print to screen, but if I print to a file, I
cannot print the subset.  (I mention .png in the subject because that's what
I used, but really any format is acceptable to me).

=========================================================

1) Unstable dev...() functions:


I have the following line of code embedded in a function using simple "plot"
commands and it works fine:

  if(!is.na(plotFileName)) dev.off()

    I set "plotFIleName" as "NA" by default, in which case the plot prints
to screen.  If a name is given, the print goes to the png() function.
Therefore, I want to turn the device off to ensure that the next plot isn't
sent to the same device & overwrites it.
    This works *perfectly fine* when using the plot function.  This exact
same code, however, does not work for levelplot or (I am assuming) any other
higher level trellis (sp!) graphs.  Below are snippets of the entire code,
edited a bit for

  if(!is.na(plotFileName)) {
    print(paste("Saving Zonal plot to file ",plotFileName,".png",sep=""))
    print("(To display instead, do not pass any 'plotFileName' argument to
cro.zone.plot function.)")
    maxLayout <- c(0,length(unique(miniDataSet$splitCol)))
    png(filename =
paste(as.character(plotFileName),".png",sep=""),width=(1.2*plotSize*(maxLayout[2]^(1/3))),
        height=(plotSize*(maxLayout[2]^(1/3))))
  } else {
    devAskNewPage(ask = TRUE)
    maxLayout <- c(0,min(16,length(unique(miniDataSet$splitCol))))
  }
  levelplot(dataCol ~ siteX * siteY | splitCol,data = miniDataSet,

col.regions=rainbow(n=length(unique(miniDataSet$dataCol))+5,start=0.5,end=0.95),
            layout = maxLayout,
            shrink = c(0.6,1.1),at =
keyCols,xlab=list(label=xlab,cex=labelScale),
            ylab=list(label=ylab,cex=labelScale),scales =
list(cex=axisScale),
            main=list(label=paste(dataCol,plotTitle,splitCol),
              cex=titleScale),colorkey=list(labels=list(cex=labelScale)))

  if(!is.na(plotFileName)) dev.off()

If I keep the code exactly as is, it will not work.  If I remove *just the
last line*, the function will work, and then I simply have to manually
remove the device "by hand" (also by using dev.off() ) outside of the
function code.  Now the *really weird* thing:  if I comment out that last
"if(!is.na... dev.off()" line, the function *still does not work*.  I
literally have to remove the line, I cannot simply comment it out!  This is
why I think it is "unstable".
    I have found a way around this (I simply put a loop in the front of any
of my plotting functions to ensure they have turned off all devices before
doing anything... this seems to work), so this is not my biggest problem,
personally.  But it does seem to be a bigger problem for R itself, and for
this community.
    On a related note:  I have noticed that sometimes "devAskNewPage(ask =
TRUE)" is also buggy.  Normally I can just alter the code slightly to get it
to work, but the solutions are odd.  (For instance, I have found that if
"devAskNewPage(ask = TRUE)" is in an "if" clause, it sometimes won't work
unless I use the { } brackets around it, even with a one line if clause.

========================================

2) Printing multiple pages to png:

If you look through the code above, you'll see that I have altered the size
of the grid that is printed, depending upon whether it is printed to screen
or to png.  Specifically, look at:

  if(!is.na(plotFileName)) {
...
    maxLayout <- c(0,length(unique(miniDataSet$splitCol)))
...
  } else {
...
    maxLayout <- c(0,min(16,length(unique(miniDataSet$splitCol))))
  }
  levelplot(...layout = maxLayout...)

The reason I do this is because when I print to screen, the "askNewPage"
will allow me to look at the screen before the next one is printed.  I could
even screen capture that, if I wanted to choose a slow, ugly, and
non-scriptable solution.  But if I try to send to png, each of the new pages
of the grid overwrite each other.
    Specifically, this levelplot is making a grid of ~ 60 graphs.  Since the
layout maxes to 16 graphs per page, it nicely forces it to a 4 x 4 matrix of
graphs, 4 pages long.  For the visual display, this is fine, as I mention.
For the save to png, only one of the pages is captured.  And, oddly, it is
rarely the last page.  I don't quite understand this, but it is usually
either the 2nd or the 3rd page that is saved to the png.
    You can see my solution to it in the code above:  when saving to png,
all of the graphs are printed out in a gigantic grid, but I also increase
the height & width of the graph set so that each individual plot isn't too
tiny.  It isn't a totally useless solution, but still not ideal.

    I think I just don't quite understand how to use these "devices", as
they are called, and that is the root of the problem.  In fact, I don't even
know how to bring one device (say, for instance, the device holding the png
graph) to another device type.  E.g., a solution I was trying to figure out
was to simply print everything to screen and then switch the screen device
to png.  This still isn't ideal because it requires constant user
interaction, but it nonetheless illuminated the fact that I don't understand
how to manage the devices.

                                     Thanks in advance for any help!
                                                           Mike

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to