Marc Girondot
2017-Jul-26 09:29 UTC
[R] axis() after image.plot() does not work except if points() is inserted between
Thanks... I agree that the problem was explained in the documentation but I can't find a way to have axis() working even manipulating par("plt") or with graphics.reset = TRUE: - adding graphics.reset=TRUE does not allow axis() to be shown; - I see that par()$plt is involved but it is the not sufficient to explain why axis() works because if it is changed by hand, axes are not shown. Thanks for the trick about range(). I didn't notice that it has also a na.rm option. It is more elegant. Here is the code showing the various propositions and checks: library(fields) D <- matrix(c(10, 20, 25, 30, 12, 22, 32, 35, 13, 25, 38, 40), nrow=3) (pplt <- par()$plt) #### [1] 0.08844944 0.95469663 0.14253275 0.88541485 # original problem. Axis() not shown image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), las=1, axes=FALSE) # Check the value of par()$plt; it is indeed modified par()$plt #### [1] 0.08844944 0.86408989 0.14253275 0.88541485 # axis() does not work axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, cex.axis=0.5) # I restore par("plt") to it original value par(plt=pplt) # graphics.reset = TRUE. Axis() not shown par()$plt ### [1] 0.08844944 0.95469663 0.14253275 0.88541485 image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), las=1, axes=FALSE, graphics.reset = TRUE) # Check an effect on par()$plt. Indeed with graphics.reset = TRUE par()$plt is restored par()$plt ### [1] 0.08844944 0.95469663 0.14253275 0.88541485 # But the axes at not shown axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, cex.axis=0.5) # Check an effect of points() on par()$plt # There is an effect # axes are shown par()$plt ### [1] 0.08844944 0.95469663 0.14253275 0.88541485 image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), las=1, axes=FALSE) points(1.5, 1.5, type="p") par()$plt ### [1] 0.08844944 0.86408989 0.14253275 0.88541485 axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, cex.axis=0.5) # Try to reproduce the effect of points() on par()$plt # axes are not shown. Then points() is doing something else ! image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), las=1, axes=FALSE) par(plt=c(0.08844944, 0.86408989, 0.14253275, 0.88541485)) axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, cex.axis=0.5) # check that par("plt") is correctly setup par()$plt ### [1] 0.08844944 0.86408989 0.14253275 0.88541485 I think that it will remain a mystery ! At least the trick with points() is working. Thanks Marc Le 25/07/2017 ? 13:03, Martin Maechler a ?crit :>>>>>> Marc Girondot via R-help <r-help at r-project.org> >>>>>> on Mon, 24 Jul 2017 09:35:06 +0200 writes: > > Thanks for the proposition. As you see bellow, par("usr") is the same > > before and after the points() (the full code is bellow): > > .... > >> par("usr") > > [1] -0.2500000 1.2500000 -0.1666667 1.1666667 > >> # if you remove this points() function, axis will show nothing. > >> > >> points(1.5, 1.5, type="p") > >> p2 <- par(no.readonly=TRUE) > >> par("usr") > > [1] -0.2500000 1.2500000 -0.1666667 1.1666667 > > ... > > > I can reproduce it in Ubuntu and MacosX R Gui and Rstudio (R 3.4.1). > > > Marc > > > Here is the code: > > library(fields) > > par(mar=c(5,4.5,4,7)) > > D <- matrix(c(10, 20, 25, 30, 12, 22, 32, 35, 13, 25, 38, 40), nrow=3) > > > p0 <- par(no.readonly=TRUE) > > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", > > ylab="Columns", cex.lab = 0.5, > > zlim=c(min(D, na.rm=TRUE),max(D, na.rm=TRUE)), > > las=1, axes=FALSE) > > p1 <- par(no.readonly=TRUE) > > > par("usr") > > par("xpd") > > > # if you remove this points() function, axis will show nothing. > > > points(1.5, 1.5, type="p") > > p2 <- par(no.readonly=TRUE) > > par("usr") > > par("xpd") > > > ########## > > axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) > > axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, > > cex.axis=0.5) > > > identical(p1, p2) > > Have you ever carefully read the detailed help page about image.plot()? > > I haven't, but a cursory reading already shows me that the > author of the function did this partly on purpose: > > > Side Effects: > > > > After exiting, the plotting region may be changed to make it > > possible to add more features to the plot. To be explicit, > > ?par()\$plt? may be changed to reflect a smaller plotting region > > that has accommodated room for the legend subplot. > > Unfortunately, there it does _not_ mention the following : > > >From looking at its code, and then re-reading parts of the help page, > I see that there is a 'graphics.reset' argument which you can > set to TRUE in such a case: > > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", > ylab="Columns", cex.lab = 0.5, > zlim= range(D, na.rm=TRUE), > graphics.reset = TRUE, # <<<<< the solution > las=1, axes=FALSE) > > Also note that > zlim = range(D ...) > is infinitely more elegant than > zlim = c(min((D, ...), max(D, ...))) > > > Martin Maechler > ETH Zurich (and R core) >
Paul Murrell
2017-Jul-28 03:32 UTC
[R] [FORGED] Re: axis() after image.plot() does not work except if points() is inserted between
Hi I believe this is a clipping bug in the 'graphics' package. A simpler version of the problem is this ... plot(1:10) mtext("margin-label", side=2, at=9, las=1, line=1, adj=0) par(mfg=c(1,1)) ## Only the text within the plot region is drawn mtext("margin-label", side=2, at=9, las=1, line=1, adj=0, col="red") I have committed a fix to the development version of R (r72982). Paul On 26/07/17 21:29, Marc Girondot via R-help wrote:> Thanks... I agree that the problem was explained in the documentation > but I can't find a way to have axis() working even manipulating > par("plt") or with graphics.reset = TRUE: > - adding graphics.reset=TRUE does not allow axis() to be shown; > - I see that par()$plt is involved but it is the not sufficient to > explain why axis() works because if it is changed by hand, axes are not > shown. > > Thanks for the trick about range(). I didn't notice that it has also a > na.rm option. It is more elegant. > > Here is the code showing the various propositions and checks: > > > library(fields) > D <- matrix(c(10, 20, 25, 30, 12, 22, 32, 35, 13, 25, 38, 40), nrow=3) > (pplt <- par()$plt) > #### [1] 0.08844944 0.95469663 0.14253275 0.88541485 > > # original problem. Axis() not shown > > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", > ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), > las=1, axes=FALSE) > # Check the value of par()$plt; it is indeed modified > par()$plt > #### [1] 0.08844944 0.86408989 0.14253275 0.88541485 > # axis() does not work > axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) > axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, > cex.axis=0.5) > > # I restore par("plt") to it original value > par(plt=pplt) > > # graphics.reset = TRUE. Axis() not shown > > par()$plt > ### [1] 0.08844944 0.95469663 0.14253275 0.88541485 > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", > ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), > las=1, axes=FALSE, graphics.reset = TRUE) > # Check an effect on par()$plt. Indeed with graphics.reset = TRUE > par()$plt is restored > par()$plt > ### [1] 0.08844944 0.95469663 0.14253275 0.88541485 > # But the axes at not shown > axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) > axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, > cex.axis=0.5) > > # Check an effect of points() on par()$plt > # There is an effect > # axes are shown > > par()$plt > ### [1] 0.08844944 0.95469663 0.14253275 0.88541485 > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", > ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), > las=1, axes=FALSE) > points(1.5, 1.5, type="p") > par()$plt > ### [1] 0.08844944 0.86408989 0.14253275 0.88541485 > axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) > axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, > cex.axis=0.5) > > # Try to reproduce the effect of points() on par()$plt > # axes are not shown. Then points() is doing something else ! > > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", > ylab="Columns", cex.lab = 0.5, zlim=range(D, na.rm=TRUE), > las=1, axes=FALSE) > par(plt=c(0.08844944, 0.86408989, 0.14253275, 0.88541485)) > axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, cex.axis=0.5) > axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, > cex.axis=0.5) > # check that par("plt") is correctly setup > par()$plt > ### [1] 0.08844944 0.86408989 0.14253275 0.88541485 > > I think that it will remain a mystery ! > At least the trick with points() is working. > > Thanks > Marc > > > Le 25/07/2017 ? 13:03, Martin Maechler a ?crit : >>>>>>> Marc Girondot via R-help <r-help at r-project.org> >>>>>>> on Mon, 24 Jul 2017 09:35:06 +0200 writes: >> > Thanks for the proposition. As you see bellow, par("usr") is >> the same >> > before and after the points() (the full code is bellow): >> > .... >> >> par("usr") >> > [1] -0.2500000 1.2500000 -0.1666667 1.1666667 >> >> # if you remove this points() function, axis will show nothing. >> >> >> >> points(1.5, 1.5, type="p") >> >> p2 <- par(no.readonly=TRUE) >> >> par("usr") >> > [1] -0.2500000 1.2500000 -0.1666667 1.1666667 >> > ... >> >> > I can reproduce it in Ubuntu and MacosX R Gui and Rstudio (R >> 3.4.1). >> >> > Marc >> >> > Here is the code: >> > library(fields) >> > par(mar=c(5,4.5,4,7)) >> > D <- matrix(c(10, 20, 25, 30, 12, 22, 32, 35, 13, 25, 38, 40), >> nrow=3) >> >> > p0 <- par(no.readonly=TRUE) >> > image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", >> > ylab="Columns", cex.lab = 0.5, >> > zlim=c(min(D, na.rm=TRUE),max(D, na.rm=TRUE)), >> > las=1, axes=FALSE) >> > p1 <- par(no.readonly=TRUE) >> >> > par("usr") >> > par("xpd") >> >> > # if you remove this points() function, axis will show nothing. >> >> > points(1.5, 1.5, type="p") >> > p2 <- par(no.readonly=TRUE) >> > par("usr") >> > par("xpd") >> >> > ########## >> > axis(1, at=seq(from=0, to=1, length=nrow(D)), labels=0:2, >> cex.axis=0.5) >> > axis(2, at=seq(from=0, to=1, length=ncol(D)), labels=0:3, las=1, >> > cex.axis=0.5) >> >> > identical(p1, p2) >> >> Have you ever carefully read the detailed help page about image.plot()? >> I haven't, but a cursory reading already shows me that the >> author of the function did this partly on purpose: >> >> > Side Effects: >> > >> > After exiting, the plotting region may be changed to make it >> > possible to add more features to the plot. To be explicit, >> > ?par()\$plt? may be changed to reflect a smaller plotting >> region >> > that has accommodated room for the legend subplot. >> >> Unfortunately, there it does _not_ mention the following : >> >> >From looking at its code, and then re-reading parts of the help page, >> I see that there is a 'graphics.reset' argument which you can >> set to TRUE in such a case: >> >> image.plot(D, col=rev(heat.colors(128)),bty="n", xlab="Lines", >> ylab="Columns", cex.lab = 0.5, >> zlim= range(D, na.rm=TRUE), >> graphics.reset = TRUE, # <<<<< the solution >> las=1, axes=FALSE) >> >> Also note that >> zlim = range(D ...) >> is infinitely more elegant than >> zlim = c(min((D, ...), max(D, ...))) >> >> >> Martin Maechler >> ETH Zurich (and R core) >> > > ______________________________________________ > 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.-- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 paul at stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/
Marc Girondot
2017-Jul-31 06:25 UTC
[R] [FORGED] Re: axis() after image.plot() does not work except if points() is inserted between
Le 28/07/2017 ? 05:32, Paul Murrell a ?crit :> plot(1:10) > mtext("margin-label", side=2, at=9, las=1, line=1, adj=0) > par(mfg=c(1,1)) > ## Only the text within the plot region is drawn > mtext("margin-label", side=2, at=9, las=1, line=1, adj=0, col="red") >It works also for axis(). Thanks a lot. Marc
Maybe Matching Threads
- axis() after image.plot() does not work except if points() is inserted between
- axis() after image.plot() does not work except if points() is inserted between
- axis() after image.plot() does not work except if points() is inserted between
- axis() after image.plot() does not work except if points() is inserted between
- axis() after image.plot() does not work except if points() is inserted between