[R] Background color in a grid plot seems to interfere with plot()

Paul Murrell paul at stat.auckland.ac.nz
Tue Sep 25 01:58:04 CEST 2012


Hi

On 25/09/12 11:50, Marius Hofert wrote:
> Dear Paul,
>
> Thanks for helping. Is there a way to call grid() first? The problem seems to be
> that everything drawn before grid() is overplotted.

No, but you can redraw the points ...

require(grid)
require(gridBase)

pdf(file="Rplot.pdf", width=8, height=8, onefile=FALSE)

## set up the grid layout
plot.new() # start (empty) new page with 'graphics'
gl <- grid.layout(5, 5, widths=unit(c(1.8, 8, 0.8, 8, 0.8), "cm"),
		  heights=unit(c(0.8, 8, 0.8, 8, 1.5), "cm"))
pushViewport(viewport(layout=gl))

## plot data
par. <- par(no.readonly=TRUE) # save plot settings
for(i in 1:2) { # rows
      i. <- if(i > 1) i+2 else i+1 # jumping over gaps
      for(j in 1:2) { # columns
          j. <- if(j > 1) j+2 else j+1 # jumping over gaps
          pushViewport(viewport(layout.pos.row=i., layout.pos.col=j.))
          grid.rect(gp=gpar(col=NA, fill="gray90")) # background
          par(plt=gridPLT())
          ## plot
          par(new=TRUE) # always do this before each new 'graphics' plot
          plot(1:5, if(i==1 && j==2) c(1, 1, 2, 3, 1) else 1:5,
               log="y", xlab="", ylab="", frame.plot=FALSE, xaxt="n",
               yaxt="n")
          # background grid
          grid(col="white", lty="solid", lwd=1.6, equilogs=FALSE)
          points(1:5, if(i==1 && j==2) c(1, 1, 2, 3, 1) else 1:5)
          upViewport()
      }
}
par(par.)
dev.off()

Paul

> Cheers,
>
> Marius
>
>
>
> require(grid)
> require(gridBase)
>
> pdf(file="Rplot.pdf", width=8, height=8, onefile=FALSE)
>
> ## set up the grid layout
> plot.new() # start (empty) new page with 'graphics'
> gl <- grid.layout(5, 5, widths=unit(c(1.8, 8, 0.8, 8, 0.8), "cm"),
> 		  heights=unit(c(0.8, 8, 0.8, 8, 1.5), "cm"))
> pushViewport(viewport(layout=gl))
>
> ## plot data
> par. <- par(no.readonly=TRUE) # save plot settings
> for(i in 1:2) { # rows
>       i. <- if(i > 1) i+2 else i+1 # jumping over gaps
>       for(j in 1:2) { # columns
>           j. <- if(j > 1) j+2 else j+1 # jumping over gaps
>           pushViewport(viewport(layout.pos.row=i., layout.pos.col=j.))
>           grid.rect(gp=gpar(col=NA, fill="gray90")) # background
>           par(plt=gridPLT())
>           ## plot
>           par(new=TRUE) # always do this before each new 'graphics' plot
>           plot(1:5, if(i==1 && j==2) c(1, 1, 2, 3, 1) else 1:5,
>                log="y", xlab="", ylab="", frame.plot=FALSE, xaxt="n", yaxt="n")
>           grid(col="white", lty="solid", lwd=1.6, equilogs=FALSE) # background grid
>           upViewport()
>       }
> }
> par(par.)
> dev.off()
>
>
> Paul Murrell <paul at stat.auckland.ac.nz> writes:
>
>> Hi
>>
>> On 24/09/12 18:06, Marius Hofert wrote:
>>> Dear Paul,
>>>
>>> Thank you for helping. This works great.
>>>
>>> I then tried to put in a grid (via grid()). Why does that fail?
>>
>> Because grid() is used to add lines to an existing plot;  just put the grid()
>> call AFTER the plot() call and it should work ok.
>>
>> Paul
>>
>>> Cheers,
>>>
>>> Marius
>>>
>>>
>>> require(grid)
>>> require(gridBase)
>>>
>>> pdf(file="Rplot.pdf", width=8, height=8, onefile=FALSE)
>>>
>>> ## set up the grid layout
>>> plot.new() # start (empty) new page with 'graphics'
>>> gl <- grid.layout(5, 5, widths=unit(c(1.8, 8, 0.8, 8, 0.8), "cm"),
>>> 		  heights=unit(c(0.8, 8, 0.8, 8, 1.5), "cm"))
>>> pushViewport(viewport(layout=gl))
>>>
>>> ## plot data
>>> par. <- par(no.readonly=TRUE) # save plot settings
>>> for(i in 1:2) { # rows
>>>       i. <- if(i > 1) i+2 else i+1 # jumping over gaps
>>>       for(j in 1:2) { # columns
>>>           j. <- if(j > 1) j+2 else j+1 # jumping over gaps
>>>           pushViewport(viewport(layout.pos.row=i., layout.pos.col=j.))
>>>           grid.rect(gp=gpar(fill="gray90")) # background
>>>           par(plt=gridPLT())
>>>           ## plot
>>>           par(new=TRUE) # always do this before each new 'graphics' plot
>>>           grid(col=1)
>>>           plot(1:10, 1:10, log="y", xlab="", ylab="",
>>>                xaxt=if(i==2) "s" else "n", yaxt=if(j==1) "s" else "n")
>>>           upViewport()
>>>       }
>>> }
>>> par(par.)
>>> dev.off()
>>>
>>>
>>>
>>> Paul Murrell <paul at stat.auckland.ac.nz> writes:
>>>
>>>> Hi
>>>>
>>>> On 24/09/12 09:36, Marius Hofert wrote:
>>>>> Hi,
>>>>>
>>>>> Why does the upper left panel (in the plot below) not have a gray background?
>>>>
>>>> That is a symptom of the conflict that occurs when the 'graphics' package and
>>>> the 'grid' package both try to initialise a new page.
>>>> A good rule of thumb is to start a new page with 'graphics' first and THEN add
>>>> grid' stuff ('grid' is better at sharing), so a minor adjustment to your code
>>>> would be (#PAUL marks the changes) ...
>>>>
>>>>
>>>> pdf(file="Rplot.pdf", width=8, height=8, onefile=FALSE)
>>>> #PAUL
>>>> # Start (empty) new page with 'graphics'
>>>> plot.new()
>>>> ## set up the grid layout
>>>> gl <- grid.layout(5, 5, widths=unit(c(1.8, 8, 0.8, 8, 0.8), "cm"),
>>>> 		  heights=unit(c(0.8, 8, 0.8, 8, 1.5), "cm"))
>>>> pushViewport(viewport(layout=gl))
>>>> ## plot data
>>>> par. <- par(no.readonly=TRUE) # save plot settings
>>>> for(i in 1:2) { # rows
>>>>       i. <- if(i > 1) i+2 else i+1 # jumping over gaps
>>>>       for(j in 1:2) { # columns
>>>>           j. <- if(j > 1) j+2 else j+1 # jumping over gaps
>>>>           pushViewport(viewport(layout.pos.row=i., layout.pos.col=j.))
>>>>           grid.rect(gp=gpar(fill="gray90")) # background
>>>>           par(plt=gridPLT())
>>>>           ## plot
>>>>           #PAUL
>>>>           # ALWAYS do this before each new 'graphics' plot
>>>>           par(new=TRUE)
>>>>           plot(1:10, 1:10, log="y", xlab="", ylab="",
>>>>                xaxt=if(i==2) "s" else "n", yaxt=if(j==1) "s" else "n")
>>>>           upViewport()
>>>>       }
>>>> }
>>>> par(par.)
>>>> dev.off()
>>>>
>>>>
>>>> Hope that helps.
>>>>
>>>> Paul
>>>>
>>>>> Cheers,
>>>>>
>>>>> Marius
>>>>>
>>>>>
>>>>> require(grid)
>>>>> require(gridBase)
>>>>>
>>>>> pdf(file="Rplot.pdf", width=8, height=8, onefile=FALSE)
>>>>>
>>>>> ## set up the grid layout
>>>>> gl <- grid.layout(5, 5, widths=unit(c(1.8, 8, 0.8, 8, 0.8), "cm"),
>>>>> 		  heights=unit(c(0.8, 8, 0.8, 8, 1.5), "cm"))
>>>>> if(FALSE) grid.show.layout(gl)
>>>>> pushViewport(viewport(layout=gl))
>>>>>
>>>>> ## plot data
>>>>> par. <- par(no.readonly=TRUE) # save plot settings
>>>>> for(i in 1:2) { # rows
>>>>>        i. <- if(i > 1) i+2 else i+1 # jumping over gaps
>>>>>        for(j in 1:2) { # columns
>>>>>            j. <- if(j > 1) j+2 else j+1 # jumping over gaps
>>>>>            pushViewport(viewport(layout.pos.row=i., layout.pos.col=j.))
>>>>>            grid.rect(gp=gpar(fill="gray90")) # background
>>>>>            par(plt=gridPLT())
>>>>>            ## plot
>>>>>            plot(1:10, 1:10, log="y", xlab="", ylab="",
>>>>>                 xaxt=if(i==2) "s" else "n", yaxt=if(j==1) "s" else "n")
>>>>>            par(new=TRUE) # to be run after first plot
>>>>>            upViewport()
>>>>>        }
>>>>> }
>>>>> par(par.)
>>>>> dev.off()
>>>>>
>>>>> ______________________________________________
>>>>> R-help at 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.
>>>>>
>>>

-- 
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/




More information about the R-help mailing list