hi everybody,
I noticed the following: in one of my scripts 'layout' is used to
generate a (approx. square) grid of variable dimensions (depending on
no. of input files). if the no. of subplots (grid cells) becomes
moderately large (say > 9) I use a construct like
###layout grid computation and set up occurs here###
...
opar <- par(no.readonly = T);
on.exit(par(opar))
par(mar=c(4.1, 4.1, 1.1, .1))
###plotting occurs here####
...
to reduce the figure margins to achieve a more compact display. apart
from 'mar' no other par() setting is modified.
this works fine until the total number of subplots becomes too large
("large" depending on the current size of the X11() graphics device
window, e.g. 7 x 6 subplots for the default size fo x11()).
I then get the error message (only _after_ all plots are correctly
displayed, i.e. obviously during execution of the above on.exit() call)
Error in par(opar) :
invalid value specified for graphics parameter "pin"
and par("pin") yields:
[1] 0.34864 -0.21419
which indeed is invalid (negative 2nd component).
I'm aware of this note from ?par:
The effect of restoring all the (settable) graphics parameters as
in the examples is hard to predict if the device has been resized.
Several of them are attempting to set the same things in different
ways, and those last in the alphabet will win. In particular, the
settings of 'mai', 'mar', 'pin', 'plt' and 'pty' interact, as do
the outer margin settings, the figure layout and figure region
size.
but my problem occurs without any resizing of the x11() window prior to
resetting par to par(opar).
any ideas, what is going on?
platform powerpc-apple-darwin7.9.0
arch powerpc
os darwin7.9.0
system powerpc, darwin7.9.0
status Patched
major 2
minor 1.0
year 2005
month 05
day 12
language R
regards,
joerg
unexpected par('pin') behaviour
5 messages · Joerg van den Hoff, Martin Maechler
"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.
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".
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?
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
}}
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.
Martin
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
joerg> major 2
joerg> minor 1.0
joerg> year 2005
joerg> month 05
joerg> day 12
joerg> language R
joerg> regards,
joerg> joerg
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
Thank you, Joerg, for the reproducable example
"joerg" == joerg van den hoff <j.van_den_hoff at fz-rossendorf.de>
on Thu, 14 Jul 2005 17:19:51 +0200 writes:
......................
......................
joerg> ===========cut====================
joerg> graphics.off()
joerg> f <- function(n=7, m=6) {
joerg> nm <- n*m
joerg> layout(matrix(1:(nm),n,m))
joerg> opar <- par(no.readonly = T)
joerg> on.exit(par(opar))
joerg> par(mar = c(4.1, 4.1, 1.1, 0.1))
joerg> for (i in 1:nm) plot(i, pch=(i-1)%%25+1)
joerg> layout(1)
joerg> }
joerg> f(5) #good
joerg> par('pin')
joerg> f() #bad (at least for x11() default size)
joerg> par('pin')
joerg> ===========cut====================
which I can simplify to
graphics.off()
layout(matrix(1:42,7,6))
par("pin")
## [1] 0.2918620 -0.2974408 --- when using x11() "default"
clearly a bug in layout() {which I'll file}
and it seems to me, one that is not shared by
par(mfrow= / mfcol=) settings.
Martin Maechler, ETH Zurich
"MM" == Martin Maechler <maechler at stat.math.ethz.ch>
on Fri, 15 Jul 2005 14:36:16 +0200 writes:
............
MM> which I can simplify to
MM> graphics.off()
MM> layout(matrix(1:42,7,6))
MM> par("pin")
MM> ## [1] 0.2918620 -0.2974408 --- when using x11() "default"
MM> clearly a bug in layout() {which I'll file}
exploring more before filing a bug report,
I've now seen that this *NO BUG* of layout()
but rather of the ``design bug'' of old-style graphics which
bites here.
MM> and it seems to me, one that is not shared by
MM> par(mfrow= / mfcol=) settings.
That's wrong, since
postscript(paper="a4")
par(mfrow=c(7,6))
par("pin")
## [1] 1.0470855 -0.1047263
and when plot() you get message about margins being too wide.
Only after something like
par(mar= rep(1,4))
you get both valid "pin" and can plot properly.
That's nothing new and not really astonishing,
...
Martin Maechler, ETH Zurich