Dear all,

I feel like I've been reinventing the wheel with this code (implementing type = 'b' for Grid graphics),

http://econum.umh.ac.be/rwiki/doku.php?id=tips:graphics-grid:linesandpointsgrob

Has anyone here attempted this with success before? I found suggestions of overlapping large white points to mask the lines but it's not ideal.

I welcome any comments on the code. (e.g., should it perhaps use polylines rather than segments?, is there an obvious optimization to make?, ...)

Regards,

baptiste



# code reproduced below,

barbedGrob <- function( x = 1:10/12,
                       y = sin(1:10)/3+0.5,
                       size=1, shape=21, space=1,
                       colour="red", fill="blue",
                       linetype=1, linewidth=1){


n <- length(x)

dx <- diff(x)
dy <- diff(y)

# duplicate the points to make split segments
new.x <- rep(x, each=2)[-c(1, 2*length(x))]
new.y <- rep(y, each=2)[-c(1, 2*length(y))]
new.size <- rep(size, each=2, length=2*n)[-c(1, 2*n)]

length <- sqrt(dx^2 + dy^2) # length of initial segments
exclusion <- 0.5*space*convertX(unit(new.size, "char"), "npc", TRUE)

scaling <- exclusion / rep(length, each=2) # exclusion factor around each point

start <- seq(1, by=2, length(new.x)) # starting points
end <- seq(2, by=2, length(new.x)) # end points

x.start <- scaling[start] * dx[(start+1)/2] + new.x[start] # shift the points y.start <- scaling[start] * dy[(start+1)/2] + new.y[start] # keeping the direction of the initial segments

x.end <- new.x[end] - scaling[end] * dx[end/2]
y.end <- new.y[end] - scaling[end] * dy[end/2]

grob.lines <- segmentsGrob(
   x0 = x.start, y0 = y.start,
   x1 = x.end, y1=y.end,
    default.units="native",
gp = gpar(
  col = colour,
  lex = linewidth, lty = linetype, lineend = "butt"
)
)

grob.points <- pointsGrob(x, y, pch=shape, size=unit(size, "char"),
   gp = gpar(
     col = colour,
     fill = fill,
     lex = linewidth, linejoin = "mitre"
   )
)

  gTree(children = gList(grob.lines,grob.points))

}



# example of use
g <-
barbedGrob(size=sample(1:3, 10, repl=T),
   fill=alpha("white", 0.3),
   col=alpha("cadetblue4", 0.8),
   linewidth=5, space=1.2)
pushViewport(vp=viewport(width=1, height=1))
grid.rect(gp=gpar(fill="thistle2"))
grid.grill(gp=gpar(col="lavenderblush1", lwd=3, lty=3))
grid.draw(g)



--
_____________________________

Baptiste AuguiƩ

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to