From ggrothendieck at gmail.com  Mon Oct 29 23:51:45 2007
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Mon, 29 Oct 2007 18:51:45 -0400
Subject: [Rd] pairs, par
In-Reply-To: <7559d52e0710291054k4beadea6w7c4e8c957cc46dab@mail.gmail.com>
References: <7559d52e0710290855wdc0908eh64cbbac96cabc07d@mail.gmail.com>
	<472610D1.4060900@acm.org>
	<7559d52e0710291054k4beadea6w7c4e8c957cc46dab@mail.gmail.com>
Message-ID: <971536df0710291551k3bd56829j43048d8a104e69e5@mail.gmail.com>

This hack will disable the on.exit temporarily:

pairs.data.frame <- function(x, ...) {
	on.exit <- function(...) {}
	environment(pairs.default) <- environment()
	pairs.default(x, ...)
}
pairs(iris)
par("usr")
# add points to lower right square
points(1:10/10, 1:10/10, col = "red")


On 10/29/07, Oliver Soong <osoong at bren.ucsb.edu> wrote:
> I dug around in pairs, and I think it has something to do with the
> on.exit(par(opar)) bit:
>
> f <- function() {
>        opar <- par(mfrow = c(2, 2), mar = rep(0.5, 4), oma = rep(4, 4))
>        on.exit(par(opar))
>        for(i in 1:4) plot(0:1, 0:1)
>        par(c("mfg", "omd", "fig", "plt", "usr"))
>        print(opar)
> }
> f()
> par(xpd = NA)
> par(c("omd", "fig", "plt", "usr"))
> points(0 - 0.01 * 1:100, 0 - 0.01 * 1:100)
> points(0 - 0.01 * 1:100, 1 + 0.01 * 1:100)
> points(1 + 0.01 * 1:100, 0 - 0.01 * 1:100)
> points(1 + 0.01 * 1:100, 1 + 0.01 * 1:100)
>
> My guess is that there are 2 sets of graphical parameters, the ones
> stored in par and the ones used by the plotting functions.  Before
> par(opar) gets called, the two are synchronized.  When par(opar) gets
> called, we somehow set new values for par without changing the ones
> used by the plotting functions, and the data used by points becomes
> out of sync with the par information.
>
> This is reflected in this much simpler example:
>
> x11()
> par(c("omd", "fig", "plt", "usr"))
> points(0, 0)
>
> Again, par is defined, but this time the data used by the plotting
> functions has not been set, and an error occurs.
>
> Thanks for the workaround suggestion.  I guess I can always define a
> new plotting region to force par and the plotting data to
> re-synchronize.  It might be nice if those two didn't go out of sync,
> as I had assumed par would always be reliable.
>
> Oliver
>
>
> On 10/29/07, Tony Plate <tplate at acm.org> wrote:
> > I would look into the code for pairs().  Among other things, it sets and
> > restores par(mfrow=...).  I suspect this is the relevant issue, not the
> > use of pairs().  I would try to figure out what state a graphics device
> > is in after resetting par("mfrow").  When I try the following (R 2.6.0
> > patched, under Windows), I see a line on the plot, but not in a place
> > that corresponds to the axis that were drawn by the 'plot()' command:
> >
> >  > par(mfrow=c(2,2))
> >  > plot(1:2)
> >  > par(mfrow=c(1,1))
> >  > lines(1:2,1:2)
> >  >
> >
> > (and if you want to be able to set up a new coordinate system on the
> > plotting device to draw on top of the plot left by pairs(), look at
> > par("new") & something like plot(0:1, type='n', axes=F, xlab=""))
> >
> > hope this helps,
> >
> > Tony Plate
> >
> > Oliver Soong wrote:
> > > Hi,
> > >
> > > I posted over at R-help, and didn't get a response, but perhaps that
> > > was the wrong forum for this question.  I'm having some confusion over
> > > the coordinate system after using pairs.  I'm not interested in the
> > > content of the actual pairs plot, although the number of pairs seems
> > > to matter a bit.  I'm purely interested in knowing where subsequent
> > > points will be plotted on the device.  However, after using pairs, the
> > > par information (omd, fig, plt, and usr) don't reflect what points
> > > does.  For example:
> > >
> > > pairs(iris[1:5])
> > > par(xpd = NA)
> > > points(0 - 0.01 * 1:100, 0 - 0.01 * 1:100)
> > > points(0 - 0.01 * 1:100, 1 + 0.01 * 1:100)
> > > points(1 + 0.01 * 1:100, 0 - 0.01 * 1:100)
> > > points(1 + 0.01 * 1:100, 1 + 0.01 * 1:100)
> > > par(c("omd", "fig", "plt", "usr"))
> > >
> > > The resulting plot shows that the corners of the are approximately
> > > 0.05 user coordinate units from the boundaries of the plot region.
> > > According to par, though, there is a margin around the plotting region
> > > that is clearly not symmetric and does not correspond to around 0.05
> > > units.
> > >
> > > If we use pairs(iris[1:2]) and repeat the rest, the corners are now
> > > 0.02 user coordinate units.  par provides the same information as
> > > before.
> > >
> > > So:
> > > 1. How do I figure out where coordinates I give to points will display
> > > on the figure?
> > > 2. More generally (for my own understanding), why does the par
> > > information not do what I expect?  Do I have some fundamental
> > > misunderstanding of the arrangement of plotting, figure, display, and
> > > margin regions within the device?  Is there a bug in pairs and/or par?
> > >
> > > I'm using R 2.5.1, and this behavior occurs on a fresh R console.
> > >
> > > Thanks!
> > >
> > > Oliver
> > >
> > >
> > >
> >
> >
>
>
> --
> Oliver Soong
> Donald Bren School of Environmental Science & Management
> University of California, Santa Barbara
> Santa Barbara, CA 93106-5131
> 805-893-7044 (office)
> 610-291-9706 (cell)
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] pairs, par
Gabor Grothendieck