[R] sizing non-vector point shapes in ggplot2

hadley wickham
Mon, 16 Jun 2008 14:55:46 -0000

On Mon, Jun 16, 2008 at 7:52 AM, mfrumin <michael at frumin.net>
wrote:
>
> Dear all,
>
> With normal plotting, one can size a set of points in a plot using a vector
> argument to cex in the points() function.  This works whether you are using
> one of the standard R symbols (i.e. 19+) or some ascii symbol, such as
'/'
>
> eg:
> plot(1:10, 1:10, type='n');
> points(1:10, 1:10, cex = 1:10, pch = '/')
>
> Trying to make the transition to ggplot2, I find that the aesthetic size
> mapping does not apply if i do geom_point(..., shape='/') -- the
points show
> up looking like '/' but they are not sized.  Is there anything to
do about
> this?
>
> eg:
> ggplot(data = data.frame(x = 1:10, y = 1:10, size = 1:10), aes(x = x, y
> y)) + geom_point(mapping = aes(size = size), shape = '/')
>
> the plot that I'm making really needs a vertically oriented mark, not a
> round-ish point/square/triangle that takes up a lot of area. am I totally
> out of luck?

Hmmm, I'd never noticed this "feature" of grid before.  To size
the
points, I'm using the size argument of grid.points, which doesn't seem
to affect the size of character based plotting symbols (because the
are using the fontsize graphical parameter).  I've cc'd Paul on this
email so he can confirm whether this is a bug or by design.

Regardless, you can make ggplot size the symbols correctly by running
the following code:

GeomPoint$draw <- function(., data, scales, coordinates, ...) {
    with(coordinates$transform(data),
      ggname(.$my_name(), pointsGrob(x, y, size=unit(size, "mm"),
pch=shape,
      gp=gpar(col=colour, fill = fill, fontsize = size * .pt)))
    )
  }

Hadley

--