Hi


Sean Davis wrote:
All,

I have a simple plot(x,y) and I would like to then insert rectangles of some length (in native coordinates) and height fixed to 0.5 in native coordinates. I can't quite get the code right to do this. Can anyone give me a quick example of how to do this? I looked the gridBase index and the tutorial (from R-news?) but just haven't gotten it down yet.

 > plot(1:10,1:10)
 > par(new=T);vps <- baseViewports()
 > pushViewport(vps$inner,vps$figure,vps$plot)
viewport[GRID.VP.28]


At this point you are within a viewport which has x- and y-scales corresponding to the plot(1:10, 1:10).


 > pushViewport(viewport(x=unit(1,"native"),y=unit(2,"native")))
viewport[GRID.VP.29]


You have just created a new viewport at location (1, 2) in the plot, but the scales on this new viewport are the default (0, 1). i.e., you are now in a completely different coordinate system. Also, this new viewport is as wide and as high as the plot region -- for example, it extends well beyong the left edge of the window/page.


grid.rect(height=unit(0.5,"native"),width=unit(1.5,"native"),just='botto m')


This draws a rectangle half as high as the current viewport and 1.5 times as wide (the native scale in the current viewport is (0, 1) in both dimensions). Importantly, the "native" coordinate systems you are referring to no longer correspond to the scales on the plot.


This draws a very large rectangle going from 2 to 7 (y) and to 8 (x).


Three things:

(i) If drawing rectangles relative to the current "native" (or user) coordinates is all you want to do then you could just use rect() and ignore gridBase altogether. For example, ...

x <- sample(1:10, 10)
y <- 1:10
w <- runif(10)
h <- 0.5

plot(1:10,1:10)
rect(x - w/2, y - h/2, x + w/2, y + h/2)


(ii) Using grid and gridBase, the above example becomes ...

plot(1:10,1:10)
par(new=T);vps <- baseViewports()
pushViewport(vps$inner,vps$figure,vps$plot)
grid.rect(x=x, y=y, width=w, height=h, default.units="native")
popViewport(3)

... but as mentioned, this is like using a sledge hammer to kill a cat or whatever the expression is.

(iii) There would be justification in using grid and gridBase if you want to draw more than just a rectangle, especially if you want to use coordinates other than native. Here's a trivial example (adds fixed size "whiskers" to the corners of the rectangles) ...

plot(1:10,1:10)
par(new=T);vps <- baseViewports()
pushViewport(vps$inner,vps$figure,vps$plot)
for (i in 1:10) {
  pushViewport(viewport(x=x[i], y=y[i], width=w[i], height=h,
                        default.units="native"))
  grid.rect()
  grid.segments(0, 0, unit(-1, "mm"), unit(-1, "mm"))
  grid.segments(0, 1, unit(-1, "mm"),
                unit(1, "npc") + unit(1, "mm"))
  grid.segments(1, 1,
                unit(1, "npc") + unit(1, "mm"),
                unit(1, "npc") + unit(1, "mm"))
  grid.segments(1, 0,
                unit(1, "npc") + unit(1, "mm"),
                unit(-1, "mm"))
  popViewport()
}

... (but pushing a viewport per data point like this is a LOT slower).

Hope that helps

Paul
--
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
[EMAIL PROTECTED]
http://www.stat.auckland.ac.nz/~paul/

______________________________________________
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to