Skip to content

A question on grid - grid.points not spaced properly

6 messages · Paul Murrell, Saptarshi Guha

#
Hello,
	How can i 'fix' the following output.

	v=viewport(x=216/2, y=216/2,w=216, h=216,default.units = "bigpts")
	pushViewport(v)
	x=c(119,130,140,151)
	y=c(124,124,124,124)
	grid.points(x,y,size=unit(1,"bigpts"),default.units="bigpts",pch=".")
	grid.points(x-2,y,size=unit(1,"bigpts"),default.units="bigpts",pch=".")
	grid.points(x+2,y,size=unit(1,"bigpts"),default.units="bigpts",pch=".")
	grid.points(x,y-2,size=unit(1,"bigpts"),default.units="bigpts",pch=".")
	grid.points(x,y+2,size=unit(1,"bigpts"),default.units="bigpts",pch=".")


	One would expect to get a 4 figures composed of 5 dots each  - 2  
vertically spaced and 2 horizontally spaced symmetrically around the  
center dot.
	However i seem to get odd results - e.g on Quartz(OS X) output, the  
last command, places the dot bang next to the center dot.
	On 'jpeg' output with higest quality, this oddity happens with the 'x 
+2' command.

	This doesn't happen to all of the points, only some - and not necc.  
the edge figures.

	Is there anyway i can control this?
	Thanks
	Saptarshi

Saptarshi Guha | sapsi at pobox.com | http://www.stat.purdue.edu/~sguha
#
Hi
Saptarshi Guha wrote:
I think you are seeing a rasterization effect.  Both on screen and in a
bitmap format you are essentially turning on a single pixel at a time.
The locations you are giving do not necessarily correspond to an exact
pixel location (bigpoints are in 1/72 inches, but your screen might have
a resolution of 96 ppi) so you just get the nearest pixel to that
location.  So the gap you specify of two bigpoints sometimes comes out
as 2 pixels, sometimes as 1 pixel (for example).

For comparison, try running your code on a PDF (or other vector format)
device;  the result is much more what you are expecting I think.

Paul

  
    
#
Hi,
    Thank you for the explanation. I have one further question - should 
i wish to plot to the screen, which units (apart from bigpts) for exact 
plotting.
Essentially i wish to create my own plotting character - hence the 
pch="." and the surrounding dots - so it would be nice if i could place 
the surrounding dots exactly.
    Thank you
    Saptarshi Guha
Paul Murrell wrote:
#
Hi
Saptarshi Guha wrote:
R graphics is a vector system rather than a raster system, which means
that all locations and dimensions are effectively on an infinite
resolution device.  There are no "pixels" to refer to.  So you are
already placing the dots exactly.

When graphics are rendered by a specific device, there will be rounding
if the device is raster (e.g., screen).  So not all devices can render
your dots exactly.

If you know that your plotting character will only be rendered on a
raster device, "native" coordinates in the top-level grid viewport refer
(approximately) to pixels, e.g.,
just=c("left", "bottom"))
just=c("left", "bottom"))
just=c("left", "bottom"))

but you can still get rounding problems and these coordinates are not
available in any other grid viewport.

In other words, you cannot predict exactly which pixels will get turned
on when you draw something on screen with R graphics.

If it's any consolation, this is true of the predefined plotting symbols
too!  (do all the plusses look the same on screen?)

plot(1:10, 1:10, pch=3)

Paul

p.s.  An exercise for the reader:  why do all of these plusses look the
same on screen?

plot(1:10, 1:10, pch="+")

  
    
#
Hi,
	Thank you for the detailed explanation.
True. Its good to be aware of the structure of R graphics. Have been  
planning to pick up the Grid book.
Is this because we are getting the system/device font renderer(e.g  
the postscript renderer, OS X font renderer)
to draw the character "+" so the widths/height will be exactly  
measure, but R is drawing itself when doing pch=3 ?

Thanks
Saptarshi

Saptarshi Guha | sapsi at pobox.com | http://www.stat.purdue.edu/~sguha
On Dec 5, 2006, at 3:58 PM, Paul Murrell wrote:

            
#
Hi
Saptarshi Guha wrote:
Yep.  (Slightly more accurately, it's the difference between getting the
system to draw a couple of lines and getting the system to draw a
character from a font.)  Which suggests that if you want to design a new
plotting symbol that looks good everywhere, all you have to do is design
a new font! :)

Paul