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

Marius Hofert marius.hofert at math.ethz.ch
Tue Sep 25 08:10:00 CEST 2012


Dear Paul,

Thanks. Redrawing the points solves it for the minimal example, but what happens
if you have plot(.., type="b") like below? 

Actually, originally I wanted to use just grid (without mixing it with base
graphics), but I couldn't find an equivalent for plot(.., type="b"). Also, later
on, I would like to use eaxis() to draw nice y-axes in log-scale. I guess that's
easier with gridBase then. 

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(runif(5), runif(5), type="b",
              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 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.
>>>>>>
>>>>




More information about the R-help mailing list