[R] What's box() (exactly) doing?

Marius Hofert marius.hofert at uwaterloo.ca
Sat Jun 25 02:40:35 CEST 2016


Hi Jim,

Thanks a lot, exactly what I was looking for.

Cheers,
Marius



On Thu, Jun 23, 2016 at 11:06 PM, Jim Lemon <drjimlemon at gmail.com> wrote:
> Hi Marius,
> There are a few things that are happening here. First, the plot area
> is not going to be the same as your x and y limits unless you say so:
>
> # run your first example
> par("usr")
> [1] -0.04  1.04 -0.04  1.04
>
> # but
> plot(NA, type = "n", ann = FALSE, axes = FALSE,
>  xlim = 0:1, ylim = 0:1,xaxs="i",yaxs="i")
> box()
> rect(xleft = 0, ybottom = 0, xright = 1, ytop = 1, col = "grey80")
> par("usr")
> [1] 0 1 0 1
>
> Second, the "rect" function is automatically clipped to the plot area,
> so you may lose a bit at the edges if you don't override this:
>
> par(xpd=TRUE)
> rect(...)
> par(xpd=FALSE)
>
> Finally your second example simply multiplies the first problem by
> specifying a layout of more than one plot. Applying the "xaxs" and
> "yaxs" parameters before you start plotting will fix this:
>
> par(xaxs="i",yaxs="i")
>
> Jim
>
> On Fri, Jun 24, 2016 at 12:29 PM, Marius Hofert
> <marius.hofert at uwaterloo.ca> wrote:
>> Hi,
>>
>> I would like to replicate the behavior of box() with rect() (don't ask why).
>> However, my rect()angles are always too small. I looked a bit into the
>> internal C_box but
>> couldn't figure out how to solve the problem. Below is a minimal
>> working (and a slightly bigger) example.
>>
>> Cheers,
>> Marius
>>
>> ## MWE
>> plot(NA, type = "n", ann = FALSE, axes = FALSE, xlim = 0:1, ylim = 0:1)
>> rect(xleft = 0, ybottom = 0, xright = 1, ytop = 1, col = "grey80") #
>> should match box()
>> box()
>>
>> ## Extended example
>>
>> ## Basic plot
>> my_rect <- function()
>> {
>>     plot(NA, type = "n", ann = FALSE, axes = FALSE, xlim = 0:1, ylim = 0:1)
>>     rect(xleft = 0, ybottom = 0, xright = 1, ytop = 1, col = "grey80")
>> # should match box()
>>     box()
>> }
>>
>> ## Layout
>> lay <- matrix(0, nrow = 3, ncol = 3, byrow = TRUE)
>> lay[1,1] <- 1
>> lay[2,1] <- 2
>> lay[2,2] <- 3
>> lay[2,3] <- 4
>> lay[3,3] <- 5
>> layout(lay, heights = c(1, 10, 1), widths = c(10, 1, 10))
>> layout.show(5) # => no space between rectangles; calls box() to draw the boxes
>>
>> ## Fill layout
>> par(oma = rep(0, 4), mar = rep(0, 4))
>> my_rect()
>> my_rect()
>> my_rect()
>> my_rect()
>> my_rect()
>> ## => spaces between rectangles => why?/how to avoid?
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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