library(grImport) grid.moonPhase <- function(x, y, phase, size=unit(.05, "in")) { n <- 17 angle <- seq(0, 2*pi, length=n) xx <- x + cos(angle)*size yy <- y + sin(angle)*size if (phase == "New") fill <- "black" else fill <- "white" grid.polygon(xx, yy, gp=gpar(fill=fill)) if (phase == "1Q") grid.polygon(xx[(n/4):(n*3/4) + 1], yy[(n/4):(n*3/4) + 1], gp=gpar(fill="black")) if (phase == "3Q") grid.polygon(xx[c(1:(n/4 + 1), (n*3/4 + 1):n)], yy[c(1:(n/4 + 1), (n*3/4 + 1):n)], gp=gpar(fill="black")) } # grid.newpage() pushViewport(viewport(gp=gpar(cex=0.7)), plotViewport(c(4, 5, 3, 1)), dataViewport(as.numeric(lowTideDate), as.numeric(mainHours))) vectorMoon <- grImport::readPicture(system.file("extra", "comic_moon.ps.xml", package="RGraphics")) grImport::grid.picture(vectorMoon) grid.segments(unit(phases$date, "native"), 0, unit(phases$date, "native"), 1, gp=gpar(lty="dashed")) for (subset in list(1:13, 14:29, 30:31)) { grid.lines(lowTideDate[subset], lowTideHour[subset], default.units="native", gp=gpar(lwd=2)) grid.points(lowTideDate[subset], lowTideHour[subset], pch=16, size=unit(2, "mm")) } grid.rect(gp=gpar(fill=NA)) xTicks <- seq(min(lowTideDate), max(lowTideDate), by="week") grid.xaxis(at=xTicks, label=format(xTicks, "%b %d")) grid.yaxis(at=mainHours, label=format(mainHours, "%H:%M")) grid.text("Time of Low Tide (NZDT)", x=unit(-4, "lines"), rot=90) grid.text("Auckland, New Zealand January 2010", y=unit(-3, "lines")) grid.xaxis(main=FALSE, at=phases$date, label=FALSE) for (i in 1:nrow(phases)) grid.moonPhase(unit(phases$date[i], "native"), unit(1, "npc") + unit(1, "lines"), phases$phase[i]) grid.text("Phases of the Moon", y=unit(1, "npc") + unit(2, "lines")) popViewport(2)