[R] unexpected par('pin') behaviour

joerg van den hoff j.van_den_hoff at fz-rossendorf.de
Thu Jul 14 17:19:51 CEST 2005


Martin Maechler wrote:
>>>>>>"joerg" == joerg van den hoff <j.van_den_hoff at fz-rossendorf.de>
>>>>>>    on Wed, 13 Jul 2005 16:00:58 +0200 writes:
> 
> 
>     joerg> hi everybody,
>     joerg> I noticed the following: in one of my scripts 'layout' is used to 
>     joerg> generate a (approx. square) grid of variable dimensions (depending on 
>     joerg> no. of input files). if the no. of subplots (grid cells) becomes 
>     joerg> moderately large  (say > 9) I use a construct like
> 
>     joerg>   ###layout grid computation and set up occurs here###
>     joerg>   ...
>     joerg>   opar <- par(no.readonly = T);
>     joerg>   on.exit(par(opar))
>     joerg>   par(mar=c(4.1, 4.1, 1.1, .1))
>     joerg>   ###plotting occurs here####
>     joerg>   ...
> 
>     joerg> to reduce the figure margins to achieve a more
>     joerg> compact display. apart from 'mar' no other par()
>     joerg> setting is modified.
> 
> yet another example of using  par('no.readonly') when it's not
> needed and inefficient.

might be. but at least it is immune against modifying some more 'par' 
settings in the course of modfications  at some other place in the 
programm. inefficiency: should be at the ppm level of total cpu-usage in 
my case, :-). what's so bad with copying back and forth this moderately 
large vector?
> 
> Replacing the above by
> 
>     ###layout grid computation and set up occurs here###    
>     ...
>      op <- par(mar=c(4.1, 4.1, 1.1, .1))
>      on.exit(par(op))
>     ###plotting occurs here####
> 

> will be much more efficient and even solve your problem with "pin".
> 
right (solves the problem). I'll adopt this change for the time being. 
thank you.

> But then, yes, there might be another par() problem hidden in
> your code / example, 
> but unfortunately you have not specified reproducible code.
> 
> 
>     joerg> this works fine until the total number of subplots becomes too large 
>     joerg> ("large" depending on the current size of the X11() graphics device 
>     joerg> window, e.g. 7 x 6 subplots for the default size fo x11()).
> 
>     joerg> I then get the error message (only _after_ all plots are correctly 
>     joerg> displayed, i.e. obviously during execution of the above on.exit() call)
> 
>     joerg> Error in par(opar) :
>     joerg> invalid value specified for graphics parameter "pin"
> 
>     joerg> and par("pin") yields:
> 
>     joerg> [1]  0.34864 -0.21419
> 
> you mean *after* all the plotting ,  not the "pin" values in
> 'opar', right?

yes
> 
>     joerg> which indeed is invalid (negative 2nd component).
> 
>     joerg> I'm aware of this note from ?par:
> 
>     joerg> The effect of restoring all the (settable) graphics parameters as
>     joerg> in the examples is hard to predict if the device has been resized.
>     joerg> Several of them are attempting to set the same things in different
>     joerg> ways, and those last in the alphabet will win.  In particular, the
>     joerg> settings of 'mai', 'mar', 'pin', 'plt' and 'pty' interact, as do
>     joerg> the outer margin settings, the figure layout and figure region
>     joerg> size.
> 
> {{which shows you the known  but not widely known fact that
>   traditional par() based graphics are ``flawed by design''
>   and that's why there is the package "grid" for better 
>   designed graphics

... which seems to my simple mind a lot more complicated to come to 
terms with than the graphics package. I understand that grid is more 
powerful but the subset of functionality provided by 'graphics' seems 
more difficult to use in 'grid'. wrong or right?
> }}
> 
>     joerg> but my problem occurs without any resizing of the
>     joerg> x11() window prior to resetting par to par(opar).
> 
> It still would be interesting to get a reproducible example
> here, as the posting guide asks for.
> 
===========cut====================
graphics.off()

f <- function(n=7, m=6) {
    nm <- n*m
    layout(matrix(1:(nm),n,m))
    opar <- par(no.readonly = T)
    on.exit(par(opar))
    par(mar = c(4.1, 4.1, 1.1, 0.1))
    for (i in 1:nm) plot(i, pch=(i-1)%%25+1)
    layout(1)
}
f(5) #good
par('pin')
f()  #bad (at least for x11() default size)
par('pin')
===========cut====================
> Martin

thanks for bothering.
joerg
> 
> 
>     joerg> any ideas, what is going on?
> 
>     joerg> platform powerpc-apple-darwin7.9.0
>     joerg> arch     powerpc
>     joerg> os       darwin7.9.0
>     joerg> system   powerpc, darwin7.9.0
>     joerg> status   Patched
> 		    ^^^^^^^
> I hope that this is not the basic problem 
no, don't think so. that concerned the MacOS GUI, I believe.
> 
>     joerg> major    2
>     joerg> minor    1.0
>     joerg> year     2005
>     joerg> month    05
>     joerg> day      12
>     joerg> language R
> 
>     joerg> regards,
> 
>     joerg> joerg
> 
>




More information about the R-help mailing list